IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 实战-Android一种快速启动实现方案 -> 正文阅读

[移动开发]实战-Android一种快速启动实现方案

需求
进入系统后,用户进入一些经常使用的应用,可以快速打开,类似于之前已经打开过,然后,可以快速进入应用界面。

实现
1.前端机器,上报应用的使用频率&使用时间到后台
2.后台利用前端的上报,采用一定的策略(比如用户经常使用的应用& 根据用户的使用频率,预测用户将要使用的应用等),下发需要快速启动的应用列表
3.前端接收到快速启动应用列表,在系统启动阶段,直接准备好应用程序的进程,但是不直接拉起应用程序的Activity(注意,只是准备好进程),从而达到后续启动应用程序时,不需要准备进程启动的阶段,直接启动Activity。
4.AMS中维护一个列表,低内存回收针对这个快速启动列表的,直接忽略

Coding

private void startProcess(List<PackageInfoItem> packageList) {
        if (packageList == null || packageList.size() == 0) {
            return;
        }

        for(PackageInfoItem packageInfo : packageList) {
            IActivityManager manager = ActivityManagerNative.getDefault();
            try {
                Log.i(TAG, "startProcess packageName = " + packageInfo);
                Class<?> aClass = Class.forName("android.app.IActivityManager");

                Method method = aClass.getMethod("startApplication", String.class);
                method.invoke(manager, packageInfo.getPackageName());
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

底层增加startApplication 方法,实际最终上调用的是:AMS->startProcessLocked

 core/java/android/app/ActivityManagerNative.java   | 19 +++++++
 core/java/android/app/IActivityManager.java        |  6 +++
 .../android/server/am/ActivityManagerService.java  | 60 +++++++++++++++++++---
 3 files changed, 78 insertions(+), 7 deletions(-)

diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 29b47fe..77eb329 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2608,6 +2608,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
             reply.writeNoException();
             return true;
         }
+        case START_APPLICATION_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            final String packageName = data.readString();
+            startApplication(packageName);
+            reply.writeNoException();
+            return true;
+        }
         }

         return super.onTransact(code, data, reply, flags);
@@ -6085,5 +6092,17 @@ class ActivityManagerProxy implements IActivityManager
         reply.recycle();
     }

+    @Override
+    public void startApplication(String packageName) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeString(packageName);
+        mRemote.transact(START_APPLICATION_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
+
     private IBinder mRemote;
 }
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 40d99b4..a4c2d90 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -530,6 +530,11 @@ public interface IActivityManager extends IInterface {
     //Fun.tv Begin kill linux native process by pids
     public void killNativeProcess(int[] pids) throws RemoteException;
     //Fun.tv End kill linux native process by pids
+
+    // Begin fun.tv add for start process
+    public void startApplication(String packageName) throws RemoteException;
+    // End fun.tv add for start process
+
     /*
      * Private non-Binder interfaces
      */
@@ -884,4 +889,5 @@ public interface IActivityManager extends IInterface {
     int KILL_NATIVE_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 306;
     int SET_IS_PLAYING_VIDEO = IBinder.FIRST_CALL_TRANSACTION + 307;
     int SET_SYSTEM_PROPERTY = IBinder.FIRST_CALL_TRANSACTION + 308;
+    int START_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 309;
 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index c8808a0..9d91a16 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1451,6 +1451,8 @@ public final class ActivityManagerService extends ActivityManagerNative
     }
     //Fun.tv End memory black & white list

+    private List<String> mAutoStartAppList = new ArrayList<String>();
+
     //Fun.tv Begin kill Linux process by pids
     @Override
     public void killNativeProcess(int[] pids) {
@@ -19793,8 +19795,13 @@ public final class ActivityManagerService extends ActivityManagerNative
         Boolean needKillService = false;
         int adj_min = 0;

-        if (ams_killprocess_stage1 == 0)
+        if (isAutoStartApp(app)) {
+            return true;
+        }
+
+        if (ams_killprocess_stage1 == 0) {
             return false;
+        }

         if (Looper.getMainLooper() != Looper.myLooper()) {  // only do this in main looper
             return false;
@@ -19875,6 +19882,11 @@ public final class ActivityManagerService extends ActivityManagerNative
                     " app.curAdj = " + app.curAdj + " app.curProcState = " + app.curProcState +
                     " app.cached = " + app.cached + " app.empty = " + app.empty + " app.adj_type = " + app.adjType);

+
+            if (isAutoStartApp(app)) {
+                return;
+            }
+
             if (!app.killedByAm && app.thread != null) {

                 if (((app.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) &&
@@ -21648,12 +21660,46 @@ public final class ActivityManagerService extends ActivityManagerNative
             }
         }
     }
-    private boolean isCorrectIp(String ip) {
-        if(TextUtils.isEmpty(ip)) {
-            return false;
+
+    // Begin fun.tv add for start process
+    @Override
+    public void startApplication(String packageName) {
+        Slog.w(TAG, "startApplication packageName " + packageName);
+        if (TextUtils.isEmpty(packageName)) {
+            return;
         }
-        Pattern p = Pattern.compile(IPRegExp);
-        Matcher m = p.matcher(ip);
-        return m.matches();
+        ApplicationInfo info = null;
+        try {
+            info = AppGlobals.getPackageManager().getApplicationInfo(packageName, 0, 0);
+        } catch (RemoteException e) {
+        }
+        Slog.w(TAG, "startApplication info " + info);
+        if (info != null) {
+            ProcessRecord app = getProcessRecordLocked(info.processName, info.uid, true);
+            if (app == null) {
+                app = newProcessRecordLocked(info, null, false, 0);
+            }
+            if (!mAutoStartAppList.contains(packageName)) {
+                mAutoStartAppList.add(packageName);
+            }
+            //app.curAdj = ProcessList.FOREGROUND_APP_ADJ;
+
+            startProcessLocked(app, "added application", app.processName, null,
+                    null /* entryPoint */, null /* entryPointArgs */);
+        }
+    }
+
+    private boolean isAutoStartApp(ProcessRecord app) {
+        String[] packages = app.getPackageList();
+        if (packages != null) {
+            for (int i = 0; i < packages.length; i++) {
+                if (mAutoStartAppList.contains(packages[i])) {
+                    Log.d(TAG_MEMORY, "AutoStartAppList contains " + packages[i] + "    return");
+                    return true;
+                }
+            }
+        }
+        return false;
     }
+    // End fun.tv add for start process
 }

将需要快速启动的APP添加到 mAutoStartAppList,AMS中的killTargetProcessesLocked 用于动态调节adj值,如果isAutoStartApp 则不进行低内存回收或杀死。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:51:56  更:2021-12-23 15:54:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:05:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码