Android adb安装时强制应用App以32位或者64位运行



前言

  如果只想看结论,请跳转到最后,如果想看看这其中的曲折历程那就按照正常的流程就好了。
  不要问我为什么会写这么奇葩的博客问题,因为我这是被客户的应用给揉捏的啊。我们的终端是Android 64位的,然后客户提供了一个应用说怎么在我们的终端上运行不了!好吗,那就适配一下就好了吗,可是客户一口肯定的说适配了64位的so库,是我们提供的api接口有问题。尼玛,客户是上帝没有办法,只能拿出强硬的证据来说服对方了。




一. 问题定位

  既然客户说适配了,我们也不反驳我们先强制应用以32位运行看看是否OK,如果以32位运行OK的话那么就是客户应用没有适配64的so库,而不是我们api的问题了。本来想着直接修改固件,然后以32位的方式安装的,但是无意间发现adb install已经支持以32位还是64位安装的了。好吗,Android的妈咪,谷歌为我们想得太周到了。


1.1 应用以32位在64位终端环境下运行

  先上命令格式如下:

adb install --abi armeabi-v7a <path to apk>

  将测试应用以如上命令安装成功以后,可以看到在64位终端上面是以32位运行,然后测试功能一切正常。

130|XXX:/ # getprop ro.product.cpu.abilist
arm64-v8a,armeabi-v7a,armeabi
XXX:/ # ps | grep zygote
root      816   1     2172512 83356 poll_sched 0000000000 S zygote64
root      827   1     1599320 71068 poll_sched 0000000000 S zygote
XXX:/ # ps -t | grep 827
root      827   1     1599320 71068 poll_sched 0000000000 S zygote
root      3332  827   1599320 71068 futex_wait 0000000000 S ReferenceQueueD
root      3333  827   1599320 71068 futex_wait 0000000000 S FinalizerDaemon
root      3334  827   1599320 71068 futex_wait 0000000000 S FinalizerWatchd
root      3335  827   1599320 71068 futex_wait 0000000000 S HeapTaskDaemon
system    1827  1686  2403208 152096 SyS_epoll_ 0000000000 S notification-sq
u0_a30    2403  827   1019576 44328 SyS_epoll_ 0000000000 S com.xxx.pinyinime
system    2501  827   1016016 37560 SyS_epoll_ 0000000000 S com.xxx.verify
u0_a3     2827  2818  1591064 50172 futex_wait 0000000000 S FinalizerWatchd
u0_a12    3207  827   1679792 39116 SyS_epoll_ 0000000000 S org.codeaurora.gallery
u0_a39    3331  827   1790700 115468 SyS_epoll_ 0000000000 S com.dhc.sass.pos.tobacco
XXX:/ #

在这里插入图片描述


### 1.2 应用以64位在64位终端环境下运行   先上命令格式如下:
adb install --abi arm64-v8a <path to apk>

  将测试应用以如上命令安装成功以后,可以看到在64位终端上面是以64位运行,然后测试so奔溃,证明了是客户的应用没有适配64的so库。

127|XXX:/ # getprop ro.product.cpu.abilist
arm64-v8a,armeabi-v7a,armeabi
XXX:/ # ps -t | grep com.dhc.sass.pos.tobacco
u0_a40    3512  816   2372700 154888 SyS_epoll_ 0000000000 S com.dhc.sass.pos.tobacco
XXX:/ # ps -t | grep zygote64
root      816   1     2172512 83364 poll_sched 0000000000 S zygote64
XXX:/ #

在这里插入图片描述




二. 解决问题

  虽然定位了问题,但是客户依然强势的说,这个我们不会适配的,那么就只能是固件去适配客户的应用,强制安装的时候以32位进行安装了。至于应用的安装是PackageManagerService服务进行操作的,我们也是在这里修改了,具体的逻辑如下所示:

diff --git a/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index 122c0cd..ceb4f08 100755
--- a/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -386,7 +386,7 @@ public class PackageManagerService extends IPackageManager.Stub {
     // user, but by default initialize to this.
     static final boolean DEBUG_DEXOPT = false;
 
-    private static final boolean DEBUG_ABI_SELECTION = false;
+    private static final boolean DEBUG_ABI_SELECTION = true;
     private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE;
     private static final boolean DEBUG_TRIAGED_MISSING = false;
     private static final boolean DEBUG_APP_DATA = false;
@@ -9513,8 +9513,18 @@ public class PackageManagerService extends IPackageManager.Stub {
                 }
 
             } else {
-                String[] abiList = (cpuAbiOverride != null) ?
+                // xxx use 32bit abi for BCMZJYC
+                boolean use32bitAbi = SystemProperties.getBoolean("persist.sys.use32bitAbi", false) ||
+                    "BCMZJYC".equals(SystemProperties.get("persist.sys.CRT.OWNER", ""));
+                String[] abiList = null;
+                if (use32bitAbi) {
+                    Slog.w(TAG, "use32bitAbi");
+                    abiList = (cpuAbiOverride != null) ?
+                        new String[] { cpuAbiOverride } : Build.SUPPORTED_32_BIT_ABIS;
+                } else {
+                    abiList = (cpuAbiOverride != null) ?
                         new String[] { cpuAbiOverride } : Build.SUPPORTED_ABIS;
+                }
 
                 // Enable gross and lame hacks for apps that are built with old
                 // SDK tools. We must scan their APKs for renderscript bitcode and




写在最后

  如上就是今天的全部内容了,主要是一篇实战的文章。没有很多理论的讲解的,但是其中也涉及了很多理论知识,这里就不做过多讲解。好了各位江湖见!
  最后还是总结下,adb安装时如何指定在ARM环境下以32位还是64位运行:

  • 要想指定应用在64位终端下以32位方式模式下运行,可以使用如下命令:
adb install --abi armeabi-v7a <path to apk>
  • 要想指定应用在64位终端下以64位方式模式下运行,可以使用如下命令:
adb install --abi arm64-v8a <path to apk>
  • 如果是其他的Android平台,譬如X86或者其它的,可以使用如下命令:
adb install --abi <path to apk>
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐