android 性能分析(優(yōu)化)-利用AOP技術(shù),字節(jié)碼方法插樁,實(shí)現(xiàn) android 耗時(shí)統(tǒng)計(jì)

在android開(kāi)發(fā)的過(guò)程中,不管是開(kāi)發(fā)SDK還是開(kāi)發(fā)App,我們時(shí)常有這么一個(gè)需求,性能優(yōu)化,或者卡頓優(yōu)化,通常進(jìn)行這項(xiàng)工作的時(shí)候,我們可能會(huì)憑著主觀的一些觀點(diǎn),去定位排查某一部分代碼,常用的手段就是在可疑代碼前后加時(shí)間戳相減來(lái)手動(dòng)統(tǒng)計(jì),或者在運(yùn)行的過(guò)程中,通過(guò)看android 自帶的性能分析工具來(lái)進(jìn)行優(yōu)化。但這種方式難免會(huì)有疏漏,而且每段代碼的執(zhí)行過(guò)程也是不容易追蹤的。

今天就來(lái)給大家介紹一個(gè),利用AOP技術(shù),字節(jié)碼編譯期方法插樁的方式,統(tǒng)計(jì)android耗時(shí)的工具。

github地址:https://github.com/miqt/PluginTools

這是一個(gè)android 方法耗時(shí)統(tǒng)計(jì)打印插件,可以根據(jù)包名,類名,方法正則表達(dá)式等,指定插入代碼進(jìn)行統(tǒng)計(jì),在做性能調(diào)優(yōu)的時(shí)候非常方便。能清晰的觀察每個(gè)方法的耗時(shí)情況。另外還可以自定義統(tǒng)計(jì)實(shí)現(xiàn)類,增加額外的內(nèi)容。

[圖片上傳失敗...(image-93a384-1584524975350)][外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-JP6etkK5-1584524741926)(https://api.bintray.com/packages/miqingtang/maven/pluginSrc/images/download.svg)]

效果展示:

統(tǒng)計(jì)項(xiàng)目中所有activity的方法耗時(shí)情況:

2020-03-18 16:09:11.540 23078-23078/? D/TimePrint:  
    ╔======================================================================================
    ║[Thread]:main
    ║[Method]:androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() type:void
    ║[Time]:84
    ╚======================================================================================
2020-03-18 16:09:11.575 23078-23078/? I/TimePrint:  
    ╔======================================================================================
    ║[Thread]:main
    ║[Method]:androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) type:void
    ║[Time]:118
    ╚======================================================================================
2020-03-18 16:09:11.575 23078-23078/? I/TimePrint:  
    ╔======================================================================================
    ║[Thread]:main
    ║[Method]:androidx.appcompat.app.AppCompatActivity.setContentView(int) type:void
    ║[Time]:118
    ╚======================================================================================
2020-03-18 16:09:11.575 23078-23078/? I/TimePrint:  
    ╔======================================================================================
    ║[Thread]:main
    ║[Method]:com.miqt.plugindemo.MainActivity.onCreate(android.os.Bundle) type:void
    ║[Time]:142
    ╚======================================================================================

可以看出,這樣的話方法名,運(yùn)行線程,和耗時(shí)情況就都一目了然啦。

也支持注解指定固定的方法 @PrintTime:

@PrintTime
public static String getStr() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "hello";
}

使用方法:

項(xiàng)目根目錄:build.gradle 添加以下代碼

dependencies {
    classpath 'me.miqt.plugin.tools:pluginSrc:x.x.x'
}

對(duì)應(yīng) module 中啟用插件,可以是application也可以是library

apply plugin: 'miqt.plugin.tools'

methodtimer {
    enable = true //是否啟用
    //項(xiàng)目中的class true:全部插樁 false:只有注解插樁
    all = true

    //指定插樁那些外部引用的jar,默認(rèn)空,表示只對(duì)項(xiàng)目中的class插樁
    jarRegexs = [".*androidx.*"]
    //指定插樁那些類文件,默認(rèn)空
    classRegexs = [".*view.*"]
    //所有包含 on 的方法,所有構(gòu)造方法
    methodRegexs = [".*on.*", ".*init.*"]
    
    //編譯時(shí)是否打印log
    log = true
    //是否用插樁后的jar包替換項(xiàng)目中的jar包,慎用
    replaceJar = false
    //是否生成詳細(xì)mapping文件
    mapping = true
    //自定義方法統(tǒng)計(jì)實(shí)現(xiàn)類,不指定默認(rèn)使用自帶實(shí)現(xiàn)方式
    //impl = "com.miqt.plugindemo.MyTimeP"
}

添加類庫(kù)依賴:

dependencies {
    implementation 'me.miqt.plugin.tools:pluginlib:x.x.x'
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們產(chǎn)線的主流程頁(yè)面中有幾個(gè)比較復(fù)雜的頁(yè)面在版本迭代中流暢度頻繁出現(xiàn)反復(fù),經(jīng)常由于開(kāi)發(fā)的不注意導(dǎo)致變卡,主要是對(duì)流...
    舒大飛閱讀 1,419評(píng)論 0 11
  • 自己總結(jié)的Android開(kāi)源項(xiàng)目及庫(kù)。 github排名https://github.com/trending,g...
    passiontim閱讀 2,751評(píng)論 1 26
  • 說(shuō)到 Android 系統(tǒng)手機(jī),大部分人的印象是用了一段時(shí)間就變得有點(diǎn)卡頓,有些程序在運(yùn)行期間莫名其妙的出現(xiàn)崩潰,...
    cowboy3000閱讀 634評(píng)論 0 2
  • 91年的我從事幫別人看病已經(jīng)有5個(gè)年頭了!我從小在一個(gè)有著濃郁中醫(yī)氛圍的環(huán)境中長(zhǎng)大!每天看著爺爺診所進(jìn)進(jìn)出出的病人...
    丁藥童閱讀 977評(píng)論 0 2
  • 今天時(shí)不時(shí)會(huì)有小雨.還在擔(dān)心今晚夜跑會(huì)取消.在開(kāi)跑前.大家的熱情早已經(jīng)融化了雨.7:30集結(jié)完畢.在工作室熱好身就...
    晨曦山雞閱讀 238評(píng)論 0 0

友情鏈接更多精彩內(nèi)容