精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高效開發之編譯插樁

移動開發 移動應用
在這次的和家親APP性能優化尤其是啟動至首屏專項優化中,使用了Gradle+ASM編譯插樁技術實現apk全局耗時方法統計,本文以此為例讓你認識“插樁”這個效率利器。
作者|劉素云,單位:智慧家庭運營中心

?Labs 導讀

插樁技術非常有趣也很有價值,學會這項技術以后,我們就可以隨心所欲地操控代碼,滿足不同場景的需求。很多框架都離不開這個技術,如常見的ButterKnife 注解框架,數據庫 ORM 框架、APM性能監控、埋點統計等。

和家親是一款智慧家庭綜合服務入口APP。客戶端的性能直接影響用戶體驗,在這次的和家親APP性能優化尤其是啟動至首屏專項優化中,使用了Gradle+ASM編譯插樁技術實現apk全局耗時方法統計,本文以此為例讓你認識“插樁”這個效率利器。

Part 01  編譯插樁

顧名思義,所謂的編譯插樁就是在代碼編譯期間修改已有的代碼或者生成新代碼。

在學習插樁之前,你首先需要了解相關基礎技術,包括Android打包大致流程、class字節碼文件結構、gradle Transform task及ASM字節碼操作框架等。后面會做簡單介紹,若要詳細了解,你可以仔細閱讀參考文獻。

下圖為android編譯插樁示意圖。

圖片

字節碼(Bytecode):“.class”文件的是 Java 字節碼、“.dex”文件的是 Dalvik 字節碼。我們這里的ASM插樁方法是操作Java 字節碼。

使用場景:對于代碼監控、代碼修改以及代碼分析這三個場景,一般采用操作字節碼的方式,如無埋點統計上報、輕量級AOP等。應用到在Android中,可以用來做用行為統計、方法耗時統計等功能。

Part 02  ASM字節碼框架

ASM是一個java字節碼操縱框架,它能被用來動態生成類或者增強既有類的功能。

2.1 class文件

了解ASM框架使用之前,必須先了解下class文件格式,一個完整的 class字節碼文件包括:

  • 魔數與class文件版本
  • 常量池
  • 訪問標志
  • 類索引、父類索引、接口索引
  • 字段表集合
  • 方法表集合
  • 屬性表集合

為方便查看字節碼文件,kotlin代碼android studio 有自帶工具tools--show kotlin bytecode,java代碼可以安裝jclasslib查看。

2.2 ASM框架使用

ASM的架構主要是采用了訪問者模式來設計,所謂訪問者模式就是封裝一些作用于某種數據結構中的各元素的操作,它可以在不改變數據結構的前提下定義作用于這些元素的新的操作。具體在ASM框架中應用就是將.class類文件的內容從頭到尾掃描一遍,每次掃描到類文件相應的內容時,都會調用ClassVisitor內部相應的方法。該方法會返回一個對應的字節碼操作對象(比如,visitMethod()返回MethodVisitor實例),通過修改這個對象,就可以修改class文件相應結構部分內容,最后將這個ClassVisitor字節碼內容覆蓋原來.class文件就實現了類文件的代碼切入。

圖片

2.3 ASM工具

工欲善其事,必先利其器。在使用 ASM 插入字節碼時,如果你不熟悉字節碼相關語法和規則可能對于插入字節碼代碼束手無策了。幸好 ASM官方開發了一款IDE插件,可以將Java代碼 轉換成 ASM 字節碼類型代碼,這樣再使用ASM插入字節碼時就比較方便了。利用插件ASM bytecode outline輕松查看字節碼及對應ASM框架代碼。

圖片

Part 03  Gradle Transform

Gradle Transform 是 Android 官方提供的在apk編譯打包的流程中將 .class 文件到 .dex 轉換這一階段用來修改 .class 文件的一套標準 API。這一應用現在主要集中在字節碼查找、代碼注入等。

3.1 Transform原理

Transform是android gradle api中的一部分,它可以在android項目的.class文件編譯為.dex文件之前,得到所有的.class文件,在Transform中處理。使用Transform API, 我們完全可以不用去關注相關task的生成與執行流程, 它讓我們可以只聚焦在如何對輸入的類文件進行處理。

圖片

每個Transform其實都是一個gradle task,Android編譯器中的TaskManager將每個Transform串連起來,第一個Transform接收來自javac編譯的結果,以及已經拉取到在本地的第三方依賴(jar、aar),還有resource資源。這些編譯的中間產物,在Transform組成的鏈條上流動,每個Transform節點可以對class進行處理再傳遞給下一個Transform。我們常見的混淆,Desugar等邏輯,它們的實現如今都是封裝在一個個Transform中,而我們自定義的Transform,會插入到這個Transform鏈條的最前面。

自定義的transform在build控制臺可以看到對應的task,輸出內容可以在build\intermediates\transforms\對應目錄找到。

3.2 Transform自定義實現

想要自定義transform,必須實現以下幾個方法:

  • getName():返回transform名稱標識
  • getInputTypes(): 輸入類型包括倆種,CLASSES 和 RESOURCES分別代表java的class文件和資源文件
  • getScopes(): 定義Transform需要處理那些輸入文件
  • isIncremental(): 表示是否支持增量編譯,支持增量編譯,可以節省一些編譯的時間和資源,一個好的transform都應該支持增量編譯
  • Transform(): 主要方法,入參TransformInvocation是一個接口,提供一些關于輸入的基本信息,利用這些接口就可以獲得編譯流程中的class文件進行操作

在apk打包過程中,除了自定義的Transform,還有系統提供原生的一些Transform,每個 Transform 在處理完之后交給下一個 Transform,是一個鏈式結構。下圖為自定義Transform實現apk打包流程中字節碼插樁的流程示意圖,簡單來說就是以下幾步:

  1. 篩選符合條件的 Class 文件,其中 Class 有兩種可能的文件來源:jar包和特定目錄;
  2. 利用ASM框架讀取 Class 文件包含的類信息(例如接口、注解等)進一步篩選符合條件的 Class 文件;
  3. 對最終符合條件的 Class 做處理(修改字節碼、插樁等);
  4. 將產物拷貝至 Transform 的輸出目錄,作為下一個 Transform 的輸入;

圖片

Part 04  實戰:APK函數耗時插樁

和家親是智慧家庭綜合服務入口APP,隨著用戶量的激增,客戶端的性能問題愈加明顯,啟動性能作為APP使用體驗的門面,啟動耗時較長很可能削減用戶使用APP的興趣。在這次的啟動至首屏專項優化中,需要查找啟動過程耗時方法并優化,由于業務復雜及SDK接入眾多,雖然也有原生工具profile,但是用過的都知道存在不易捕獲尤其是啟動階段,且無法輸出調用堆棧等問題。需要實現一個快速排查高耗時方法的工具,此次優化通過Gradle TransForm+ASM方式實現了編譯插樁全局耗時方法統計,輔助啟動優化分析,最終啟動到首屏展示耗時從4.5s將至3.2s,啟動提速30%,效果顯著。

4.1 實現思路

在性能優化階段,需要函數耗時統計以解決啟動慢、卡頓等問題。對Android打包過程和自定義Gradle插件了解后發現,java文件會先轉化為class文件,然后再轉化為dex文件。而通過Gradle插件提供的Transform API,可以在編譯成dex文件之前得到class文件。得到class文件之后,便可以通過ASM對字節碼進行修改,即可完成字節碼插樁,插入時間統計打印代碼,大于閾值則輸出調用堆棧。主要實現以下功能:

  • 自定義Gradle插件
  • 處理class,在方法出口及入口插入耗時統計
  • 文件替換

圖片

創建一個buildsrc模塊

在 Android 工程中,buildSrc 是 gradle默認的插件目錄,編譯 gradle的時候會自動識別這個目錄,因此在 buildSrc 下編寫的插件,我們可以直接進行引用。通常我們會使用這種方式進行插件的調試。創建buildSrc 目錄,配置plugin插件相關配置及依賴(新版本Gradle plugin已經支持kotlin語言編寫)。

注冊Transform

想要使用gradle-transform-api,我們必須要先實現一個gradle插件,然后在插件中注冊一個Transform,同時需要在gradle-plugins目錄的.properties文件聲明插件實現者如:

implementation-class=com.xxx.xxx.SystemTracePluginTest

圖片

獲取所有class文件

transform()通過參數inputs獲取所有class文件,包括源碼編譯后的class文件及三方的jar包。

圖片

字節碼修改及文件寫回

經過上面的步驟,我們已經到輸入文件,也確定了輸出路徑,現在我們只要來處理這些文件,然后輸出到輸出路徑就可以了。這里需要注意的是,就算你不想修改某個class文件,你也應該將它原樣拷貝過去,否則這個文件就丟失了。

圖片

利用ASM框架,在遍歷到方法出口及入口即onMethodEnter、onMethodExit回調中插入耗時統計字節碼,相應的字節碼可以用上面的工具jclaslib或者asm codeoutline查看得到。(以下代碼只是部分示例,細節完善如之針對部分包名統計、getset方法排除等未在次列出)

圖片

應用插件完成插樁

app工程apply plugin ‘pluginname’ ,Gradle task會有對應task name 輸出則Transform task執行,運行apk,可以看到插入的自定義耗時統計方法輸出,比如小編在耗時統計方法加入了邏輯,耗時超過自定義閾值logcat打印日志及堆棧信息。

圖片

通過插樁的形式,使用apk的時候可以非常清晰的統計出耗時方法,還有調用堆棧,方便后續性能優化。能夠彌補傳統的profile工具性能分析的一些不足,比如只能捕獲短時間,需要自己尋找長耗時方法等問題。

Part 05  結語 

編譯插樁這個技術應用場景越來越多,涉及的知識較多,但是相信在你熟悉Android打包流程、class字節碼文件結構、Gradle Transform API、ASM之后,相信你會覺得插樁so easy,android開發高手課之編譯插樁又get了一個新技能!在性能優化過程中,已經不止一次用到編譯插樁的技術了,除了方法耗時統計,我們還使用插樁加hook代理的方式做大圖監控,網絡監控、線程優化等工作,例如網絡數據監控 的實現,就是在 網絡層通過 hook 網絡庫方法和自動化注入攔截器的形式,實現網絡請求的全過程監控,包括獲取握手時長,首包時間,DNS 耗時,網絡耗時等各個網絡階段的信息。大圖監控則是通過hook各大圖片加載庫如Glide、picasso在圖片加載過程增加監聽計算圖片大小,針對大圖過濾輸出等。讓我們一起學習“插樁”這個效率利器吧。

參考文獻

[1]https://rebooters.github.io/2020/01/04/Gradle-Transform-ASM-%E6%8E%A2%E7%B4%A2/

[2]https://cloud.tencent.com/developer/article/1399805

[3]https://time.geekbang.org/column/intro/142?tab=catalog?

責任編輯:未麗燕 來源: 移動Labs
相關推薦

2021-02-05 07:58:03

字節碼插樁交付

2025-07-03 09:47:52

2011-08-30 16:55:31

MTK開發編譯

2020-09-08 06:28:42

大數據應用

2011-06-13 14:49:57

Qt Designer

2022-01-10 07:57:25

Linux 插樁Linux 系統

2022-05-13 09:40:51

代碼可行應用性能

2016-11-23 08:10:16

Android St JRebel調試神器

2010-03-03 15:06:52

Android 游戲開

2023-03-29 07:36:32

鏈表頭插尾插

2024-04-01 08:26:30

單測覆蓋率字節碼

2013-02-26 11:00:35

用友UAP敏捷開發跨平臺

2025-05-12 07:07:53

SpringBoot映射URL

2017-03-27 18:05:49

Linux內核編譯與開發

2009-06-11 14:11:33

代碼混淆Java反編譯

2017-06-09 09:21:44

2023-06-20 15:58:22

VMwareSpring

2020-11-26 08:38:57

前端 js 庫vue

2022-01-21 19:00:44

前端JS框架

2015-09-06 14:50:05

安卓app高效開發
點贊
收藏

51CTO技術棧公眾號

国产模特精品视频久久久久| av在线亚洲一区| 久久免费视频一区| 国产精品久久久久久久久久久久久久| 老司机福利在线观看| 成人51免费| 精品国产乱码久久久久酒店| 亚洲日本理论电影| 女人18毛片一区二区三区| 久久天天综合| 欧美精品在线观看91| 亚洲AV无码国产精品| 日韩色性视频| 精品久久久久久中文字幕| 偷拍视频一区二区| 欧美熟妇乱码在线一区| 日本女优在线视频一区二区| 久久九九国产精品怡红院| bl动漫在线观看| 亚洲tv在线| 色噜噜狠狠色综合中国| 欧美黄色免费网址| 青青影院在线观看| 91在线免费播放| 亚洲精品免费网站| 特级西西444www高清大视频| 在线日韩电影| 久久色在线播放| 国产精品久久久久久久av| 欧美激情15p| 日韩欧美国产成人一区二区| 久久人人爽av| 韩国精品主播一区二区在线观看| 亚洲午夜一区二区| 四虎永久免费网站| 1769在线观看| 久久久精品黄色| 久久av一区二区三区漫画| www夜片内射视频日韩精品成人| 喷水一区二区三区| 国产精品v片在线观看不卡| 色婷婷av国产精品| 国产精品久久久久久模特| 久久久久久久久网站| 手机av在线看| 亚洲成人二区| 久久久国产一区二区| 日韩一卡二卡在线观看| 日韩av片子| 日韩在线视频免费观看| 精品一区二区6| av伊人久久| 最新亚洲国产精品| 中国一级片在线观看| 外国成人激情视频| 日韩最新中文字幕电影免费看| 日本少妇xxxxx| 日韩dvd碟片| 久久精品国产一区二区电影| 91制片厂在线| 欧美va天堂在线| 久久91精品国产91久久久| 免费中文字幕在线| 狠狠色狠狠色综合日日tαg| 欧美精品久久久久久久久久| 国产污片在线观看| 久久人人97超碰国产公开结果| 欧美一级在线播放| 天天操天天干天天摸| 男男成人高潮片免费网站| 成人福利在线视频| 午夜精品久久久久久久第一页按摩| 国产成人免费视频网站| 国产免费一区二区三区| 免费在线高清av| 国产精品国产三级国产有无不卡| 伊人天天久久大香线蕉av色| sm国产在线调教视频| 午夜精品在线看| 久久久精品麻豆| 久久中文字幕一区二区| 日韩av中文字幕在线| 夫妇交换中文字幕| 欧美一区高清| 日本成人黄色片| 一级黄色片网站| 成人av综合一区| 日本一区免费在线观看| www.久久ai| 一本一道久久a久久精品| 精品久久久99| 老汉色老汉首页av亚洲| 中文亚洲视频在线| 国产一级在线观看视频| 日韩专区一卡二卡| av色综合网| www.中文字幕久久久| 亚洲最新视频在线观看| 亚洲性生活网站| 涩涩屋成人免费视频软件| 精品亚洲一区二区三区在线观看| 中国美女黄色一级片| 在线日韩中文| 川上优av一区二区线观看| 神马电影在线观看| 亚洲老司机在线| 成人精品小视频| 成人动态视频| 中文字幕视频在线免费欧美日韩综合在线看| 国产女人被狂躁到高潮小说| 久久一区激情| 国产美女99p| 精品黄色免费中文电影在线播放| 欧美日韩一区二区在线| 野花视频免费在线观看| 成人av资源电影网站| 7777精品久久久久久| 国产农村妇女毛片精品久久| 国产亚洲人成网站| 青青草精品视频在线| 精品国产亚洲一区二区在线观看 | 亚洲高清不卡在线| 国产一伦一伦一伦| 精品一区在线| 97国产成人精品视频| 国产av无码专区亚洲av| 中文字幕在线观看一区| 欧美丰满熟妇xxxxx| 亚洲午夜久久| 69久久夜色精品国产69乱青草| japanese国产| 亚洲欧美另类小说视频| 蜜桃福利午夜精品一区| 91视频一区| 国产日本欧美在线观看| 中国日本在线视频中文字幕| 91黄色免费版| 韩国三级hd中文字幕| 久久亚洲影院| 日本亚洲导航| 国产综合色区在线观看| 亚洲三级av在线| 中文字幕高清在线免费播放| 91丨九色porny丨蝌蚪| 日韩国产欧美亚洲| 林ゆな中文字幕一区二区| 午夜精品www| 偷拍自拍在线| 色乱码一区二区三区88| 99久久久无码国产精品性 | 亚洲精品成人在线| 亚洲av无一区二区三区久久| 亚洲九九视频| 97se视频在线观看| 欧洲中文在线| 精品国产一区二区精华| 一级片免费网址| 2023国产精品| 人人爽人人av| 91日韩视频| 粉嫩高清一区二区三区精品视频 | 久久亚洲天堂| 日韩亚洲欧美在线| 久久精品国产亚洲av麻豆色欲| 国产99久久久国产精品潘金| 美脚丝袜脚交一区二区| 天天躁日日躁成人字幕aⅴ| 日本一欧美一欧美一亚洲视频 | 欧美日韩高清区| 熟妇高潮一区二区高潮| 色婷婷av一区二区三区软件| 成人性视频免费看| 国产.欧美.日韩| 日韩免费视频播放| 成人在线免费观看视频| 亚洲影院污污.| 国产美女精品写真福利视频| 亚洲性日韩精品一区二区| 91在线观看喷潮| 天天影视涩香欲综合网| 手机毛片在线观看| 国产成人在线看| 黄色片久久久久| 91精品国偷自产在线电影| 国产精品一区二区a| 久久天堂av| 国产69精品久久久久99| 黄色av网址在线免费观看| 日韩一区二区在线看| 六月丁香激情综合| 中文字幕一区在线| 国产ts丝袜人妖系列视频| 国内精品久久久久影院色| 日韩在线一级片| 一区二区三区四区电影| 欧美日韩在线观看一区二区三区| 国产亚洲观看| 国产ts人妖一区二区三区| 神马午夜伦理不卡 | 久久一区免费| 日本少妇精品亚洲第一区| 国产成人中文字幕| 后进极品白嫩翘臀在线播放| 在线观看日韩av| 天堂av手机版| 欧美一区二区三区系列电影| 亚洲精品一区二三区| 亚洲高清免费观看| 成年人二级毛片| 欧美激情中文不卡| 51调教丨国产调教视频| 国产精品主播直播| 在线免费观看视频黄| 国产欧美不卡| 国产精品无码免费专区午夜| 日韩在线欧美| 日本一区二区三区四区高清视频| 成人知道污网站| 亚洲一区二区三区成人在线视频精品| 四虎影视4hu4虎成人| 欧美一区亚洲一区| 97久久人人超碰caoprom| 久久成年人免费电影| 日本蜜桃在线观看| 国产一区二区三区丝袜| 视频午夜在线| 亚洲精品久久久久中文字幕二区 | 国产精品igao激情视频| 久久麻豆精品| 色一情一乱一伦一区二区三区丨| 欧美一级三级| 国内精品久久国产| 国产精品对白久久久久粗| 99九九视频| 亚洲日本va午夜在线电影| 亚洲xxxx18| 亚洲成人a级片| 91久久精品久久国产性色也91| 国产精品久久久久久吹潮| 国产精品成人国产乱一区| 国产欧美一区二区三区精品酒店| 91精品国产乱码久久久久久蜜臀 | 欧美xxxbbb| 欧美激情久久久久久| 日韩另类在线| 欧美极品xxxx| bbw在线视频| 97超级碰在线看视频免费在线看| 国产黄大片在线观看| 91av在线播放视频| 亚洲欧美韩国| 国产精品成人国产乱一区 | 欧美视频精品在线| 国产又粗又大又爽| 欧美一级专区免费大片| 超碰在线人人干| 日韩av一区二区在线| 欧美拍拍视频| 中文字幕日韩av综合精品| а√天堂8资源在线官网| 欧美国产日韩一区二区三区| 99爱在线观看| 日韩av黄色在线观看| 国产精品久久久久久吹潮| 亚洲自拍偷拍区| 久久亚州av| 日本精品二区| 91精品国产成人观看| 岛国大片在线播放| 欧美中文日韩| 天堂av2020| 99视频精品在线| av永久免费观看| 亚洲男人的天堂一区二区| 97免费在线观看视频| 欧美三级资源在线| www.蜜臀av| 亚洲欧美日韩爽爽影院| 快射av在线播放一区| 高清欧美电影在线| 日本综合视频| 国产精品乱码视频| 九一精品国产| 99re6这里有精品热视频| 一区二区动漫| 日韩av影视大全| 久久综合久久综合久久综合| 成年人二级毛片| 欧美日韩亚洲激情| a网站在线观看| 亚洲欧美国产视频| 欧洲在线视频| 国产日韩欧美中文| 老司机成人在线| 性做爰过程免费播放| 亚洲一区视频| aaaaa黄色片| 日本一区二区成人| 国产精品白浆一区二小说| 欧美日韩一区二区三区四区| 免费观看黄色一级视频| 日韩在线欧美在线| 欧美黑人一区| 国产欧美日韩一区二区三区| 性欧美69xoxoxoxo| wwwwxxxx日韩| 91在线视频播放地址| 欧美成人综合色| 欧美视频一区二区在线观看| 三级视频在线看| 欧美理论电影在线播放| 外国电影一区二区| 久久精精品视频| 国产精品v亚洲精品v日韩精品| 五月婷婷六月合| 久久综合色天天久久综合图片| 久久综合激情网| 91精品国产综合久久久久久久| 秋霞欧美在线观看| 欧美成人午夜免费视在线看片 | 日本裸体美女视频| 欧洲一区在线电影| 亚洲欧美色视频| 韩国福利视频一区| 成人三级毛片| 欧美久久久久久久久久久久久久| 久久成人精品无人区| 黄色国产在线播放| 欧美色爱综合网| youjizz在线播放| 国产精品v日韩精品| 国产精品一区二区av日韩在线| 亚洲国产精品久久久久婷蜜芽| 大尺度一区二区| 国产一级免费观看| 日韩欧美色综合网站| 欧美1—12sexvideos| 99热在线国产| 国产一区日韩一区| 精品人妻一区二区免费| 亚洲五码中文字幕| 丰满人妻一区二区三区免费| 欧美激情亚洲另类| 国产精品色呦| 日本韩国欧美在线观看| 久久综合九色综合久久久精品综合| 成人免费看片98欧美| 精品亚洲aⅴ在线观看| 这里有精品可以观看| 欧美极品色图| 日本成人中文字幕| 久久嫩草捆绑紧缚| 日韩一级在线观看| 波多野结衣中文字幕久久| 国产精品一区视频网站| 99这里有精品| 永久免费成人代码| 欧美日韩一二区| 黄色网在线看| 超碰97网站| 久久久成人网| 登山的目的在线| 日韩一级大片在线观看| 成人ssswww在线播放| 欧美日本韩国国产| 久久电影网电视剧免费观看| 成人免费毛片xxx| 亚洲精品二三区| 国产激情欧美| www.国产亚洲| 91视频.com| 国产有码在线观看| 91国产精品视频在线| 日本不卡高清| 日韩女优在线视频| 色综合久久中文字幕综合网| 日韩美女网站| 国产精品久久精品国产| 久热精品在线| 美女视频久久久| 日韩精品电影网| 国产激情久久| 国产黄视频在线| 国产精品的网站| 亚州av在线播放| 96国产粉嫩美女| 性欧美暴力猛交另类hd| 26uuu成人网| 亚洲欧美激情视频| 亚洲国产视频二区| jizz欧美激情18| 亚洲国产一区二区三区| 成在在线免费视频| 国产欧美一区二区视频| 久久国产三级精品| 国产成人亚洲精品自产在线 | 国产伦精品一区二区三区在线观看| 国产无码精品久久久| 日韩中文字幕国产| 亚洲宅男网av|