
前言
遇到这个问题的一般都是root用户,或者和rom相关的操作相关,没有root的用户也许看不懂。
"从 Android 9 开始,实现人员必须明确授予或拒绝授予所有特许权限,否则设备将无法启动。"
也就是说,如果把某个app随便放到priv-app目录下,很可能导致无法开机,这在制作rom时经常出现。通常的解决办法是,在build.prop加入:
ro.control_privapp_permissions=log
不过今天在修改系统时遇到了这个问题也使用了这个办法,不知道为什么不生效,换句话说系统并未读取到ro.control_privapp_permissions=log这一属性。看完日志稍作思考后,我决定修改services.jar永久解决问题。
工具
教程
首先打开/data/system/dropbox,找到system_server_crash开头的日志打开,定位:
com.android.server.pm.permission.PermissionManagerService.systemReady
转java可以发现,关键在于mPrivappPermissionsViolations,如果mPrivappPermissionsViolations是空的就不会出现IllegalStateException。
mPrivappPermissionsViolations是ArraySet类型,查找他的put调用处,往上找
找到了not in privapp-permissions whitelist之类的字符串还有日志输出,再往上找会发现:
.local v13, "permissionViolation":Z
如果v13=0,就没法跳到下面的日志输出,直接返回v7
方法一:
把图中的const/4 v13, 0x1
改成const/4 v13, 0x0
好奇permissionViolation哪来的?dex搜索permissionViolation,会出现两个结果,其中一个是刚才改的地方的下面,点开另一个,往上找,发现:
sget-boolean v6, Lcom/android/internal/os/RoSystemProperties;->CONTROL_PRIVAPP_PERMISSIONS_ENFORCE:Z
方法二:正则搜索代码:
sget-boolean (.*), Lcom/android/internal/os/RoSystemProperties;->CONTROL_PRIVAPP_PERMISSIONS_ENFORCE:Z
全部替换为:
const/4 $1, 0
实际上不只有这两种方法,其他比如置空ArraySet也可以。
如果你好奇CONTROL_PRIVAPP_PERMISSIONS_ENFORCE哪来的,你可以去framework.jar搜索,会发现读prop的逻辑。只不过framework.jar没法修改,改了不开机。
按方法一或方法二修改后保存退出,替换掉原来的services.jar(记得先对原文件备份)。有关server_dexopt默认设定导致修改services.jar性能小幅降低的问题需要重新编译art,odex,vdex,具体方法可以去看酷安用户@风也吹不动 的文章。
只能说,安卓系统的某些设计虽然初衷良好,但在实际使用中偶尔会显得不够人性化,甚至可能因误操作而导致设备无法正常启动,这种体验无疑令人沮丧。例如,将非官方应用放置到priv-app目录中,若操作不当,很容易导致系统不稳定或无法开机,仿佛是一种“惩罚”。此外,像Android 12取消对sdcardfs的支持这样的变动,虽然影响相对较小,但也反映出系统更新中的一些决策可能未能充分考虑到所有用户的具体需求。
请登录后查看评论内容