Framework新增资源文件
- frameworks/base/core/res/res/values/custom_whitelist.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- custom apk runtime permission grant -->
<resources>
<string-array name="permission_custom_packagename" translatable="false">
<item>com.demo.runpermissionrequest</item>
</string-array>
</resources>
2.frameworks/base/core/res/res/values/symbols.xml 增加新的字符串id定义
经查证,大部分字符串没有在public.xml中声明,而是在./frameworks/base/core/res/res/values/symbols.xml中被声明。而symbols中声明的字符串ID没有在current.txt中找到,应该是framework内部使用的非公共资源。因此,在framework中添加一个内部使用的字符串,仅需修改:
frameworks/base/core/res/res/values/symbols.xml
frameworks/base/core/res/res/values/strings.xml
而添加一个所有应用程序都可以调用到的字符串资源,则需要修改:
frameworks/base/core/res/res/values/public.xml
frameworks/base/core/res/res/values/strings.xml
另外需要注意的是,修改xml后最好强制重新编译framework-res(mmm framework/base/core/res -B),以免出现R.java没有重新生成的问题。
3.在framework中的代码调用如下接口获取
final String []itemString = mContext.getResources().
getStringArray(com.android.internal.R.array.permission_custom_packagename);
if(ArrayUtils.isEmpty(itemString)){
Slog.e(TAG, "grantPermissionsToCustomApp itemString is null ");
return false;
}
实例新装apk权限授权功能
private void handlePackagePostInstall(PackageInstalledInfo res, boolean grantPermissions,
boolean killApp, boolean virtualPreload, String[] grantedPermissions,
boolean launchedForRestore, String installerPackage,
IPackageInstallObserver2 installObserver) {
if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {
// Send the removed broadcasts
if (res.removedInfo != null) {
res.removedInfo.sendPackageRemovedBroadcasts(killApp);
}
//[ADD] custom apk grant permission,20190501
final boolean doCustomApk = grantPermissionsToCustomApp(res.name);
Slog.d(TAG, "grantPermissions: " + grantPermissions + ", pkg name : " + res.name + ", doCustomApk: " + doCustomApk);
// Now that we successfully installed the package, grant runtime
// permissions if requested before broadcasting the install. Also
// for legacy apps in permission review mode we clear the permission
// review flag which is used to emulate runtime permissions for
// legacy apps.
if (grantPermissions || doCustomApk) {
final int callingUid = Binder.getCallingUid();
mPermissionManager.grantRequestedRuntimePermissions(
res.pkg, res.newUsers, grantedPermissions, callingUid,
mPermissionCallback);
}
final boolean update = res.removedInfo != null
&& res.removedInfo.removedPackage != null;
final String installerPackageName =
res.installerPackageName != null
private final boolean grantPermissionsToCustomApp(@NonNull final String packageName){
final String []itemString = mContext.getResources().
getStringArray(com.android.internal.R.array.permission_custom_packagename);
if(ArrayUtils.isEmpty(itemString)){
Slog.e(TAG, "grantPermissionsToCustomApp itemString is null ");
return false;
}
Slog.d(TAG, "grantPermissionsToCustomApp pkg count = " + itemString.length +", start ");
for (int i = 0; i < itemString.length; i++) {
/*
PackageSetting ps = mSettings.getPackageLPr(itemString[i]);
PackageParser.Package customPackage = ((ps == null)?null:ps.pkg);
if ((customPackage != null) && (packageName.equals(itemString[i]))) {
Slog.d(TAG, "grantPermissionsToCustomApp pkg name : " + itemString[i] + ", end");
return true;
}
*/
if (packageName.equals(itemString[i])) {
Slog.d(TAG, "grantPermissionsToCustomApp pkg name : " + itemString[i] + ", end");
return true;
}
}
return false;
}
//[ADD-END] custom apk grant permission,20190501