Andrid framework 新增xml资源文件(APK授权白名单)

Framework新增资源文件

  1. 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
### 回答1: Android 11的Framework进程保活白名单是指一些应用程序可以被系统允许长时间运行,并且不容易被杀死,以保证这些应用程序的正常运行。这样的应用程序包括通知、输入法、音乐等系统级别的应用程序,以及一些需要长时间运行的应用程序,如地图、车载娱乐系统等。 Android 11的Framework进程保活白名单是一种系统级别的保活机制,可以让这些应用程序在后台保持稳定的运行状态,以提供更好的用户体验。在这个机制下,系统会为这些应用程序分配更多的源,如CPU、内存等,以确保它们的正常运行。 在Android 11中,可以通过以下两种方式将应用程序加入Framework进程保活白名单中: 1.通过系统的配置项。这种方式需要在系统文件中设置一些相关的参数,以告诉系统哪些应用程序要加入白名单中。 2.通过应用程序自身的设置。这种方式需要在应用程序的代码中编写相关的代码,以告诉系统哪些应用程序需要加入白名单中。 无论是哪种方式,加入框架进程保活白名单的应用程序都可以在系统后台长时间运行,并提供更好的用户体验。不过需要注意的是,过度使用这种机制可能会对系统源造成一定的负担,因此应该谨慎使用。 ### 回答2: Android11 引入了一个新的特性,即进程保活白名单,来确保特定应用程序后台进程能够持续运行。当一个应用程序处于后台状态时,Android会自动清理后台进程以释放内存,这可能导致一些应用程序失去这些进程,从而导致某些功能无法正常工作。 为了解决这个问题,Android11 framework引入了进程保活白名单功能,这样可以确保一些重要的应用程序进程一直处于活动状态,即使它们在后台运行或被系统内存清理。这个白名单可以通过应用程序开发者或者终端用户手动添加。接下来,我们介绍一下如何添加进程保活白名单。 应用程序开发者可以通过使用JobScheduler API将其应用程序添加到系统白名单中。首先,在应用程序的 AndroidManifest.xml 文件中声明 JOB_SERVICE权限,表示应用程序支持JobScheduler API。然后,在自己的应用程序中实现 JobService 类型的服务,并将其注册到系统。在 JobService 类中定义需要保持活动状态的任务,系统将定期启动任务以保证进程的运行状态。 对于终端用户,他们可以手动将其标记为需要保持活动状态的应用程序添加到系统白名单中。在Android11中,用户可以访问应用程序开发者选项中的“后台进程限制”设置,手动将应用程序添加到保活白名单中,以确保其后台进程能够持续运行。 总之,进程保活白名单是Android11引入的新特性,可以确保一些重要的应用程序进程一直处于活动状态,即使它们在后台运行或被系统内存清理。无论是应用程序开发者还是终端用户,都可以通过不同的方式来添加应用程序到系统白名单中,提高了用户的使用体验。 ### 回答3: Android 11引入了一种新的机制,称为“Framework 进程保活白名单”,其目的是为了保证更好的用户体验和系统稳定性。这个机制可以让应用程序在特定情况下获得更长的保活时间,以确保它们可以正常工作并为用户提供服务。 在Android 11 中,Framework 进程保活白名单主要包含了三个部分:焦点服务、前台服务和可见性服务。 焦点服务是指正在播放媒体或正在进行语音通话的服务。这些服务在系统中具有更高的优先级,因为它们正在提供重要的用户体验。 前台服务是指正在与用户进行交互或执行重要任务的服务。这些服务需要向用户显示一个通知,以便用户知道它们正在工作。 可见性服务是指正在向用户显示用户界面或是与界面相关的服务。这些服务会向用户显示一个通知,并在通知被清除时关闭。 当应用程序包含上述服务中的一个或多个时,它们会被添加到 Framework 进程保活白名单中,以获得更长时间的保活。由于这些服务提供了重要的用户体验,因此保持它们的活动是至关重要的。但是,要注意的是,这些服务也必须符合系统限制,比如在一定时间内必须释放源等。 总之,Framework 进程保活白名单为应用程序提供了更好的保活机制,以确保它们在 Android 11 系统中获得更好的体验和更高的稳定性。同时,开发者应该注意确保自己的服务符合系统规则,以便得到更持久的保活时间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值