日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字节码技术在模块依赖分析中的应用

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节码技术在模块依赖分析中的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

近年來,隨著手機業務的快速發展,為滿足手機端用戶訴求和業務功能的迅速增長,移動端的技術架構也從單一的大工程應用,逐步向模塊化、組件化方向發展。以高德地圖為例,Android 端的代碼已突破百萬行級別,超過100個模塊參與最終構建。

試想一下,如果沒有一套標準的依賴檢測和監控工具,用不了多久,模塊的依賴關系就可能會亂成一鍋粥。

從模塊 Owner 的角度看,為什么依賴分析這么重要?

1.作為模塊 Owner,我首先想知道“誰依賴了我?依賴了哪些接口”。唯有如此才能評估本模塊改動的影響范圍,以及暴露的接口的合理性。

2.我還想知道“我依賴了誰?調用了哪些外部接口”,對所需要的外部能力做到心中有數。

從全局視角看,一個健康的依賴結構,要防止“下層模塊”直接依賴“上層模塊”,更要杜絕循環依賴。通過分析全局的依賴關系,可以快速定位不合理的依賴,提前暴露業務問題。

因此,依賴分析是研發過程中非常重要的一環。

常見的依賴分析方式

提到 Android 依賴分析,首先浮現在腦海中的可能是以下這些方案:

  • 分析 Gradle 依賴樹。
  • 掃描代碼中的?import?聲明。
  • 使用 Android Studio 自帶的分析功能。

我們逐個來分析這幾個方案:

1. Gradle 依賴樹

使用?./gradlew :<module>:dependencies --configuration releaseCompileClasspath -q?命令,很容易就可以得到模塊的依賴樹,如圖:

不難發現,這種方式有兩個問題:

  • 聲明即依賴,即使代碼中沒有使用的庫,也會輸出到結果中。
  • 只能分析到模塊級別,無法精確到方法級別。

2. 掃描?import?聲明

掃描 Java 文件中的 import 語句,可以得到文件(類)之間的調用關系。

因為模塊與文件(類)的對應關系非常容易得到(掃描目錄)。所以,得到了文件(類)之間的依賴關系,即是得到了模塊之間文件(類)級別的依賴關系。

這個方案相比 Gradle 依賴掃描提升了結果維度,可以分析到文件(類)級別。但是它也存在一些缺點:

  • 無法處理 import * 的情況。
  • 掃描“有 import 但未使用對應類”的場景效率太低(需要做源碼字符串查找)。

3. 使用 IDE 自帶的分析功能

觸發 Android Studio 菜單 「Analyze」 -> 「Analyze Dependencies」,可以得到模塊間方法級別的依賴關系數據。如圖:

Android Studio 能準確分析到模塊之間“方法級別”的引用關系,支持在 IDE 中跳轉查看,也能掃描到對 Android SDK 的引用。

這個方案比前面兩個都優秀,主要是準確。但是它也有幾個問題:

  • 耗時較長:全面分析 AMap 全源碼,大約需要 10 分鐘。
  • 分析結果無法為第三方復用,無法生成可視化的依賴關系圖。
  • 分析正向依賴和逆向依賴,需要掃描兩次。

總結一下上述三種方案:Gralde 依賴基于工程配置,粒度太粗且結果不準。“Import 掃描方案”能拿到文件級別依賴但數據不全。IDE 掃描雖然結果精準,但是數據復用困難,不便于工程化。

為什么要使用字節碼來分析?

參考 Android 構建流程圖,所有的 Java 源代碼和 aapt 生成的 R.java 文件,都會被編譯成 .class 文件,再被編譯為 dex 文件,最終通過 apkbuilder 生成到 apk 文件中。圖中的 .class 文件即是我們所說的 Java 字節碼,它是對 Java 源碼的二進制轉義。

在 Android 端,常見的字節碼應用場景包括:

  • 字節碼插樁:用于實現對 UI 、內存、網絡等模塊的性能監控。
  • 修改 jar 包:針對無源碼的庫,通過編輯字節碼來實現一些簡單的邏輯修改。

回到本文的主題,為什么要分析字節碼,而不是 Java 代碼或者 dex 文件?

不使用 Java 代碼是因為有些庫以 jar 或者 aar 的方式提供,我們獲取不到源碼。不使用 dex 文件是因為它沒有好用的語法分析工具。所以解析字節碼幾乎是我們唯一的選擇。

如何使用字節碼分析依賴關系?

要得到模塊之間的依賴關系,其實就是要得到“模塊間類與類”之間的依賴關系。而要確定類之間的關系,分析類字節碼的語句即可。

1. 在什么時機來分析?

了解 Android 構建流程的同學,應該對 transform 這個任務不陌生。它是 Android Gradle 插件提供的一個字節碼 Hook 入口。

在 transform 這個任務中,所有的字節碼文件(包括三方庫) 以 Input 的格式輸入。

以JarInput 為例,分析其 file 字段,可得到模塊的名稱。解析 file 文件,即可得到此模塊所有的字節碼文件。

有了模塊名稱和對應路徑下的 class 文件,就建立了模塊與類的對應關系,這是我們拿到的第一個關鍵數據。

2. 使用什么工具分析?

解析 Java 字節碼的工具,最常用的包括 Javassit,ASM,CGLib。ASM 是一個輕量級的類庫,性能較好,但需要直接操作 JVM 指令。CGLib 是對 ASM 的封裝,提供了更高級的接口。

相比而言,Javassist 要簡單的多,它基于 Java 的 API ,無需操作 JVM 指令,但其性能要差一些(因為 Javassit 增加了一層抽象)。在工程原型階段,為了快速驗證結果,我們優先選擇了 Javassit 。

3. 具體方案是怎樣的?

先看一個簡單的示例,如何分析下面這段代碼的調用關系:

1: package com.account; 2: import com.account.B; 3: public class A { 4: void methodA() { 5: B b = new B(); // 初始化了 Class B 的實例 b 6: b.methodB(); // 調用了 b 的 methodB 方法 7: } 8: }

第1步:初始化環境,加載字節碼 A.class,注冊語句分析器。

// 初始化 ClassPool,將字節碼文件目錄注冊到 Pool 中。 ClassPool pool = ClassPool.getDefault(); pool.insertClassPath('<class文件所在目錄>') // 加載類A CtClass cls = pool.get("com.account.A"); // 注冊表達式分析器到類A MyExprEditor editor = new MyExprEditor(ctCls) ctCls.instrument(editor)

第2步:自定義表達式解析器,分析類A(以解析語句調用為例)。

class MyExprEditor extends ExprEditor {

@Override void edit(MethodCall m) {// 語句所在類的名稱def clsAName = ctCls.name// 語句在哪個方法被調用def where = m.where().methodInfo.getName()// 語句在哪一行被調用def line = m.lineNumber// 被調用類的名稱def clsBName = m.className// 被調用的方法def methodBName = m.methodName } // 省略其它解析函數 ...

}

ExprEditor 的 edit(MethodCall m) 回調能攔截 Class A 中所有的方法調用(MethodCall)。

除了本例中對 MethodCall 的解析,它還支持解析 new,new Array,ConstructorCall,FieldAccess,InstanceOf,強制類型轉換,try-catch 語句。

解析完 Class A,我們得到了 A 對 B 的依賴信息 :


Class1Class2Exprmethod1method2lineNo
com.account.Acom.account.BNewExprmethodA?5
com.account.Acom.account.BmethodCallmethodAmethodB6

------------------- -------------------------------------------------------
簡單解釋如下:
類 com.account.A 的第5行(methodA方法內),調用了 com.account.B 的構造函數;
類 com.account.A 的第6行(methodA方法內),調用了 com.account.B 的 methodB 函數;
這便是“類和類之間方法級”的依賴數據。結合第1步得到的“模塊和類”的對應關系,最終我們便獲得了“模塊間方法級的依賴數據”。

基于這些基礎數據,我們還可以自定義依賴檢測規則、生成全局的模塊依賴關系圖等,本文就不展開了。

小結

本文主要介紹了模塊依賴分析在研發過程中的重要性,分析了 Android 常見的依賴分析方案,從 Gradle 依賴樹分析, Import 掃描,使用 IDE 分析,到最后的字節碼解析,方案逐步遞進。越是接近源頭的解法,才是越根本的解法。


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的字节码技术在模块依赖分析中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人免费播放 | 欧美一级成人 | 都市乱淫| 色a在线 | 91视频专区 | 亚洲偷怕| 日韩欧美高清一区 | 少妇性高潮视频 | 日本老师巨大bbw丰满 | 影音先锋中文字幕第一页 | 精品免费av | 亚洲精品99久久久久中文字幕 | 人人插人人草 | c逼视频 | 一区二区在线不卡 | 天天尻逼 | 91蜜臀精品国产自偷在线 | 国产一区二区视频在线观看免费 | 欧美狠狠干 | 一级中文片 | 国产欧美精品一区 | 鸭子av| 国产一区二区高清视频 | 黄色无毒网站 | 91二区 | 国产精品无码一区二区桃花视频 | 欧美一二三区视频 | 麻豆传媒映画官网 | 污片在线看 | 成人免费激情视频 | 国产性精品 | 亚洲精选一区二区 | www成人免费视频 | 午夜爽爽视频 | 2020自拍偷拍 | 久久中文字幕在线 | 亚洲精品在线免费观看视频 | 亚洲色图偷拍 | 日韩中文字幕二区 | 污动漫网站 | 99久在线精品99re8热 | 亚洲成人网在线观看 | 国产尤物精品 | 精品国产乱码久久久久久1区二区 | 超薄肉色丝袜一区二区 | 久久久久久久中文字幕 | 1769国产精品视频 | 亚洲色图图片 | 亚洲免费观看高清完整版在线 | jul023被夫上司连续侵犯 | 精品人妻人人做人人爽 | 日韩欧美在线视频免费观看 | 一二三区在线视频 | 日本a级黄| 狠狠涩 | 操人小视频 | 欧美三级午夜理伦三级小说 | www.亚洲人| 日韩精品免费一区二区夜夜嗨 | 中文字字幕在线中文乱码电影 | 午夜精品久久久久久久96蜜桃 | 亚洲动漫精品 | 国产美女无遮挡永久免费 | 国产99久久久国产精品免费看 | 欧美日韩国产精品成人 | 幸福宝在线观看 | 91免费视 | 国产日韩一级片 | 亚洲一区中文字幕在线观看 | 性视频免费看 | 亚洲欧美一区二区三区在线观看 | 欧美在线免费观看视频 | 亚洲无码精品一区二区三区 | 成人无码久久久久毛片 | 久久精品高清 | 精品人妻大屁股白浆无码 | 日韩一级二级三级 | 国产在线欧美在线 | 在线播放www | 午夜资源 | 激情午夜av | 办公室摸腿吻胸激情视频 | 上海贵妇尝试黑人洋吊 | 久久国产精品波多野结衣 | 成人激情自拍 | 亚洲精品香蕉 | 色呦呦视频在线观看 | 精东影业一区二区三区 | 欧美激情性生活 | av中文字幕免费 | 中文一区二区在线播放 | 一区二视频| 成人免费福利视频 | 手机在线观看av网站 | 欧美日韩成人免费观看 | 日韩人妻精品一区二区三区视频 | 男人的天堂在线视频 | 人妻激情偷乱频一区二区三区 | 亚洲婷婷一区 |