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 {