1. DroidAssist輕量級的 Android 字節(jié)碼編輯插件

        聯(lián)合創(chuàng)作 · 2023-09-24 21:20

        DroidAssist  是一個輕量級的 Android 字節(jié)碼編輯插件,基于  Javassist  對字節(jié)碼操作,根據(jù) xml 配置處理 class 文件,以達到對 class 文件進行動態(tài)修改的效果。和其他 AOP 方案不同,DroidAssist 提供了一種更加輕量,簡單易用,無侵入,可配置化的字節(jié)碼操作方式,你不需要 Java 字節(jié)碼的相關知識,只需要在 Xml 插件配置中添加簡單的 Java 代碼即可實現(xiàn)類似 AOP 的功能,同時不需要引入其他額外的依賴。

        功能

        • 替換:把指定位置代碼替換為指定代碼
        • 插入:在指定位置的前后插入指定代碼
        • 環(huán)繞:在指定位置環(huán)繞插入指定代碼
        • 增強
          • TryCatch 對指定代碼添加 try catch 代碼
          • Timing 對指定代碼添加耗時統(tǒng)計代碼

        特點

        • 靈活的配置化方式,使得一個配置就可以處理項目中所有的 class 文件。
        • 豐富的字節(jié)碼處理功能,針對 Android 移動端的特點提供了例如代碼替換,添加try catch,方法耗時等功能。
        • 簡單易用,只需要依賴一個插件,處理過程以及處理后的代碼中也不需要添加額外的依賴。
        • 處理速度較快,只占用較少的編譯時間。

        使用指南

        DroidAssist 適用于 Android Studio 工程 application model 或者 library model,使用 DroidAssist 需要接入 DroidAssist 插件并編寫專有配置文件。

        在 root project 的 build.gradle 里添加:

        dependencies {
            classpath "com.didichuxing.tools:droidassist:1.0.8"
        }

        在需要處理的 model project 的 build.gradle 里添加:

        apply plugin: 'com.didichuxing.tools.droidassist'
        droidAssistOptions {
            config file("droidassist.xml"),file("droidassist2.xml") //插件配置文件(必選配置,支持多配置文件)
        }

        其他配置:

        • enable 如果需要停用 DroidAssist 插件功能,可以添加 enable false 以停用插件 (可選配置)
        • logLevel 日志輸出等級:0 關閉日志輸出,1 輸出日志到控制臺 2 輸出日志到文件 3 輸出日志到控制臺以及日志 (可選配置)
        • logDir 日志輸出目錄,當日志輸出到文件時,默認的輸出目錄是當前 model 的 build/outputs/logs 目錄 (可選配置)

        示例

        下面例子將把項目中所有使用系統(tǒng) android.util.Log 類進行 DEBUG 日志輸出的代碼替換為自定義的日志輸出類,以方便對線上日志進行策略化,動態(tài)化管理。

        <Replace>
            <MethodCall>
                <Source>
                   int android.util.Log.d(java.lang.String,java.lang.String)
                </Source>
                <Target>
                    $_=com.didichuxing.tools.test.LogUtils.log($1,$2);
                </Target>
            </MethodCall>
        </Replace>

        處理前的class:

        public class MainActivity extends Activity {
            public static final String TAG = "MainActivity";
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.d(TAG, "MainActivity onCreate");
            }
        }

        處理后的 class:

        public class MainActivity extends Activity {
            public static final String TAG = "MainActivity";
        
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                String var2 = "MainActivity";
        	    String var3 = "MainActivity onCreate";
                int var4 = LogUtils.log(var2, var3); // The target method using custom log method.
            }
        }

        完整文檔

        完整開發(fā)文檔和配置見 開發(fā)文檔wiki

        局限

        1. 由于 Javassist 的機制,DroidAssist 在處理的過程中將會產生額外的局部變量用以指向參數(shù)變量和保存返回值,但處理后有一些局部變量并沒有實際作用。
        2. DroidAssist 在處理某些代碼時可能會新增一些額外的代理方法。
        3. DroidAssist 插件用于 library model 只能處理 Java 源碼產生的 class,不能處理本地依賴中的 jar 。
        瀏覽 11
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
          
          

            1. 亚洲狼人久久久精品 | 亚洲春色在线视频 | 少妇操BBBB操BBB操毛片 | 国产777爽777 | 日本三级欧美三级久久久久 |