Android 11 访问 Android/data/或者getExternalCacheDir() root方式

前言
需求要求安装三方应用ExternalCacheDir()下载下来的apk文件。
getExternalCacheDir() : /storage/emulated/0/Android/data/com../cache/

获取访问权限
如果手机安卓版本为Android10的时候,可以在AndroidManifest.xml中添加下列代码

   android:requestLegacyExternalStorage="true"

以此禁用分区存储,但这在Android11及以上版本不起作用。

root方式 (非root方式点这里)

  • 第一种:通过adb命令修改
	adb shell
    su
    chmod -R 775 /storage/emulated/0/Android/data/packageName/
  • 第二种:系统服务代码
	frameworks/base/services/core/java/com/android/service/***/***.java
	//系统服务合适的地方添加安装卸载应用监听
    private void registerForBroadcasts() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
        intentFilter.addDataScheme("package");

        mContext.registerReceiver(
            new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (Intent.ACTION_PACKAGE_ADDED.equals(action)
                        ||Intent.ACTION_PACKAGE_REPLACED.equals(action) ) {
                        Uri data = intent.getData();
                        String pkgName = data.getEncodedSchemeSpecificPart();
                        //添加安装替换应用监听
                        if("com.***.***".equals(pkgName)){
                            //更新系统属性
                            SystemProperties.set("persist.sys.***", "true");
                        }
                    } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
                        if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                            Uri data = intent.getData();
                            String ssp;
                            if (data != null && (ssp = data.getSchemeSpecificPart()) != null) {
                                String unPkgName = data.getEncodedSchemeSpecificPart();
                                //添加移除卸载应用监听
                                if("com.***.***".equals(unPkgName)){
                                    //更新系统属性
                                    SystemProperties.set("persist.sys.***", "false");
                                }
                            }
                        }
                    }
                }
            }, intentFilter);
    }

  	system/core/rootdir/init.rc
    #init.rc添加属性监听chmod改变权限
    on property:persist.sys.*** = true
        chmod 0775 /storage/emulated/0/Android/data/packageName/
        chmod 0775 /storage/emulated/0/Android/data/packageName/cache
        chmod 0775 /storage/emulated/0/Android/data/packageName/cache/*.apk
  • 第三种:系统服务代码
        //在系统安装应用接口中添加
        if(!TextUtils.isEmpty(filePath)){
            if(filePath.startsWith("/storage/emulated/0/Android/data/com.***.***/")){
                try {
                        String command = "chmod -R 775 /storage/emulated/0/Android/data/com..***.***/";
                        Process process = Runtime.getRuntime().exec(command);
                        process.waitFor();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        }

你可能感兴趣的:(framework,android,android,framework,permissions,selinux)