最近公司集成很多第三方APP,有很多的APP並沒有進行動態權限申請,導致很多低版本的應用在大於6.0的系統上不能進行運行的問題,爲此公司做出了讓步,決定去到彈窗,只要是應用在AndroidManifest.xml進行申請的權限都可以使用.
預裝的第三方app有兩種:一種是adb push 到 pri-app下的
另一種是直接把代碼放在package下編譯出來的app。
我們是要所有app都不彈出確認框。
具體修改如下:
文章中每處修改的地方都可以通過判斷 包名是否在白名單中而決定給予什麼樣的權限.
Android 7.0 修改文件路徑如下
framework/base/services/core/java/com/android/server/pm/PackageManagerService.java
在 PackageManagerService.java 中有如下四種權限
/** Permission grant: not grant the permission. */
private static final int GRANT_DENIED = 1; 不授予權限
/** Permission grant: grant the permission as an install permission. */
private static final int GRANT_INSTALL = 2; 授予權限作爲安裝權限
/** Permission grant: grant the permission as a runtime one. */
private static final int GRANT_RUNTIME = 3; 授予運行運行時的權限
/** Permission grant: grant as runtime a permission that was granted as an install time one. */
private static final int GRANT_UPGRADE = 4; 授予作爲運行時一個被授予的權限,作爲一個安裝時間
具體修改的方法如下 只需要 將 GRANT_DENIED ,GRANT_RUNTIME 替換成 GRANT_INSTALL即可
private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace,
String packageOfInterest) {
...........省略代碼...........
switch (level) {
...........省略代碼...........
case PermissionInfo.PROTECTION_DANGEROUS: {
if (!appSupportsRuntimePermissions && !mPermissionReviewRequired
&& !Build.PERMISSIONS_REVIEW_REQUIRED) {
...........省略代碼...........
} else {
// For modern apps keep runtime permissions unchanged.
------- 將 GRANT_RUNTIME 修改成 GRANT_INSTALL -------
此處可以判斷應用是不是在白名單內
//grant = GRANT_RUNTIME;
grant = GRANT_INSTALL;
}
} break;
}
if (grant != GRANT_DENIED) {
if (!isSystemApp(ps) && ps.installPermissionsFixed) {
if (!allowedSig && !origPermissions.hasInstallPermission(perm)) {
if (!isNewPlatformPermissionForPackage(perm, pkg)) {
//grant = GRANT_DENIED;
------- 將 GRANT_DENIED 修改成 GRANT_INSTALL -------
grant = GRANT_INSTALL;
}
}
}
...........省略代碼...........
}
Android 9.0 與7.0 路徑相同 只是 具體的代碼有差異
frameworks\base\services\core\java\com\android\server\pm\permission\PermissionManagerService.java
需要修改的方法名稱:grantPermissions //這裏grant是同意或授予的意思
這個grantPermissions方法有參數:PackageParser.Package pkg,
通過pkg可以獲取到包名,當前app需要申請的所有權限等等信息。
// IMPORTANT: There are two types of permissions: install and runtime.(系統權限分爲普通install權限和危險runtime權限)
final int N = pkg.requestedPermissions.size();//獲取AndroidManifest中請求的權限個數
for (int i = 0; i < N; i++) { //分別對裏面的每個權限進行遍歷,判斷
*********************
int grant = GRANT_DENIED; //默認權限值爲拒絕
if (bp.isNormal()) {
此處可以判斷應用是不是在白名單內
grant = GRANT_INSTALL; //權限值爲普通權限,會默認通過
} else if (bp.isRuntime()) { //當權限爲危險權限
//grant = GRANT_DENIED;//系統中默認設置爲危險權限
此處可以判斷應用是不是在白名單內
grant = GRANT_INSTALL; //設置權限值爲普通權限,會默認通過
}
修改系統源碼後,進行編譯,燒錄,啓動的系統中,
請求危險權限就不會彈出對話框確認,直接可以獲取到權限了
切記 此方法需要AndroidManifest.xml 中添加權限.