判断当前进程运行时环境(3264位)的方法

判断当前进程运行时环境(3264位)的方法,第1张

最近项目里添加了64位动态库,即 app/libs 下的 armeabi 和 arm64-v8a 两个存储动态库的目录。项目还有拷贝动态库的需要,即:从apk中将动态库拷贝到指定目录下,然后通过 Systemload() 来加载。问题是:

应该拷贝apk中哪个版本的动态库呢? armeabi 还是 arm64-v8a ?

简单的回答:主要得看应用进程是被哪个zygote创建出来的。

Android系统从50开始支持64bit CPU,于是系统就有了zygote和zygote64两个进程来分别创建32和64位的应用进程。怎么确定我的应用进程由哪个zygote启动的?

简单验证一下:使用 $adb shell ps | grep zygote 能看到两个zygote和zygote64两个进程。再使用 $adb shell ps | grep <package_name> 就能找到应用进程ID和父进程ID。如下图:

从输出中看到应用的父进程PID是746,也就是说是被zygote64给fork出来的,就是说运行时环境是64位。

要写一个功能函数来判断当前运行环境是64bit还是32bit,怎么实现呢?

最先想到的方法就是获取到父进程PID,然后查到父进程名字,拿名字跟 zygote64 和 zygote 字符串作对比。
问题是系统没提供相关的接口(在Java中启动ps进程,然后分析输出日志应该可以达到目的,但是实现起来比较麻烦)。

另外,从 /proc/<pid>/cmdline 中也能看到进程名,但是应用进程没有权限读取zygote进程的cmdline。

有没有系统接口呢?

有。但是只在60及以后的SDK上才提供。50上是不能用的。

回过头来想一个问题:应用进程被zygote或zygote64启动是由什么因素决定的?

主要有三个:

然后就是系统启动应用时的决策过程和逻辑:

决策过程可以简单概括为:

所以,可以通过查看libartso的路径来判断zygote的类型;也可以判断手机的CPU ABI来判断。

方法① 查找libartso的路径

使用ClassLoader的findLibrary方法来查找libartso的路径;该方法是隐藏函数,所以需要使用反射。

说明:zygote64会加载 /system/lib64/libartso ,zygote会加载 "/system/lib/libartso" 。

方法② 根据CPU ABI来判断

这个方法可能有一个缺陷:如果将32位的ROM安装在支持arm64-v8a的机器上,查询 SUPPORTED_ABIS 时依然得到的是arm64-v8a,而此时系统只能以32位环境来运行应用,这就出问题了。

但是,暂时没法验证这个种case,不好找这样的ROM,因为厂商一般不会这么做。所以,这种情况暂时可以不用考虑。

Android 64位兼容方式运行32位分析
腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍
Android系统启动-zygote篇
理解Android进程创建流程

以上就是关于判断当前进程运行时环境(32/64位)的方法全部的内容,包括:判断当前进程运行时环境(32/64位)的方法、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9771078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存