
最近项目里添加了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进程创建流程
方法一:
使用subprocess 的check_output函数执行pidof命令
方法二:
使用pgrep命令,pgrep获取的结果与pidof获得的结果稍有不同pgrep的进程id稍多几个pgrep命令可以使适用subprocess的check_out函数执行
方法三:
获取当前脚本的pid进程
方法四:命令获取+kill PID
说明:
注意:linux的进程号最大是是 32768 (32 位系统)和 2 的 22 次方(400w 左右)(64 位系统)。cut -c 9-15不够,改成awk '{print $2}'
1、方法:
在某些情况下,你也许想要知道运行中的子shell的PID。这个PID信息可以在不同的情况下使用。比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件。有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身的子shell。
在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量只读,你不可以在脚本中修改它。比如:
#!/bin/bash
echo "PID of this script: $$"
上面的脚本会得到下面的输出:
PID of this script: 6583
除了$$, bash shell还会导出其他的只读变量。比如,PPID存储子shell父进程的ID(也就是主shell)。UID存储了执行这个脚本的当前用户ID。比如:
#!/bin/bash
echo "PID of this script: $$"
echo "PPID of this script: $PPID"
echo "UID of this script: $UID"
输出是:
PID of this script: 6686
PPID of this script: 4656
UID of this script: 1000
上面输出中,PID每次执行都会变化。这个因为每次运行都会创建一个新的shell。另一方面,PPID每次都会一样只要你在同一个shell中运行。
对于所有bash内置变量列表,参考man页。
$ man bash
2、网络搜索“如何在脚本中获取进程ID(PID) - CSDN博客”可找到原贴。
查看和获取PID的方法:
1、进入手机微信里,然后进入微信小商店里点击“进入我的店”。
2、在绑定的店铺列表里,选择想要添加商品的店铺。
3、进入微信小商店店铺后台后,点击“功能”。
4、在功能的页面中点击“新增商品”。
5、d出来的内容里,选择新增商品的方式。
6、编辑新增商品的信息后,点击“上架售卖”
pid是什么:
是每个淘客自己的唯一ID,相当于身份z号码,决定着收入归属,填错了就成别人的了。
以上就是关于判断当前进程运行时环境(32/64位)的方法全部的内容,包括:判断当前进程运行时环境(32/64位)的方法、python 获取进程的pid、如何在脚本中获取进程ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)