android定制系统完全解除应用安装限制
在Android开发过程中,应用安装功能是很常见的,但随着sdk版本变高,限制也越来越严格。除了用户可见的【未知来源】安装限制,还是开发中对文件Uri读取的限制,需要权限INSTALL_GRANT_RUNTIME_PERMISSIONS。
仅仅开发APP的话,按照官方文档说明进行开发即可。但在定制方案系统开发中,限制太多,用户体验不佳,一般都会去掉这些限制。以下是从系统源码层面进行修改,去掉这两个限制。
结论先行(给忙人看的)
只在 自己编译的 Android 固件 里改源码,才能把
grantUriPermission
这一步“省掉”。改法就是 把
UriGrantsManagerService.checkGrantUriPermissionUnlocked()
直接return GRANT_ALLOW
,或者把INSTALL_GRANT_RUNTIME_PERMISSIONS
强制恒为true
。改完后重新
make -j$(nproc)
并烧录整机;普通 App 想用“免授权”手段安装,没有 root/系统签名根本做不到。
下面给出完整思路与关键源码位置,按需取用。
一、先弄清楚流程(为什么必须 grant)
App → startActivity(Intent) → AMS → UriGrantsManagerService
→ checkGrantUriPermissionUnlocked()
→ 没权限就抛 SecurityException
→ 安装器直接崩。
所以“取消限制”= 让这段检查永远通过。
二、AOSP 具体改动点
路径
frameworks/base/services/core/java/com/android/server/uri/UriGrantsManagerService.java
关键函数
private @GrantUriPermissionResult int checkGrantUriPermissionUnlocked(...)
最小改动(暴力版,开发调试可用)
// 大约在 1280 行附近
private @GrantUriPermissionResult int checkGrantUriPermissionUnlocked(int callingUid, int targetUid, Uri uri, final int intentFlags,int targetUserId) {// 直接放行return GRANT_ALLOW;
}
稍微“温柔”一点(只让安装流程放行)
// 只针对系统安装器包名
if ("com.android.packageinstaller".equals(getPackageManagerInternal().getNameForUID(targetUid))) {return GRANT_ALLOW;
}
三、把“未知来源”弹窗也干掉
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
j
// 搜索 INSTALL_GRANT_RUNTIME_PERMISSIONS
final boolean grantPermissions =(args.installFlags & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
// 改成
final boolean grantPermissions = true;
这样 任何 APK 安装都不会再弹权限确认框,包括危险权限。
四、必须知道的副作用
任何应用都可把 任意文件 URI 丢给系统安装器,安全风险极大;
通过 CTS/GTS 测试会失败,不适合商用出货;
OTA 升级会覆盖掉你的 patch,需要重新打补丁。
五、如果只想“自己 App 静默装”而不改系统
没有 平台签名 + 系统权限 就做不到;
有平台签名可参考 PackageInstaller.Session
反射方案,但仍需 INSTALL_PACKAGES 权限,普通 App 无法持有。