2013-12-16 69 views
7

我已將ProGuard應用於我的Android應用程序。爲什麼Proguard在Android中保留Activity類?

我使用

android-studio/sdk/tools/proguard/proguard-android.txt 

作爲配置文件,變着法子。

在這個文件中,我可以看到關於活動唯一的語句:

We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

它不同於活動類名被ProGuard的obfusctated而被保留的一些方法,因爲它們是如下。這是可以理解的。

然而,在我的應用程序,然後使用

Class.forName("my.app.MyActivity") 

然後我開始這個活動的字符串創建活動類,它開始罰款。

但這意味着活動派生的類不會被混淆?。它應該失敗,因爲ProGuard沒有指令Activity,它只有-keepclassmembers.

有人請解釋,如果我可以依靠我觀察到的行爲?或者我誤解-keepclassmembers指令?

+0

您應該發佈整個文件,因爲僅有這一行不足以解釋爲什麼它保留活動名稱 – Raffaele

回答

9

因爲活動列在清單和類引用自動保存。這是需要的,因爲Android框架通過反射訪問這些應用程序入口點。

here

構建過程運行該工具AAPT自動創建基於AndroidManifest.xml和其他XML文件中的配置文件bin/proguard.txt。構建過程然後將配置文件傳遞給ProGuard。所以ProGuard本身確實不考慮AndroidManifest.xml,但是aapt + ProGuard可以。

3

ProGuard FAQ

不ProGuard的手柄的Class.forName電話?

是的。 ProGuard自動處理類似Class.forName(「SomeClass」)和SomeClass.class的構造。被引用的類保存在收縮階段,字符串參數在混淆階段被正確替換。 對於可變字符串參數,通常不可能確定它們的可能值。例如,它們可能從配置文件中讀取。但是,ProGuard會注意許多類似「(SomeClass)Class.forName(variable).newInstance()」的構造。這些可能表明類或接口SomeClass和/或其實現可能需要保留。開發人員可以相應地調整他的配置。

因此,ProGuard比您預期的要聰明:它會自動檢測並處理使用forName()的簡單案例。即使該類未在Android清單文件中引用,ProGuard也會在forName()的調用中混淆類中的類名稱。

對於活動,如果您被這種行爲和Android專用輸入ProGuard雙重覆蓋,這是構建過程的一部分,就像@laalto在他的回答中提到的那樣,這並不會讓我感到驚訝。