当前位置: 首页 > news >正文

android 10 后台启动activity

摘要:Android 10(API 级别 29)及更高版本会限制应用何时可以启动 activity 背景。这些限制有助于最大限度地减少对用户的干扰, 让用户能够更好地控制其屏幕上显示的内容。本文以此为出发点,基于展锐平台对系统代码进行改造,通过白名单的方式允许部分应用可以从后台启动activity。
Google官方:
针对从后台启动 activity 的限制

1.添加白名单

Index: build/make/target/product/base_system.mk
===================================================================
--- build/make/target/product/base_system.mk	(版本 1957)
+++ build/make/target/product/base_system.mk	(版本 1959)
@@ -269,6 +269,9 @@wifi-service \wm \+PRODUCT_PACKAGES += background-startactivity-package-whitelist.txt
+# VINTF data for system imagePRODUCT_PACKAGES += \system_manifest.xml \
Index: frameworks/base/data/etc/background-startactivity-package-whitelist.txt
===================================================================
--- frameworks/base/data/etc/background-startactivity-package-whitelist.txt	(不存在的)
+++ frameworks/base/data/etc/background-startactivity-package-whitelist.txt	(版本 1959)
@@ -0,0 +1 @@
+com.android.permissioncontroller
Index: frameworks/base/data/etc/Android.bp
===================================================================
--- frameworks/base/data/etc/Android.bp	(版本 1957)
+++ frameworks/base/data/etc/Android.bp	(版本 1959)
@@ -133,3 +133,9 @@sub_dir: "permissions",src: "com.android.timezone.updater.xml",}
+
+prebuilt_etc {
+    name: "background-startactivity-package-whitelist.txt",
+    sub_dir: "permissions",
+    src: "background-startactivity-package-whitelist.txt",
+}

2. 实现方案

Index: frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
===================================================================
--- frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java	(版本 1957)
+++ frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java	(版本 1959)
@@ -1064,6 +1064,14 @@+ " allowed because SYSTEM_ALERT_WINDOW permission is granted.");return false;}
+
+        // don't abort if the callingPackage on the whitelist
+        if (ActivityBackgroundStartCheckUtil.isWhitelistApp(callingPackage, intent)) {
+            Slog.w(TAG, "Background activity start for " + callingPackage
+                    + " allowed because it is on the whitelist.");
+            return false;
+        }
+// anything that has fallen through would currently be abortedSlog.w(TAG, "Background activity start [callingPackage: " + callingPackage+ "; callingUid: " + callingUid
Index: frameworks/base/services/core/java/com/android/server/wm/ActivityBackgroundStartCheckUtil.java
===================================================================
--- frameworks/base/services/core/java/com/android/server/wm/ActivityBackgroundStartCheckUtil.java	(不存在的)
+++ frameworks/base/services/core/java/com/android/server/wm/ActivityBackgroundStartCheckUtil.java	(版本 1959)
@@ -0,0 +1,100 @@
+package com.android.server.wm;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Environment;
+import android.os.Process;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.util.ArrayUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashSet;
+
+public class ActivityBackgroundStartCheckUtil{
+
+    private static String TAG = "ActivityBackgroundStartCheckUtil";
+
+    private static final File GRANT_SYS_APP_LIST_SYSTEM = Environment
+            .buildPath(Environment.getRootDirectory(), "etc", "permissions",
+                    "background-startactivity-package-whitelist.txt");
+
+    private static HashSet<String> mWhitelistAppSet = new HashSet<String>();
+
+    private static String Key[] = {"android", "call"};
+
+    public static boolean isWhitelistApp(String callingPackage, Intent intent){
+        sGetGrantSystemAppFromFile(mWhitelistAppSet, GRANT_SYS_APP_LIST_SYSTEM);
+        Log.d(TAG, "isWhitelistApp callingPackage="+callingPackage);
+        try {
+            String packageName = intent.getComponent().getPackageName();
+            String className = intent.getComponent().getClassName();
+            if (mWhitelistAppSet.contains(callingPackage) ||
+                mWhitelistAppSet.contains(packageName)) {
+                return true;     
+            }
+            for (String key : Key) {
+                if (className.contains(key)) {
+                    return true; 
+                }
+            }
+        } catch (Exception e) {
+            //e.printStackTrace();
+            Log.d(TAG, e.getMessage());
+        }
+        return false;
+    }
+
+    
+    /**
+     * Get removable system app list from config file
+     *
+     * @param resultSet
+     *            Returned result list
+     * @param file
+     *            The config file
+     */
+    private static void sGetGrantSystemAppFromFile(
+            HashSet<String> resultSet, File file) {
+        resultSet.clear();
+        FileReader fr = null;
+        BufferedReader br = null;
+        try {
+            if (file.exists()) {
+                fr = new FileReader(file);
+            } else {
+                Log.d(TAG, "file in " + file + " does not exist!");
+                return;
+            }
+            br = new BufferedReader(fr);
+            String line;
+            while ((line = br.readLine()) != null) {
+                line = line.trim();
+                if (!TextUtils.isEmpty(line)) {
+                    Log.d(TAG, "read line " + line);
+                    resultSet.add(line);
+                }
+            }
+            Log.e(TAG,"GRANT_SYS_APP_LIST_SYSTEM size="+resultSet.size());
+        } catch (Exception io) {
+            Log.d(TAG, io.getMessage());
+        } finally {
+            try {
+                if (br != null) {
+                    br.close();
+                }
+                if (fr != null) {
+                    fr.close();
+                }
+            } catch (IOException io) {
+                Log.d(TAG, io.getMessage());
+            }
+        }
+    }
+}
+
http://www.lryc.cn/news/473323.html

相关文章:

  • 文案创作新思路:Python与文心一言API的完美结合
  • CentOS 7 上安装 MySQL 8.0 教程
  • Chromium HTML5 新的 Input 类型url对应c++
  • java多线程编程(二)一一>线程安全问题, 单例模式, 解决程线程安全问题的措施
  • Leetcode 213. 打家劫舍 II 动态规划
  • 就业市场变革:AI时代,我们将如何评估人才?
  • 富格林:安全操作方式稳健出金
  • 早点包子店点餐的软件下载和点餐操作教程 佳易王餐饮点餐管理系统操作方法
  • uniapp一键打包
  • 什么是ksqlDB?流处理世界里的新范式
  • Vue.js组件开发
  • Oracle视频基础1.1.2练习
  • Hadoop分布式文件系统架构和设计
  • Prompt Engineering (Prompt工程)
  • 第十四课 Vue中的HTML及文本渲染
  • 无人机救援系统简单解读
  • 广西自闭症儿童寄宿学校:打造温馨成长的家
  • python 查看服务器主机 IP 地址
  • 应对市场变化与竞争对手挑战的策略
  • CSS_定位_网页布局总结_元素的显示与隐藏
  • 内存映射区
  • es安装拼音分词后Kibana出现内存错误
  • mysql 字符串拼接文本并换行
  • IIC学习总结
  • 【案例学习】暴力破解攻击(Brute Force Attack)
  • Python学习之基本语法
  • QT QDialog::exec()调用时清除部件所有焦点
  • uni-app @click.stop @click.stop.native均不生效
  • 数据可视化工具深入学习:Seaborn 与 Plotly 的详细教程
  • camera和lidar外参标定