天天看點

[Android]Gradle 插件 DiscardFilePlugin(class注入&清空類和方法)Android Gradle 插件 DiscardFilePlugin(清空類和方法)

以下内容為原創,歡迎轉載,轉載請注明

An android gradle plugin for discard class or method in compile time.

用于在編譯建構時期忽略清空類和方法的一個Android Gradle插件。

在實際的生産中,我們總是會在我們的app中增加一些調試的工具,比如在<code>debug</code>模式下加入<code>DebugPanelActivity</code>(調試面闆工具頁面,提供比如“切換伺服器”等操作)。我們需要在正式上線的release版本中清空相關類和方法,或者修改<code>boolean isProductionEnvironment()</code>方法,讓它永遠傳回<code>true</code>,以此來避免上線之後調試相關代碼通過反編譯等手段暴露出來。

<code>ElementType.METHOD</code>: 表示清空方法中的代碼,編譯過程中該方法中代碼被清空。

<code>ElementType.TYPE</code>: 表示清空類,其實是清空類中的所有方法。

<code>apply</code>參數規範:<code>key==exceptValue</code>

表示當<code>key==exceptValue</code>時,Discard才會生效,才會真正在編譯時去對方法或者類進行清空。是以可以在每個方法或者類中去進行不同的配置,在不同狀态下通過如下方式對不同方法進行Discard:

使用<code>gradle assembleDebug -Ptest1=true -Ptest2=false</code>來建構時,<code>testMethod_1()</code>方法會被discard,而<code>testMethod_2()</code>不會被discard。建構完畢反編譯class結果如下:

替換方法的方法體,如果不設定,預設discard方法實作:

傳回類型為<code>void</code>: discard後方法體為<code>{}</code>

傳回類型為原始資料類型:discard後方法傳回預設值,比如<code>{ return 0; }</code>

傳回類型為類對象時: discard後方法傳回為<code>{ return null; }</code>

可以如下填寫具體的方法體代碼塊:

discard之後的class反編譯代碼如下:

可以在這裡指定具體的類名,在discard時對未在classPath的類進行make。不常用,可以省略。

表示該方法或者類的discard是否開啟,預設為<code>true</code>,比較典型的場景為,在類上面增加<code>@Discard</code>對該類所有方法進行discard,但是需要某個方法不discard,這時可以使用<code>@Discard(enable = false)</code>來對方法進行排除在<code>discard</code>範圍外。

<code>build.gradle</code> in Project:

<code>build.gradle</code> in <code>app</code> or <code>library</code>:

建立自定義apply配置(<code>publish</code>和<code>disable</code>兩種apply配置):

在需要清空的類上添加<code>@Discard</code>注解,<code>apply = ApplyConstants.Publish._TRUE</code>表示隻有在<code>publish=true</code>的情況下,才會執行Discard。

通過以下指令進行建構:

指令編譯完成之後,該類的<code>class</code>檔案将會根據配置的<code>@Discard</code>注解被自動修改成如下:

繼續閱讀