前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android App 启动优化

Android App 启动优化

作者头像
用户9732312
发布2022-05-13 16:47:20
6300
发布2022-05-13 16:47:20
举报
文章被收录于专栏:ADAS性能优化

当前用户越来越关心APP的启动速度.而APP的启动和很多因素相关.

  1. eMMC的读写速度.
  2. CPU 的频率.
  3. App framework 的优化.
  4. App 代码的优化.

其中eMMC的读写性能一般和HW有关,可做的工作不多.对于CPU的频率,大多数的芯片vendor 也在App启动是采用了boost,也就是需要把CPU 运行在maxfreq.而App framework 的优化是andorid的code,这当中有很多工作可做.App 代码的优化,需要APP 开发者进行相关代码的优化.

本文将提供碰到的需要在App framework中的代码优化patch.

问题描述,

在chrome的启动中,发现chrome启动比较慢.其system server 的systracelog 如下.

从systrace log中,我们可以看到AMS 进行了3次kill empty process ,而每次kill 一个process大概需要100ms,总共就需要300ms的操作,其是一个非常费时的操作.如果在启动过程中,频繁出现killempy process 势必影响app的启动时间.

Solution 1

显易而见,其一种方法是提高emptyprocess number.这种方法有一个缺点是这个number需要提高多多少合适.如果太大有可能会由于memory吃紧从而triggerLMK.有可能是APP启动速度更慢.目前其default参数是16.我们可以把ro.sys.fw.bg_apps_limit的值改为比较高的值如50,这需要调试.

static final int MAX_CACHED_APPS= SystemProperties.getInt("ro.sys.fw.bg_apps_limit",32);

static final booleanUSE_TRIM_SETTINGS = static final intEMPTY_APP_PERCENT =SystemProperties.getInt("ro.sys.fw.empty_app_percent",50);

emptyProcessLimit =ProcessList.computeEmptyProcessLimit(mProcessLimit);

public static intcomputeEmptyProcessLimit(int totalProcessLimit) {

if(USE_TRIM_SETTINGS &&allowTrim()) {

return totalProcessLimit*EMPTY_APP_PERCENT/100;

} else {

return totalProcessLimit/2;

}

}

Solution 2

另一种方法便是在App启动的过程中,我们不需要kill任何进程及时是cache的process和empty的process达到了上限.其patch 如下.

diff --git a/services/core/java/com/android/server/am/ActivityManagerService.javab/services/core/java/com/android/server/am/ActivityManagerService.java

old mode 100644

new mode 100755

index d2f573b..535300d

---a/services/core/java/com/android/server/am/ActivityManagerService.java

+++b/services/core/java/com/android/server/am/ActivityManagerService.java

@@ -19071,6 +19072,7 @@ public final classActivityManagerService extends ActivityManagerNative

}

final voidupdateOomAdjLocked() {

+

finalActivityRecord TOP_ACT = resumedAppLocked();

finalProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null;

final longnow = SystemClock.uptimeMillis();

@@ -19232,6 +19234,8 @@ public final classActivityManagerService extends ActivityManagerNative

}

applyOomAdjLocked(app, true, now);

+ boolean isStartingApp=false;

+ isStartingApp=mStackSupervisor.mLaunchingActivity.isHeld();

//Count the number of process types.

switch (app.curProcState) {

@@ -19240,19 +19244,34 @@ public final classActivityManagerService extends ActivityManagerNative

mNumCachedHiddenProcs++;

numCached++;

if (numCached > cachedProcessLimit) {

+ if(!isStartingApp)

app.kill("cached #" + numCached, true);

}

break;

case ActivityManager.PROCESS_STATE_CACHED_EMPTY:

if (numEmpty > ProcessList.TRIM_EMPTY_APPS

&&app.lastActivityTime < oldTime) {

+ if(!isStartingApp)

app.kill("empty for "

+((oldTime + ProcessList.MAX_EMPTY_TIME - app.lastActivityTime)

/ 1000) + "s",true);

}

} else {

numEmpty++;

if (numEmpty > emptyProcessLimit) {

+ if(!isStartingApp)

app.kill("empty #" + numEmpty, true);

}

}

break;

@@ -19268,7 +19287,10 @@ public final classActivityManagerService extends ActivityManagerNative

// definition not re-use the same process again, and it is

// good to avoid having whatever code was running in them

// left sitting around after no longer needed.

+ if(!isStartingApp)

app.kill("isolated not needed", true);

}else {

// Keeping this process, update its uid.

final UidRecord uidRec = app.uidRecord;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Solution 1
  • Solution 2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档