应用启动速度研究

提升应用启动速度的方法很多。其实提升应用的启动速度可以分为系统提升和应用本身的提升。


应用本身提升就是优化应用代码逻辑和应用界面布局,减少应用启动在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;
            }


猜你喜欢

转载自blog.csdn.net/fan380485838/article/details/80929778