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>

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

  1. 利用Android adb命令来测试手机App的耗电量

    使用Android adb命令实现wifi方式连接手机 因为要通过adb命令来监控手机的耗电量,所以建议通过wifi的方式来连接手机,而不是用usb线来连接手机设备.usb方式连接手机会自动给手机充电 ...

  2. Android adb 安装 apk无法安装错误排查

    Android adb 安装 apk无法安装错误排查 过程描述 用锤子安装一个apk包,死活安装不上,直接安装apk报错[apk包解析错误],然后换成apk安装,adb报安装失败 但是nuex模拟器和 ...

  3. 【Android Studio 3.5.3】安装编译环境,Android adb 安装及使用

    Android Studio安装 1.下载 android studio,直接上官网下载(下载速度超快):https://developer.android.google.cn/studio/ 2.安 ...

  4. 爱奇艺App架构升级之路——64位适配探索与实践

    背  景 随着手机硬件的不断发展,近两年的新式手机已经全部采用了64位CPU,64位真的比32位快吗?实际上32位和64位的差异主要体现在内存寻址上,32位最高只支撑4GB内存,而64位则能够最高支撑 ...

  5. 如何检测Android应用是32位还是64位

    目录 1.前言 2.检测App 3.应用是否包含 64 位库? 1.前言 从Android 4.4宣布支持64位系统以来,各终端方案厂商逐步推出了各自的64位soc解决方案.Google为了兼容之前3 ...

  6. Android判断CPU是32位还是64位

    Android系统判断CPU是32位还是64位 方法一: 命令行中输入以下命令 adb shell getprop ro.product.cpu.abi 这样可以直接获取cpu处理器位数: armea ...

  7. 如何让ios app支持32位和64位?

    将ios app转换为兼容32位和64位步骤:  1. 安装 Xcode 5.  2. 打开你的项目.Xcode会提示你更新你的项目,其中的警告和错误信息对于转换到64位相当重要.  3. 将你的项目 ...

  8. mysql下载64位 win7_win7 64位安装MySQL 绝对经典

    windows 7 64位下配置mysql64位免安装版 1.官方网站下载mysql-5.6.10-winx64.zip 这里也可以下载 http://xiazai.zol.com.cn/detail ...

  9. 无法安装X64 在计算机找到X32,怎么看电脑适合装32位还是64位

    [怎么看电脑适合装32位还是64位]如何判断电脑适合装32位的系统还是64位的 官方推荐最低配置要求:处理器:1GHz32位或者64位处理器内存:1GB及以上显卡:支持DirectX 9128M及以上 ...

最新文章

  1. Windows7下最新Android开发环境搭建(JDK1.7 + Eclipse Indigo(3.7) + SDK-r12 + ADT-12)
  2. Linux驱动编程 step-by-step (十) Linux 内核链表
  3. python3.0 数据类型、万恶的编码、文件操作
  4. linux彻底卸载xfce,Ubuntu12.04LTS下如何安装和彻底卸载xfce4?
  5. h3c 虚拟服务器 下一跳,H3C vLNS系列虚拟L2TP网络服务器 配置指导-E0324-5W100
  6. Echarts数据grid直角坐标系(xAxis、yAxis)详解
  7. web安全day10:通过实验理解windows域的OU和GPO
  8. dms mysql 工具_数据库管理工具DMS
  9. Word分栏在排版中的应用
  10. 一个k8s集群——跨云服务器部署
  11. 计算机发展历史小报图片大全,【科技小报图片大全】科技小报简单又漂亮_科技小报内容资料大全_(2)_亲亲宝贝网...
  12. 有关于进程,线程and协程
  13. C++中使用placement new
  14. 解决 这些文件可能对你的计算机有害问题
  15. 羽化 matlab,MATLAB实现图像羽化处理(图像羽化处理)
  16. 又抓到虫子了:IE中奇怪的应用CSS的BUG
  17. ​字创未来 方正字库第十二届“方正奖”设计大赛正式来袭
  18. 手机 听广播 不用 耳机 android,无需插入耳机即可收听FM广播的高级提示
  19. 不清楚的照片如何变清晰?教你几招变清晰的方法
  20. 计算机电路板 接地,PCB的接地设计,每一个工程师都应该掌握

热门文章

  1. OpenMV串口通讯详解
  2. 如何将excel表格中的纯数字删掉 空白行,然后删除
  3. [Effective C++]条款14:在资源管理类中小心copying行为
  4. Oracle数据库迁移-EMC迁移到华为6800
  5. 基于MATLAB人脸检测的汽车疲劳驾驶检测
  6. 医学计算机基础李宗荣,名家讲坛(八)湖北大学计算机与信息工程学院教授李宗荣——“当代大学生必须‘文理兼修’”...
  7. could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running
  8. 2021年制冷与空调设备运行操作考试APP及制冷与空调设备运行操作找解析
  9. 关于flex定位讲解
  10. HTML+CSS大作业——仿2021淘宝首页(1页) 大学生网页制作教程 表格布局网页模板 学生HTML静态水网页设计作业成品 简单网页制作代码 学生商城网页作品免费设计