Android sharedUserId引起的血案

前段时间遇见过这样一个问题,值得记一笔。

背景:

    我们原来在5.1设备上有一个32位的so库,系统进程直接使用该so库,因为当时系统也是32位的,没有出现问题,现在,我们切到了7.1的新64位平台,但是该so库我们没有源码,所以我们无法把该so编译为64位,也无法在64位系统进程中用32位的so库(反正我不知道怎么用),所以我们写了一个apk,单独运行在一个进程,被设置为32位apk,因为一些权限问题,该应用被设置sharedUserId为android.uid.system。



现象:

系统起来之后概率性出现,各种应用停止运行(Settings啊之类的),看log显示,这些apk都去32位的环境下找dex文件或者so文件。



分析:

我们系统的apk怎么会去32位的环境下找需要的文件呢?肯定是哪里出了问题,当时只是在运行过程中看日志分析,没有进展,突然灵机一动,应该去看看apk安装的日志,也就是开机log啊。果然发现了猫腻,打出了如下的log:

                        Slog.i(TAG, "Adjusting ABI for " + ps.name + " to " + adjustedAbi
                                + " (requirer="
                                + (requirer == null ? "null" : (requirer.pkg == null ? "null" : requirer.pkg.packageName))
                                + ", scannedPackage="
                                + (scannedPackage != null ? scannedPackage.packageName : "null")
                                + ")");

requirer.pkg为那个32位的apk,ps.name为系统中所有sharedUserId为android.uid.system,意味着其他apk根据了那个32位的apk的ABI而调整了自身的ABI,仔细看了看该段日志前后代码逻辑,发现,系统认为同一个sharedUserId的应用,primaryCpuAbi应该为一样的,妈的,这不坑爹吗?



解决方案:

知道了原因解决起来就很简单,针对那个应用的包名,把系统这套逻辑屏蔽了。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值