判断当前进程运行时环境(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进程创建流程

方法一:

使用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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/web/10149636.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存