前言 :
需求要求安装三方应用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(); } } }