目录
1、前言
2、检测App
3.应用是否包含 64 位库?
1、前言
从Android 4.4宣布支持64位系统以来,各终端方案厂商逐步推出了各自的64位soc解决方案。Google为了兼容之前32位系统的应用,在64位系统上也实现了对32位应用的支持。那么问题就来了,在一个64位系统的Android手机上如何检测应用是运行在32位还是64位环境?
2、检测App
任何一个Android手机用户对APK文件肯定不会陌生,它是一个Android应用资源的封装文件。当你下载安装一个App之后,从Launcher启动该应用,系统会由Zygote分叉出一个子进程来提供App运行的虚拟机和Runtime环境。与32位系统不同的是,在64系统中会同时存在两个Zygote进程——zygote和zygote64,分别对应32位和64位应用。所以,要进行App的32/64位检测,只需要看它的父进程是哪个Zygote即可。
下面的例子通过App的PPID信息——2759,检测出了终端系统中所有的64位应用,且该方式无需root权限
$ adb shell ps |grep zygote
root 2759 1 2131692 87052 0 0000000000 S zygote64
root 2760 1 1574048 53740 0 0000000000 S zygote$ adb shell ps|grep 2759
root 2759 1 2131692 87052 0 0000000000 S zygote64
system 3257 2759 2339956 158936 0 0000000000 S system_server
radio 3393 2759 1601272 96220 0 0000000000 S com.android.phone
u0_a85 3407 2759 1564856 88740 0 0000000000 S com.android.inputmethod.latin
u0_a20 3422 2759 1970228 167288 0 0000000000 S com.android.systemui
u0_a7 3769 2759 1548288 63384 0 0000000000 S android.ext.services
u0_a13 3958 2759 1896704 131832 0 0000000000 S com.android.launcher3
u0_a6 3989 2759 1562416 94060 0 0000000000 S android.process.acore
u0_a17 4046 2759 1563300 88504 0 0000000000 S android.process.media
u0_a28 4112 2759 1555640 82004 0 0000000000 S com.android.quicksearchbox
u0_a64 4157 2759 1554484 72944 0 0000000000 S com.android.calendar
u0_a57 4215 2759 1572160 83532 0 0000000000 S com.android.email
u0_a77 4231 2759 1554408 67192 0 0000000000 S com.android.exchange
u0_a5 4279 2759 1549136 66072 0 0000000000 S com.android.onetimeinitializer
u0_a10 4299 2759 1552472 74088 0 0000000000 S com.android.providers.calendar
u0_a94 4325 2759 1869948 112984 0 0000000000 S com.android.soundrecorder
system 4345 2759 1561180 73680 0 0000000000 S com.sprd.engineermode
u0_a15 4887 2759 1874612 106196 0 0000000000 S com.android.packageinstaller
u0_a73 5133 2759 2425904 205912 0 0000000000 S com.android.browser
3.应用是否包含 64 位库?
首先要确保这两个文件夹中都有原生库。总结如下:
平台 | 32 位库文件夹 | 64 位库文件夹 |
---|---|---|
ARM | lib/armeabi-v7a | lib/arm64-v8a |
x86 | lib/x86 | lib/x86_64 |
第一步 打开自己要检测的APP
查看 lib 文件夹,可以在其中找到所有“.so”文件。如果在的应用中找不到任何“.so”文件,则说明该应用已经准备好相应的库,无需采取进一步措施。如果看到 armeabi-v7a 或 x86,则说明有 32 位库。
检查是否在 arm64-v8a 或 x86_64 文件夹中也有类似的“.so”文件。
如果您没有任何 arm64-v8a 或 x86_64 库,则需要更新编译流程以开始在 APK 中编译并打包相应工件。
第二步 添加64位的库就OK
// Your app's build.gradleapply plugin: 'com.android.app'android {compileSdkVersion 27defaultConfig {appId "com.google.example.64bit"minSdkVersion 15targetSdkVersion 28versionCode 1versionName "1.0" ndk.abiFilters 'armeabi-v7a'//32位,'arm64-v8a'//64位 ,'x86'//32位,'x86_64'//64位// ...然后点击编译就可以啦~
接着在用第一步判断就可以发现应用是否支持64位代码了