一个有意思的问题,我们安装了某一款app之后(android8.0系统),到data/data目录下删除某个启动需要的名为libJustATest.so,删除之前备份成libJustATest.so1。删除之后程序无法正常运行,提示找不到so,这是正常的现象。但是当我们把libJustATest.so1名字改成libJustATest.so之后,还是启动失败,提示找不到这个so库。
注:消息日志里显示是从data/app目录下找so库的,该目录下的lib目录其实是data/data的一个完全同步映射,实际的so还是存在于data/data中的。
原因:
当我们从lib目录下用su权限修改了so之后,so的权限就变成了root:root权限,由于android的安全机制,被root用户修改过的so是不能被调用的。这就导致即便我们把so改回来还是无法启动程序。
可以用 “chown system:system libxx.so”将so改回system权限,或 “chown app用户名:app用户名 libxx.so”将so改成app的私有权限,apk即可再次运行。
在我们平时的调试过程中,为了免安装,常常直接从shell里将修改之后的so push到lib目录下,这样做是不会改变so的权限的,所以apk仍旧了正常加载so。
猜测和未知的:
猜测和linux的安全机制SELinux有关,SELinux是从4.3加入到android的,4.2还没有引入SELinux的机制,测试后不存在上面的问题,有朋友说在6.0上也有碰到过这个问题,不过只存在于个别 app,用setenforce 0即可解决,但我在6.0的模拟器上还没有复现到这个问题,并且8.0的手机上setenforce 0是没有作用的。
领取专属 10元无门槛券
私享最新 技术干货