提升应用启动速度的方法很多。其实提升应用的启动速度可以分为系统提升和应用本身的提升。
应用本身提升就是优化应用代码逻辑和应用界面布局,减少应用启动在oncreate()函数所花费的时间。这个网上也介绍了很多方法和工具,这里就不介绍了。
另外一个方法就是通过系统提升。下面介绍下通过系统提升的几种方法。
1:使用系统的快速启动窗口。这样的话就能够保证应用在启动一次后,后面的启动速度加快。
2:但是android O后的快速启动窗口,完全依附于任务清理,当任务被清理后,保存下来的快速启动窗口图片也会被清理。再次
启动时,还是加载慢。
3:将应用设置为常驻进程,但是这种方式也不行了,现在对内存的要求也挺高,应用都搞成常驻,GTS都过不来。
4:当应用清理时,系统不杀进程,在frameworks\base\services\core\java\com\android\server\am中的ProcessRecord.java中的kill中做一些处理。
void kill(String reason, boolean noisy) {
if(("com.tencent.mm".equals(info.packageName)|| "com.sina.weibo".equals(info.packageName))
&& noisy && !reason.equals("anr")&& !reason.equals("clash")) {
String str= "james--test" +info.packageName +"is not kill";
Slog.w(TAG, str);
return;
}
if (!killedByAm) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill");
if (noisy) {
Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);
}
EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
Process.killProcessQuiet(pid);
ActivityManagerService.killProcessGroup(uid, pid);
if (!persistent) {
killed = true;
killedByAm = true;
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
}
5:也可以在清理任务的时候,不让进程被杀。
在文件:frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
6:也可以封装下
package com.android.server.test;
import java.util.ArrayList;
import java.util.HashMap;import java.util.HashSet;
public class TestPerfActivityManager {
private static final String TAG = "TestPerfActivityManager ";
public static final HashSet<String> mNotKillFromRecentsApps = new HashSet<String>();
static {
mNotKillFromRecentsApps.add("com.tencent.mm");
mNotKillFromRecentsApps.add("com.android.dialer");
mNotKillFromRecentsApps.add("com.android.contacts");
}
}
//do not kill after remove from recent list
if(killProcess&&tr.realActivity!=null&&com.android.server.test.testPerfActivityManager.mNotKillFromRecentsApps.contains(tr.realActivity.getPackageName())){
Slog.w(TAG, "removeTaskByIdLocked:"+tr.realActivity.getPackageName());
killProcess = false;
}