从系统侧设置开机三方应用自启动

1.对于有源码的三方应用,可以在/package/XXX/XXX/AndroidMannifest.xml中添加属性

android:persistent="true"

让进程成为常驻进程,在系统启动会启动这些应用

当进程设置为常驻进程后,adj的值比较高,不容易被ActivityManager kill掉

2.对于没有源码的三方应用,无法直接在开机的时候直接启动创建进程,因此想到的解决方式是按照有源码的三方应用的persistent检测并创建进程的流程,强制加入需要的三方应用的信息并创建进程。

生效的方案:

diff --git a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
index 36cda06347..fb8be463e0 100644
--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8065,8 +8065,22 @@ public class ActivityManagerService extends IActivityManager.Stub
                                 ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
                     }
                 }
+                               ApplicationInfo mApplicationInfo1 = mContext.getPackageManager().getApplicationInfo("com.tencent.mm",0);
+                               ApplicationInfo mApplicationInfo2 = mContext.getPackageManager().getApplicationInfo("com.taobao.taobao",0);
+                               ApplicationInfo mApplicationInfo3 = mContext.getPackageManager().getApplicationInfo("com.ss.android.ugc.aweme",0);
+                               ApplicationInfo mApplicationInfo4 = mContext.getPackageManager().getApplicationInfo("com.autonavi.minimap",0);
+                               addAppLocked(mApplicationInfo1, null, false, null /* ABI override */,
+                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                               addAppLocked(mApplicationInfo2, null, false, null /* ABI override */,
+                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                               addAppLocked(mApplicationInfo3, null, false, null /* ABI override */,
+                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                               addAppLocked(mApplicationInfo4, null, false, null /* ABI override */,
+                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);                                              
             } catch (RemoteException ex) {
-            }
+            } catch (NameNotFoundException notEx){
+                               
+                       }
         }
     }
 

在这里插入图片描述

adb shell am start -W com.taobao.taobao/com.taobao.tao.welcome.Welcome

adb shell am start -W com.ss.android.ugc.aweme/.splash.SplashActivity

adb shell am start -W com.tencent.mm/.ui.LauncherUI

adb shell am start -W com.autonavi.minimap/com.autonavi.map.activity.SplashActivity

在这里插入图片描述

通过adb shell ps -ef 查看进程已创建

再通过adb start命令查看这四个应用都是温启动

以上满足了两种三方应用的开机自启动,测试再次打开应用后测试为温启动不是冷启动,满足对于打开应用速度拆帧要求。

3.梳理流程

\frameworks\base\services\java\com\android\server\SystemServer.java
startOtherServices
        mActivityManagerService.systemReady(() -> {
            Slog.i(TAG, "Making services ready");
            t.traceBegin("StartActivityManagerReadyPhase");
            mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
            t.traceEnd();
            t.traceBegin("StartObservingNativeCrashes");
            try {
                mActivityManagerService.startObservingNativeCrashes();
            } catch (Throwable e) {
                reportWtf("observing native crashes", e);
            }
            t.traceEnd();
            
\frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
 public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t)
 
            t.traceBegin("startPersistentApps");
            startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
            t.traceEnd();
          void startPersistentApps(int matchFlags) {
        if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) return;

        synchronized (this) {
            try {
                final List<ApplicationInfo> apps = AppGlobals.getPackageManager()
                        .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
                for (ApplicationInfo app : apps) {
                    if (!"android".equals(app.packageName)) {
                        addAppLocked(app, null, false, null /* ABI override */,
                                ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
                    }
                }
				ApplicationInfo mApplicationInfo1 = mContext.getPackageManager().getApplicationInfo("com.tencent.mm",0);
				ApplicationInfo mApplicationInfo2 = mContext.getPackageManager().getApplicationInfo("com.taobao.taobao",0);
				ApplicationInfo mApplicationInfo3 = mContext.getPackageManager().getApplicationInfo("com.ss.android.ugc.aweme",0);
				ApplicationInfo mApplicationInfo4 = mContext.getPackageManager().getApplicationInfo("com.autonavi.minimap",0);
				addAppLocked(mApplicationInfo1, null, false, null /* ABI override */,
                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
				addAppLocked(mApplicationInfo2, null, false, null /* ABI override */,
                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
				addAppLocked(mApplicationInfo3, null, false, null /* ABI override */,
                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
				addAppLocked(mApplicationInfo4, null, false, null /* ABI override */,
                          ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);						  
            } catch (RemoteException ex) {
            } catch (NameNotFoundException notEx){
				
			}
        }
    }
    
\frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java
     private @NonNull List<ApplicationInfo> getPersistentApplicationsInternal(int flags) {
		Log.i("XXX","getPersistentApplicationsInternal");
        final ArrayList<ApplicationInfo> finalList = new ArrayList<>();
		//strat
        //ApplicationInfo mApplicationInfo = getApplicationInfo("com.tencent.mm",flags,UserHandle.getCallingUserId());
		//finalList.add(mApplicationInfo);
		//end
        // reader
        synchronized (mLock) {
            final Iterator<AndroidPackage> i = mPackages.values().iterator();
            final int userId = UserHandle.getCallingUserId();
            while (i.hasNext()) {
                final AndroidPackage p = i.next();

                final boolean matchesUnaware = ((flags & MATCH_DIRECT_BOOT_UNAWARE) != 0)
                        && !p.isDirectBootAware();
                final boolean matchesAware = ((flags & MATCH_DIRECT_BOOT_AWARE) != 0)
                        && p.isDirectBootAware();

                if (p.isPersistent()
                        && (!mSafeMode || p.isSystem())
                        && (matchesUnaware || matchesAware)) {
                    PackageSetting ps = mSettings.mPackages.get(p.getPackageName());
                    if (ps != null) {
                        ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(p, flags,
                                ps.readUserState(userId), userId, ps);
                        if (ai != null) {
                            finalList.add(ai);
                        }
                    }
                }
            }
        }

        return finalList;
    }

上面的修改方案是针对的userdebug版本,将方案合入到user版本中,刷机完成安装应用,重启之后开机,设备启动到解锁界面会报crash弹窗,进入launcher界面可以看到安装的三方应用都被卸载掉了

07-08 06:16:19.646544  1506  1506 E AndroidRuntime: FATAL EXCEPTION: main
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: Process: com.taobao.taobao, PID: 1506
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate application com.taobao.tao.TaobaoApplication: java.lang.IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user is unlocked
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.LoadedApk.makeApplication(LoadedApk.java:1252)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6738)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.ActivityThread.access$1500(ActivityThread.java:244)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1963)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:223)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7723)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: Caused by: java.lang.IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user is unlocked
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:494)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:479)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:188)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at com.taobao.tao.TaobaoApplication.access$001(Taobao:33)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at com.taobao.tao.TaobaoApplication$2.a(Taobao:118)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at tb.gso.a(Taobao:53)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at com.taobao.tao.TaobaoApplication.attachBaseContext(Taobao:137)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.Application.attach(Application.java:351)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.Instrumentation.newApplication(Instrumentation.java:1159)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	at android.app.LoadedApk.makeApplication(LoadedApk.java:1244)
07-08 06:16:19.646544  1506  1506 E AndroidRuntime: 	... 9 more

SharedPreferences in credential encrypted storage are not available until after user is unlocked 从这个报错看起来分析下来怀疑是启动三方应用太早了导致,设备在启动过程中需要验证

加密相关,详细信息参考:https://blog.csdn.net/sui1005316018/article/details/122828193

因此将启动三方应用向后移动,移动到Launcher完成启动之后。在user版本测试中,发现minimap和抖音存在被kill掉的情况,因此想到循环拉起。此修改方案只适用于特殊版本,满足测试要求,正式版本不能合入。

diff --git a/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java b/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
index 0970dae479..12be1d45fa 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
@@ -2396,7 +2396,24 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
     public void finishBindingItems(int pageBoundFirst) {
         Object traceToken = TraceHelper.INSTANCE.beginSection("finishBindingItems");
         mWorkspace.restoreInstanceStateForRemainingPages();
-
+               Log.i("XXXX","finishBindingItems 111");
+        final int[] count = {0};
+             new Thread(new Runnable() {
+                 @Override
+                 public void run() {
+                     while (count[0] < 200) {
+                         Intent intent = new Intent("StartThirdApp");
+                         sendBroadcast(intent);
+                         count[0]++;
+                         try {
+                             Thread.sleep(3000);
+                         } catch (InterruptedException e) {
+                             throw new RuntimeException(e);
+                         }
+                     }
+                 }
+             }).start();
+        
         setWorkspaceLoading(false);
diff --git a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
index a0d433a96a..f153d63b14 100644
--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -5592,7 +5592,39 @@ public class ActivityManagerService extends IActivityManager.Stub
                 }
             }
         }, pkgFilter);
-
+               Log.i("XXX","AMS finishBooting");
+        IntentFilter mThirdIntentFilter = new IntentFilter();
+        mThirdIntentFilter.addAction("StartThirdApp");
+        mContext.registerReceiver(new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                               Log.i("XXX","StartThirdApp BroadcastReceiver ");
+                                               Log.i("XXXX","AMS startThirdApp");
+                try {
+                ApplicationInfo mApplicationInfo1 = mContext.getPackageManager().getApplicationInfo("com.tencent.mm",0);
+                ApplicationInfo mApplicationInfo2 = mContext.getPackageManager().getApplicationInfo("com.taobao.taobao",0);
+                ApplicationInfo mApplicationInfo3 = mContext.getPackageManager().getApplicationInfo("com.ss.android.ugc.aweme",0);
+                ApplicationInfo mApplicationInfo4 = mContext.getPackageManager().getApplicationInfo("com.autonavi.minimap",0);
+                ApplicationInfo mApplicationInfo5 = mContext.getPackageManager().getApplicationInfo("com.android.settings",0);
+                ApplicationInfo mApplicationInfo6 = mContext.getPackageManager().getApplicationInfo("com.android.gallery3d",0);
+                addAppLocked(mApplicationInfo1, null, false, null /* ABI override */,
+                    ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                addAppLocked(mApplicationInfo2, null, false, null /* ABI override */,
+                    ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                addAppLocked(mApplicationInfo3, null, false, null /* ABI override */,
+                    ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                addAppLocked(mApplicationInfo4, null, false, null /* ABI override */,
+                    ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                addAppLocked(mApplicationInfo5, null, false, null /* ABI override */,
+                    ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+                addAppLocked(mApplicationInfo6, null, false, null /* ABI override */,
+                    ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+            } catch (PackageManager.NameNotFoundException e) {
+            }finally{
+                               Log.i("XXXX","StartThirdApp end");
+                       }
+            }
+        }, mThirdIntentFilter);
         // Inform checkpointing systems of success
         try {

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值