掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
本文轉(zhuǎn)載自微信公眾號「Android開發(fā)編程」,作者Android開發(fā)編程。轉(zhuǎn)載本文請聯(lián)系A(chǔ)ndroid開發(fā)編程公眾號。

成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為甘州等服務(wù)建站,甘州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為甘州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
隨著項目不斷的快速迭代,往往會造成app啟動卡慢現(xiàn)象,因為可能在App主進(jìn)程啟動階段或者在主界面啟動階段放了很多初始化其他業(yè)務(wù)的邏輯,而這些業(yè)務(wù)落地可能一開始并不需要用到;
App從點擊桌面圖標(biāo)到我們看到App的主界面整個過程中經(jīng)過了哪些步驟,哪些地方是我們可以優(yōu)化的地方;
下圖是App啟動過程的一個大概描述
App啟動過程中我們優(yōu)化的地方包括主進(jìn)程啟動流程和主界面啟動流程,主進(jìn)程啟動就是Application的創(chuàng)建過程,主界面啟動就是MainActivity的創(chuàng)建過程;
只需要分別對這兩個部分進(jìn)行優(yōu)化即可:
函數(shù)耗時統(tǒng)計工具之Hugo
Hugo項目是一個調(diào)試函數(shù)調(diào)用耗時的工具,通過對方法或者類添加@DebugLog注解,在運行時會將函數(shù)的耗時打印在控制臺中,通常用于排查函數(shù)耗時,或者用于卡頓檢測;
①使用方法
項目根目錄build.gradle添加hugo插件依賴
- classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
②主工程或者library的錄build.gradle中聲明hugo插件
- apply plugin: 'com.jakewharton.hugo'
復(fù)制代碼可通過配置開啟或關(guān)閉hugo功能。
- hugo {
- enabled false
- }
③在類或方法上聲明@DebugLog注解
- @DebugLog
- public String getName(String first, String last) {
- SystemClock.sleep(15);
- return first + " " + last;
- }
④運行程序會在控制臺會打印函數(shù)耗時日志:
- getName [16ms] = "testtest"
其實 hugo項目很簡單,后續(xù)我們會講解怎么自己寫一個;
是把不必要提前做的操作放到異步線程中去做,也就是我們經(jīng)常做的異步加載;
下面簡單寫個代碼示例
- public class StartUpApplication extends Application {
- @Override
- public void onCreate() {
- // 程序創(chuàng)建時調(diào)用,次方法應(yīng)該執(zhí)行應(yīng)該盡量快,否則會拖慢整個app的啟動速度
- super.onCreate();
- onSyncLoadForCreate();
- }
- @Override
- protected void attachBaseContext(Context base) {
- super.attachBaseContext(base);
- onSyncLoad();
- onAsyncLoad();
- }
- private void onSyncLoadForCreate() {
- Logutils.log("onSyncLoadForCreate ");
- Thread.sleep(200);模擬阻塞200毫秒
- }
- private void onSyncLoad() {
- Logutils.log("onSyncLoad ");
- Thread.sleep(200);模擬阻塞100毫秒
- }
- public void onAsyncLoad() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- // 異步加載邏輯
- }
- }, "ApplicationAsyncLoad").start();
- }
- }
2、主頁面加入異步線程和延遲加載功能
與Application的優(yōu)化思路一樣,也是封裝onSyncLoad和onAsyncLoad方法對現(xiàn)有代碼進(jìn)行一個分類,但是這兩個方法的調(diào)用時機(jī)要晚一點,是在主界面首屏繪制完成的時候調(diào)用。這個步驟也需要new一個Thead,屬于額外的開銷,不過這不影響我們整體性能;
3、態(tài)加載布局:主布局文件優(yōu)化
把主界面中不需要第一次就用到的布局全部使用動態(tài)加載的方式來處理,使用ViewStub或者直接在使用時動態(tài)addView的方式;
4、主布局文件深度優(yōu)化
如果做了上面這些優(yōu)化還是會發(fā)現(xiàn)進(jìn)入主界面還是有些慢,那么需要重點關(guān)注主布局文件了。主布局文件的復(fù)雜度直接影響到了Activity的加載速度,這個時候需要對主布局文件進(jìn)行深度優(yōu)化了;
Activity在加載布局的時候,會對整個布局文件進(jìn)行解析,測量(measure),布局(layout)和繪制(draw),所以設(shè)計簡單合理的布局尤為重要。幾個重要的優(yōu)化如下:
5、頁面功能的分模塊化和懶加載
優(yōu)化是一條持續(xù)之路,通過優(yōu)化我們可以了解到影響啟動性能的因素有哪些,這樣我們平時在編碼的過程中就會多注意自己的代碼性能;
其實優(yōu)化還有很多辦法,比如資源文件的優(yōu)化、耗性能的寫在c++層、合理的設(shè)計模式等等,我們做的就是規(guī)范我們的代碼,讓我們自己變的更強(qiáng)大更好。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流