2016-08-05 82 views
5

據我所知,有些類不應該被模糊處理,而且它們的名稱也必須像「活動」一樣保留下來。不過,我希望我的代碼中的其他類和包被重命名。 這裏是build.gradle應用程序文件夾中: 應用插件: 'com.android.application'Android:用於混淆類名稱和方法的Proguard配置

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "apt.eve.good.morning" 
     minSdkVersion 14 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 


} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:support-v4:23.4.0' 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
} 

我用這個proguard的配置我的應用程序(app\proguard-rules.pro):

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-useuniqueclassmembernames 
-verbose 

-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*(); 
} 
-allowobfuscations class * 
# 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); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator 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.** 

# Understand the @Keep support annotation. 
-keep class android.support.annotation.Keep 

-keep @android.support.annotation.Keep class * {*;} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <methods>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <fields>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <init>(...); 
} 

它做優化,但作爲我檢查了我的classses.dex裏面所有的類名都沒有改變。所以我想知道我在配置文件中錯過了什麼,它不會混淆類/方法名稱?

P.S.1我搜查了幾個問題,但我無法想象這裏有什麼問題。

P.S.2我已經正確配置了我的android studio,並且對proguard配置所作的更改在我的發佈的.apk文件中無任何問題。

+0

發表您的gradle這個build文件 – petey

+0

你在哪裏檢查混淆的結果呢?我不是100%確定的,但我認爲在我的項目中,混淆的'.dex'文件位於'build/intermediates/transforms/dex/**'中,'build/**'中的任何其他類/ dex看起來都像在混淆之前輸出構建步驟。最終,生成的'.apk' /'.aar'應該被模糊處理,所以如果你正在解壓那個,並且這些類沒有被模糊處理,那麼某些東西不能按預期工作。 – Ped7g

+0

@ Ped7g我使用dex2jar將我的apk內的dex轉換爲jar文件。然後,我使用[jd-gui](http://jd.benow.ca/#jd-gui-overview)來反編譯jar文件,當我檢查代碼中沒有名稱混淆。所有班級和包裹都保持同名。 – VSB

回答

6

確保您檢查了混淆的.dex文件。

使用常見的gradle構建腳本,build/**文件夾可能包含幾個未混淆的.dex/.class文件版本。

最終,生成的.apk/.aar文件應該被模糊處理,所以如果您要解壓縮那個文件並且這些類沒有被模糊處理,那麼某些東西不能按預期工作。

正如OP指出的那樣,驗證[反彙編]工具正常工作也很重要。

從.apk查看.dex的二進制形式通常足以發現[un]混淆符號(嘗試使用未混淆的.class,即使在文本編輯器中,該符號也易於閱讀,在混淆的.dex符號鏈中, aa「,」ab「,...也經常可見)。

還手動運行gradle proguard任務以及詳細選項可能有助於識別proguard是否運行以及哪些文件。

+0

皮特伊建議檢查地圖文件好得多,只要確保它是新鮮的(修改datetime == cca。build),並且您可以輕鬆檢查所有混淆的符號(並按照預期搜索「敏感」符號以驗證它們是否被模糊化)。無需任何其他工具即可獲得混淆成功的詳細概述。 (和我的二進制方法可以用來驗證.apk真的包含預期的結果,因爲映射文件表明...如果你真的偏執狂)。 – Ped7g

1

你已經改變

minifyEnabled=true 

裏面的應用程序 - >的build.gradle?

buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
3

基於你的gradle文件(minifyEnabled=true)和proguard配置。你看起來已經很好。

要快速確認您的應用混淆了您的類,請在製作發佈版本時檢查生成的mapping.txt文件。此文件「提供了原始和混淆的類,方法和字段名稱之間的轉換。」

這裏是一個映射的例子。TXT是obsfucates一個hockeyapp庫:

net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a: 
    java.util.Queue queue -> a 
    boolean downloadRunning -> b 
    67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a 

地段的詳細信息可以在這裏的「縮小你的代碼和資源」的文章中找到:https://developer.android.com/studio/build/shrink-code.html