Android 7.0&9.0ソースコードを変更してダイナミック権限を削除&権限ホワイトリスト設定


最近、会社は多くのサードパーティのアプリを統合しており、多くのアプリが動的権限申請を行っていないため、6.0より大きいシステムでは実行できないという問題が多く、同社は譲歩し、AndroidManifestに応用すれば弾窓に行くことにした.xmlが申請する権限はすべて使用できる.
プリインストールされたサードパーティ製appには、adb pushからpri-appの下に、packageの下にコードを直接コンパイルしたappの2種類があります.私たちはすべてのappが確認ボックスをポップアップしないようにします.
具体的な修正は以下の通りです.
文章中の各修正箇所は、パッケージ名がホワイトリストにあるか否かを判断することによって、どのような権限を与えるかを決定することができる.
Android 7.0修正ファイルのパスは以下の通りです.
framework/base/services/core/java/com/android/server/pm/PackageManagerService.java

PackageManagerServices.JAvaには次の4つの権限があります.

    /** 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でOK
   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に権限を追加します.