如果只想看结论,请跳转到最后,如果想看看这其中的曲折历程那就按照正常的流程就好了。
不要问我为什么会写这么奇葩的博客问题,因为我这是被客户的应用给揉捏的啊。我们的终端是Android 64位的,然后客户提供了一个应用说怎么在我们的终端上运行不了!好吗,那就适配一下就好了吗,可是客户一口肯定的说适配了64位的so库,是我们提供的api接口有问题。尼玛,客户是上帝没有办法,只能拿出强硬的证据来说服对方了。
既然客户说适配了,我们也不反驳我们先强制应用以32位运行看看是否OK,如果以32位运行OK的话那么就是客户应用没有适配64的so库,而不是我们api的问题了。本来想着直接修改固件,然后以32位的方式安装的,但是无意间发现adb install已经支持以32位还是64位安装的了。好吗,Android的妈咪,谷歌为我们想得太周到了。
先上命令格式如下:
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:/ #
先上命令格式如下:
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位运行:
adb install --abi armeabi-v7a <path to apk>
adb install --abi arm64-v8a <path to apk>
adb install --abi <path to apk>