Android添加限制app自启方法-CSDN

针对TV方案中512M运行内存不足的问题,通过修改`ActivityManagerService.java`,在`broadcastIntentLocked`方法内,对开机自启动应用进行限制。当ACTION_BOOT_COMPLETED触发时,只允许白名单中的应用接收开机广播,例如`android`、`com.bestv.voiceAssist`等。此优化旨在防止过多应用开机启动占用内存。
摘要由CSDN通过智能技术生成
需求: 因为TV方案中运行内存只有512M,需要做一个限制开机自启动应用,来优化运行内存。
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中做处理
找到AMS中管理广播的方法broadcastIntentLocked;找到以下的核心代码
		//省略............
        if (receivers != null) {
            // A special case for PACKAGE_ADDED: do not allow the package
            // being added to see this broadcast.  This prevents them from
            // using this as a back door to get run as soon as they are
            // installed.  Maybe in the future we want to have a special install
            // broadcast or such for apps, but we'd like to deliberately make
            // this decision.
            String skipPackages[] = null;
            if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())
                    || Intent.ACTION_PACKAGE_RESTARTED.equals(intent.getAction())
                    || Intent.ACTION_PACKAGE_DATA_CLEARED.equals(intent.getAction())) {
                Uri data = intent.getData();
                if (data != null) {
                    String pkgName = data.getSchemeSpecificPart();
                    if (pkgName != null) {
                        skipPackages = new String[] { pkgName };
                    }
                }
            } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(intent.getAction())) {
                skipPackages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
            //start add for whitelist BOOT_COMPLETED receiver
            // 对开机广播做处理,在白名单中(whitelist_boot_receiver)包名再能发送开机广播
            } else if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                Resources res = mContext.getResources();
                String[] whitelist = res.getStringArray(R.array.whitelist_boot_receiver);
                Set<String> pkgs = new ArraySet();
                for (int i = 0, j = receivers.size(); i < j; i++) {
                    ResolveInfo curt = (ResolveInfo) receivers.get(i);
                    if (ArrayUtils.contains(whitelist, curt.activityInfo.packageName)) {
                        continue;
                    }
                    pkgs.add(curt.activityInfo.packageName);
                }
                if (!pkgs.isEmpty()) {
                    skipPackages = pkgs.stream().toArray(String[]::new);
                }
            }
            //toptech add end
            if (skipPackages != null && (skipPackages.length > 0)) {
                for (String skipPackage : skipPackages) {
                    if (skipPackage != null) {
                        int NT = receivers.size();
                        for (int it=0; it<NT; it++) {
                            ResolveInfo curt = (ResolveInfo)receivers.get(it);
                            if (curt.activityInfo.packageName.equals(skipPackage)) {
                                receivers.remove(it);
                                it--;
                                NT--;
                            }
                        }
                    }
                }
            }
//省略............


frameworks/base/core/res/res/values/arrays.xml
<string-array name="whitelist_boot_receiver">
        <item>android</item>
        <item>com.bestv.voiceAssist</item>
        <item>com.android.tv.settings</item>
        <item>com.mediatek.hotkey.dispatcher</item>
        <item>com.toptech.tv.service</item>
        <item>com.aispeech.tvui</item>
        <item>com.android.packageinstaller</item>
        <item>com.android.providers.downloads</item>
        <item>com.android.providers.media</item>
        <item>com.android.providers.tv</item>
        <item>com.funshion.publicity</item>
        <item>com.toptech.systemupdate</item>
        <item>tv.fun.appstore</item>
        <item>tv.fun.bugreporter</item>
        <item>tv.fun.master</item>
        <item>tv.fun.ottsecurity</item>
        <item>tv.fun.pushcenter</item>
        <item>tv.fun.sdkmanager</item>
        <item>tv.fun.tvupgrade</item>
  </string-array>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值