64位app|64位app 和 32位app

一、架构差异
ARM是RISC(精简指令集)处理器,不同于x86指令集(CISC,复杂指令集)。
ARM 有不同的CPU 架构 包括:
ARMV8架构、ARMV7架构、ARMV5和ARMV6架构

  • Arm32位是ARMV7架构,32位的,对应处理器为Cortex-A15等;
  • ARM64位采用ARMv8架构。64位操作长度,对应处理器有Cortex-A53、Cortex-A57、Cortex-A73、iphones的A7和A8等,苹果手机从iphone 5s开始使用64位的处理器。
ABI - Application Binary Interface 应用程序二进制接口,它描述了应用程序和操作系统之间,一个应用和它的库之间的低接口。
一个操作系统是64位的,运行于它之上的可以是64位的程序,也可以是32位的程序。一个程序 可以包含32位的so 也可以包含64位的so

常用的abi有:
  • armeabi 对应着 ARMV5和ARMV6架构
  • armeabi-v7a - 对应着 ARMV7a架构,是32位的寻址长度,里面放置32位系统上运行的so库
  • armeabi-v8a - 对应着 ARMV8架构,64位寻址长度,里面放置64位的so
  • x86 对应 x86架构(PC机的架构),里面放置x86上运行的so
  • x86_64 对应着x86_64架构,里面放置x86_64上运行的so
二、几个关系:
android 工程中 jnilib目录 ->与编译apk中lib目录->apk安装后解压的lib之间的关系。
  • 1、Android项目中,可以有armeabi、armeabi-v7a、arm64-v8a 三个目录。三个目录中不为空的abi目录以及目录中的so文件都会被拷贝到编译后的apk中。
    [图片上传失败...(image-a0a902-1557935847007)]
上图中,arm64-v8a为空,所以编译后的apk中不包含arm64-v8a文件夹。
  • 2、apk中lib中存在多个armeabi,如armeabi、armeabi-v7a、arm64-v8a。
1、arm64-v8a 为第一选择 2、armeabi-v7a为第二选择 3、armeabi为第三选择

针对64位的系统:
  • 如果apk中存在arm64-v8a文件夹,则认为apk未64位的程序,安装时会将arm64-v8a中的so拷贝到/data/app/package/lib/arm64目录中.
[图片上传失败...(image-5810dc-1557935847007)]
data/app/package/lib/目录:
rk3399_mid:/data/app/com.sogou.teemo.testawpwebview-1/lib/arm64 # ls -l total 5808 -rwxr-xr-x 1 system system5752 1979-11-30 00:00 libeval-lib.so -rwxr-xr-x 1 system system 2686344 1979-11-30 00:00 libeval.so -rwxr-xr-x 1 system system13928 1979-11-30 00:00 libimageutil.so -rwxr-xr-x 1 system system243152 1979-11-30 00:00 libmp3lame.so

  • 如果apk中不存在arm64-v8a,但有armeabi-v7a目录,则在apk安装过程中,会将apk中armeabi-v7a中的so 拷贝到/data/app/package/lib/arm/目录,并且判定该程序是32位程序。
[图片上传失败...(image-875df4-1557935847007)]
data/app/package/lib/目录:
rk3399_mid:/data/app/com.sogou.teemo.testawpwebview-1/lib # ls armrk3399_mid:/data/app/com.sogou.teemo.testawpwebview-1/lib/arm # ls -ls total 320 40 -rwxr-xr-x 1 system system13680 1979-11-30 00:00 libimageutil.so 280 -rwxr-xr-x 1 system system 136452 1979-11-30 00:00 libmp3lame.so

  • 如果apk中不存在arm64-v8a 和armeabi-v7a ,但有armeabi目录,则在apk安装过程中,会将apk中armeabi中的so 拷贝到/data/app/package/lib/arm/目录,并且判定该程序是32位程序。
[图片上传失败...(image-6659a9-1557935847007)]
rk3399_mid:/data/app/com.sogou.teemo.testawpwebview-1 # ls base.apk lib oat rk3399_mid:/data/app/com.sogou.teemo.testawpwebview-1/lib/arm # ls -ls total 39848 144 -rwxr-xr-x 1 system system68087 1979-11-30 00:00 libchrome_100_percent.so 24 -rwxr-xr-x 1 system system7659 1979-11-30 00:00 liben-US.so 40 -rwxr-xr-x 1 system system13676 1979-11-30 00:00 libimageutil.so 312 -rwxr-xr-x 1 system system152828 1979-11-30 00:00 libmp3lame.so 512 -rwxr-xr-x 1 system system254977 1979-11-30 00:00 libresources.so 104 -rwxr-xr-x 1 system system46672 1979-11-30 00:00 libsogoulzma.so 38400 -rwxr-xr-x 1 system system 19636034 1979-11-30 00:00 libsogouwebview.so 288 -rwxr-xr-x 1 system system140720 1979-11-30 00:00 libsogouwebview_plat_support.so 24 -rwxr-xr-x 1 system system7512 1979-11-30 00:00 libzh-CN.so

三、如何区分64位qpp 和32位app
从Android 4.4宣布支持64位系统以来,各终端方案厂商逐步推出了各自的64位soc解决方案。Google为了兼容之前32位系统的应用,在64位系统上也实现了对32位应用的支持。
方式一: 当你下载安装一个App之后,从Launcher启动该应用,系统会由Zygote分叉出一个子进程来提供App运行的虚拟机和Runtime环境。
与32位系统不同的是,在64系统中会同时存在两个Zygote进程——zygote和zygote64,分别对应32位和64位应用。
所以,要进行App的32/64位检测,只需要看它的父进程是哪个Zygote即可。
feifeideMacBook-Pro:Desktop feifei$ adb shell ps | grep zygote root31812183128 505440 0000000000 S zygote64 root31911620816 705480 0000000000 S zygotefeifeideMacBook-Pro:Desktop feifei$ adb shell ps | grep com.sogou.teemo.testawpwebview u0_a5221483191235896 1642080 0000000000 S com.sogou.teemo.testawpwebview

com.sogou.teemo.testawpwebview 的PID为2148,父进程ID为319 (zygote),所以是32位程序。
方式二: 通过查看/data/app/package/lib/安装目录来查看:
  • 如果lib目录下是arm文件夹,则是32位程序
  • 如果lib目录下是arm64文件夹,则是64位程序
参考文章:
【64位app|64位app 和 32位app】如何查看app是32位app还是64位app:https://www.jianshu.com/p/8686931d31f0

    推荐阅读