2012-12-18 209 views
1

我正在使用Proguard來混淆我的代碼。所以,我在project.propertise文件中激活它。Android,Proguard究竟做了什麼?

之後,我通過apktool反編譯APK文件。

反編譯文件中有三個項目,res,smali和AndroidManifest。 在res文件夾中,我可以清楚地看到我的圖像:) 在smali中,這並不容易理解,但我仍然可以找到我的代碼。它是這樣的:

.method public static u()Ljava/lang/String; 
    .locals 1 

    const/4 v0, 0x1 

    packed-switch v0, :pswitch_data_0 

    const-string v0, "https://uat.somewhere.com/ebroking/wecos/mobiletrader/aboutus.html" 

    :goto_0 
    return-object v0 

    :pswitch_0 
    const-string v0, "https://www2.somewhere.com/ebroking/wecos/mobiletrader/aboutus.html" 

    goto :goto_0 

    :pswitch_data_0 
    .packed-switch 0x1 
     :pswitch_0 
    .end packed-switch 

如果我去包名(活動),有幾個文件,如a.smali,aa.smali,ab.smali,ac.smali等。另外,在此我可以看到我所有的活動。例如,在我的應用程序中,我有一個名爲MSAboutUs的活動。在smali文件夾中,其名稱是MSAboutUs.smali。當我打開它時,我可以看到以下代碼:

.class public Lcom/pbb/mystock/activities/MSAboutUs; 
.super Lcom/pbb/mystock/activities/ay; 


# instance fields 
.field private j:Landroid/widget/Button; 

.field private k:Landroid/webkit/WebView; 


# direct methods 
.method public constructor <init>()V 
    .locals 0 

    invoke-direct {p0}, Lcom/pbb/mystock/activities/ay;-><init>()V 

    return-void 
.end method 


# virtual methods 
.method public onCreate(Landroid/os/Bundle;)V 
    .locals 3 

    invoke-super {p0, p1}, Lcom/pbb/mystock/activities/ay;->onCreate(Landroid/os/Bundle;)V 

    const v0, 0x7f030004 

    invoke-virtual {p0, v0}, Lcom/pbb/mystock/activities/MSAboutUs;->setContentView(I)V 

    const-string v0, "" 

    const-string v1, "Loading..." 

    const/4 v2, 0x1 

    invoke-static {p0, v0, v1, v2}, Landroid/app/ProgressDialog;->show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Landroid/app/ProgressDialog; 

    move-result-object v0 

    iput-object v0, p0, Lcom/pbb/mystock/activities/MSAboutUs;->a:Landroid/app/ProgressDialog; 

    const v0, 0x7f060008 

    invoke-virtual {p0, v0}, Lcom/pbb/mystock/activities/MSAboutUs;->findViewById(I)Landroid/view/View; 

    move-result-object v0 

    check-cast v0, Landroid/webkit/WebView; 

    iput-object v0, p0, Lcom/pbb/mystock/activities/MSAboutUs;->k:Landroid/webkit/WebView; 

    iget-object v0, p0, Lcom/pbb/mystock/activities/MSAboutUs;->k:Landroid/webkit/WebView; 

    new-instance v1, Lcom/pbb/mystock/activities/a; 

    invoke-direct {v1, p0}, Lcom/pbb/mystock/activities/a;-><init>(Lcom/pbb/mystock/activities/MSAboutUs;)V 

    invoke-virtual {v0, v1}, Landroid/webkit/WebView;->setWebViewClient(Landroid/webkit/WebViewClient;)V 

    iget-object v0, p0, Lcom/pbb/mystock/activities/MSAboutUs;->k:Landroid/webkit/WebView; 

    invoke-static {}, Lcom/pbb/mystock/a/b;->u()Ljava/lang/String; 

    move-result-object v1 

    invoke-virtual {v0, v1}, Landroid/webkit/WebView;->loadUrl(Ljava/lang/String;)V 

    const v0, 0x7f060007 

    invoke-virtual {p0, v0}, Lcom/pbb/mystock/activities/MSAboutUs;->findViewById(I)Landroid/view/View; 

    move-result-object v0 

    check-cast v0, Landroid/widget/Button; 

    iput-object v0, p0, Lcom/pbb/mystock/activities/MSAboutUs;->j:Landroid/widget/Button; 

    iget-object v0, p0, Lcom/pbb/mystock/activities/MSAboutUs;->j:Landroid/widget/Button; 

    new-instance v1, Lcom/pbb/mystock/activities/b; 

    invoke-direct {v1, p0}, Lcom/pbb/mystock/activities/b;-><init>(Lcom/pbb/mystock/activities/MSAboutUs;)V 

    invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V 

    const v0, 0x7f060009 

    invoke-virtual {p0, v0}, Lcom/pbb/mystock/activities/MSAboutUs;->findViewById(I)Landroid/view/View; 

    move-result-object v0 

    check-cast v0, Landroid/widget/Button; 

    const v1, 0x7f06000a 

    invoke-virtual {p0, v1}, Lcom/pbb/mystock/activities/MSAboutUs;->findViewById(I)Landroid/view/View; 

    move-result-object v1 

    check-cast v1, Landroid/widget/HorizontalScrollView; 

    invoke-virtual {p0, v0, v1}, Lcom/pbb/mystock/activities/MSAboutUs;->a(Landroid/widget/Button;Landroid/widget/HorizontalScrollView;)V 

    invoke-virtual {p0}, Lcom/pbb/mystock/activities/MSAboutUs;->d()V 

    return-void 
.end method 

.method public onKeyDown(ILandroid/view/KeyEvent;)Z 
    .locals 1 

    const/4 v0, 0x4 

    if-ne p1, v0, :cond_0 

    const/high16 v0, 0x7f04 

    invoke-virtual {p0, v0}, Lcom/pbb/mystock/activities/MSAboutUs;->getString(I)Ljava/lang/String; 

    move-result-object v0 

    invoke-virtual {p0, v0}, Lcom/pbb/mystock/activities/MSAboutUs;->b(Ljava/lang/String;)V 

    :cond_0 
    const/4 v0, 0x0 

    return v0 
.end method 

這與其他活動相同。我可以看到登錄活動EditTexts和按鈕。我確信花幾個小時才能理解什麼是架構,然後操縱代碼。

所以我的問題是Progaurd究竟在做什麼?我認爲它改變了類,方法和變量的名稱,但似乎沒有任何改變。

在應用prject.properties我已經加入這一行:

proguard.config=proguard.cfg 

proguard.cfg包括這些行:

# This is a configuration file for ProGuard. 
# http://proguard.sourceforge.net/index.html#manual/usage.html 

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-verbose 

# Optimization is turned off by default. Dex does not like code run 
# through the ProGuard optimize and preverify steps (and performs some 
# of these optimizations on its own). 
-dontoptimize 
-dontpreverify 
# Note that if you want to enable optimization, you cannot just 
# include optimization flags in your own project configuration file; 
# instead you will need to point to the 
# "proguard-android-optimize.txt" file instead of this one from your 
# project.properties file. 

-keepattributes *Annotation* 
-keep public class com.google.vending.licensing.ILicensingService 
-keep public class com.android.vending.licensing.ILicensingService 

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 

# keep setters in Views so that animations can still work. 
# see http://proguard.sourceforge.net/manual/examples.html#beans 
-keepclassmembers public class * extends android.view.View { 
    void set*(***); 
    *** get*(); 
} 

# 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); 
} 

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

# The support library contains references to newer platform versions. 
# Don't warn about those in case this app is linking against an older 
# platform version. We know about them, and they are safe. 
-dontwarn android.support.** 

# Remove all logs 
-assumenosideeffects class android.util.Log { 
    public static *** v(...); 
    public static *** d(...); 
    public static *** i(...); 
    public static *** w(...); 
    public static *** e(...); 
} 

-keepattributes JavascriptInterface 
-keep public class com.pbb.mystock.activities.MSLogin2$MyJavaScriptInterface 
-keep public class * implements com.pbb.mystock.activities.MSLogin2$JavaScriptInterface 
-keepclassmembers class com.pbb.mystock.activities.MSLogin2$JavaScriptInterface { 
    void processHTML(***); 
} 
+0

你的標題問「...... Proguard究竟做了什麼?並在你的問題中陳述「我正在使用Proguard來混淆我的代碼」。 - 儘管我懷疑你不理解混淆的含義,但你基本上已經回答了你自己的問題。混淆意味着「隱藏」或「混淆」。換句話說,Proguard只是簡單地直接解釋apk中的代碼而已。這並不意味着它會加密或使其100%安全。 – Squonk

+0

謝謝Squonk,是的你是對的,但我期望當我隱藏或混淆某些事物時我再也看不清楚了。這就是爲什麼我問它是什麼。如果它是混淆因此我不應該看清楚我的班級名稱。那麼,它在做什麼?可能尼古拉的答案是對的。 – Hesam

回答

4

它做同樣的事情,因爲它在其他平臺上,看到FAQ爲細節。在Andorid上,您必須保留清單中定義的活動,服務和其他組件的名稱,因爲操作系統按名稱引用它們。生命週期方法也是如此,例如onCreate()。資源不會以任何方式修改。非組件類(POJO)將被重命名,其方法和字段也將被重命名。它最終取決於您使用的配置文件的內容。

正如您已經注意到的那樣,這並不完全隱藏您的代碼,沒有任何作用。反編譯時只會讓閱讀變得更加困難。你可以嘗試DexGuard,它可以做更多的事情,但最終如果有人足夠肯定,他們可以反轉你的代碼(本地代碼也是如此)