Android 7.0 & 9.0 修改源碼去掉動態權限 & 權限白名單設置

最近公司集成很多第三方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 中添加權限.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章