Android(安卓)为所有app开放 系统app才能申请的权限(SD卡写权限 等。。)
16lz
2021-01-24
在Android中有些权限只能有系统签名的app才能申请,第三方app不能申请。
如果要开放某个权限给第三方,我们只能修改系统源码。
android.permission.WRITE_MEDIA_STORAGE 是SD卡写权限,只有系统签名的app才可以申请。
第三方app如果要写SD卡 只能用 SAF,但是SAF对用户来说操作不方便。
我的思路很简单,把 android.permission.WRITE_MEDIA_STORAGE 开放给第三方应用。
如何查看每个app已经申请的权限,可以查看 data/system/packages.xml
要想分析 第三方应用为什么不能申请 android.permission.WRITE_MEDIA_STORAGE
分析过程比较麻烦
直接给出修改结果(以Android 6.0 为例)
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace, String packageOfInterest) {…………………………………………………………………………………………switch (level) { case PermissionInfo.PROTECTION_NORMAL: { // For all apps normal permissions are install time ones. grant = GRANT_INSTALL; } break; case PermissionInfo.PROTECTION_DANGEROUS: { if (pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1) { // For legacy apps dangerous permissions are install time ones. grant = GRANT_INSTALL_LEGACY; } else if (origPermissions.hasInstallPermission(bp.name)) { // For legacy apps that became modern, install becomes runtime. grant = GRANT_UPGRADE; } else if (mPromoteSystemApps && isSystemApp(ps) && mExistingSystemPackages.contains(ps.name)) { // For legacy system apps, install becomes runtime. // We cannot check hasInstallPermission() for system apps since those // permissions were granted implicitly and not persisted pre-M. grant = GRANT_UPGRADE; } else { // For modern apps keep runtime permissions unchanged. grant = GRANT_RUNTIME; } } break; case PermissionInfo.PROTECTION_SIGNATURE: { // For all apps signature permissions are install time ones. allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions); if (allowedSig || perm.equals("android.permission.WRITE_MEDIA_STORAGE") ) { //subingxi open WRITE_MEDIA_STORAGE for all app grant = GRANT_INSTALL; } } break; }
上面的代码是我已经修改过的。
在 grantPermissionsLPw 方法的 case PermissionInfo.PROTECTION_SIGNATURE 中
if (allowedSig )
修改为
if (allowedSig || perm.equals(“android.permission.WRITE_MEDIA_STORAGE”) )
这个if 为true 是关键,如果你想某个app可以申请全部权限
if (allowedSig || pkg.packageName.equals(你APP包名))
这样就可以了。
更多相关文章
- Android(安卓)数据Parcel序列化过程源码分析
- 浅谈Android系统开发中LOG的使用
- 免root实现 Android改机(一键新机)技术解密。
- Android(安卓)和 target 分析
- Android(安卓)SimpleAdapter源码详解
- Android(安卓)5.1 AOSP 源码获取
- Android(安卓)事件分发源码分析
- Android(安卓)系统架构
- androidP 系统集成时发现部分应用初次打开时提示此应用专为低版