為了防止自己的勞動成果被别人竊取,混淆代碼能有效防止被反編譯,下面來總結以下混淆代碼的步驟:
1. 大家也許都注意到建立一個工程會看到項目下邊有這樣proguard-project.txt一個檔案,這個對混淆代碼很重要,如果你不小心删掉了,沒關系,從其他地方拷貝一個過來
2. 最重要的就是在proguard-project.txt添加混淆的申明了:
a. 把所有你的jar包都申明進來,例如: -libraryjars libs/apns_1.0.6.jar -libraryjars libs/armeabi/libbaidumapsdk_v2_3_1.so -libraryjars libs/armeabi/liblocsdk4.so -libraryjars libs/baidumapapi_v2_3_1.jar -libraryjars libs/core.jar -libraryjars libs/gesture-imageview.jar -libraryjars libs/gson-2.0.jar -libraryjars libs/infogracesound.jar -libraryjars libs/locsdk_4.0.jar -libraryjars libs/ormlite-android-4.48.jar -libraryjars libs/ormlite-core-4.48.jar -libraryjars libs/universal-image-loader-1.9.0.jar b. 将你不需要混淆的部分申明進來,因為有些類經過混淆會導緻程式編譯不通過,如下: -keep public class * extends android.app.fragment -keep public class * extends android.app.activity -keep public class * extends android.app.application -keep public class * extends android.app.service -keep public class * extends android.content.broadcastreceiver -keep public class * extends android.content.contentprovider -keep public class * extends android.app.backup.backupagenthelper -keep public class * extends android.preference.preference -keep public class * extends android.support.v4.** -keep public class com.android.vending.licensing.ilicensingservice --以上都是api裡邊的類,最好都要避免混淆 有些很特殊的,例如百度地圖,你需要添加以下申明: -keep class com.baidu.** { *; } -keep class vi.com.gdi.bgl.android.**{*;} 根據我的經驗,一般model最好避免混淆(model無關緊要,不混淆也沒多大關系)如: -keep class com.bank.pingan.model.** { *; } 下面在貼上關于umeng分享統計的避免混淆的申明 -dontwarn android.support.v4.** -dontwarn org.apache.commons.net.** -dontwarn com.tencent.** -keepclasseswithmembernames class * { native <methods>; } public <init>(android.content.context, android.util.attributeset); public <init>(android.content.context, android.util.attributeset, int); -keepclassmembers enum * { public static **[] values(); public static ** valueof(java.lang.string); -keep class * implements android.os.parcelable { public static final android.os.parcelable$creator *; -keepclasseswithmembers class * { public <init>(android.content.context); -dontshrink -dontoptimize -dontwarn com.google.android.maps.** -dontwarn android.webkit.webview -dontwarn com.umeng.** -dontwarn com.tencent.weibo.sdk.** -dontwarn com.facebook.** -keep enum com.facebook.** -keepattributes exceptions,innerclasses,signature -keepattributes *annotation* -keepattributes sourcefile,linenumbertable -keep public interface com.facebook.** -keep public interface com.tencent.** -keep public interface com.umeng.socialize.** -keep public interface com.umeng.socialize.sensor.** -keep public interface com.umeng.scrshot.** -keep public class com.umeng.socialize.* {*;} -keep public class javax.** -keep public class android.webkit.** -keep class com.facebook.** -keep class com.umeng.scrshot.** -keep public class com.tencent.** {*;} -keep class com.umeng.socialize.sensor.** -keep class com.tencent.mm.sdk.openapi.wxmediamessage {*;} -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.wxmediamessage$imediaobject {*;} -keep class im.yixin.sdk.api.yxmessage {*;} -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.yxmessage$yxmessagedata{*;} -keep public class [your_pkg].r$*{ public static final int *;
3.以上工作完成,混淆工作就完成了一大半了,最後需要做的就是在project.properties檔案中加上你的混淆檔案申明了,如下:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
4. ok, 最後一步,打簽名包測試,如果有問題,仔細看下log也許有得類不能混淆,那麼你得加入到proguard-project.txt檔案中
-------以上就是混淆代碼的全過程了
最後貼上proguard-project.txt的全部代碼:
# to enable proguard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# add project specific proguard rules here.
# by default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# you can edit the include path and order by changing the proguard
# include property in project.properties.
# for more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# add any project specific keep options here:
# if your project uses webview with js, uncomment the following
# and specify the fully qualified class name to the javascript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes *annotation*
-keepattributes signature
-libraryjars libs/apns_1.0.6.jar
-libraryjars libs/armeabi/libbaidumapsdk_v2_3_1.so
-libraryjars libs/armeabi/liblocsdk4.so
-libraryjars libs/baidumapapi_v2_3_1.jar
-libraryjars libs/core.jar
-libraryjars libs/gesture-imageview.jar
-libraryjars libs/gson-2.0.jar
-libraryjars libs/infogracesound.jar
-libraryjars libs/locsdk_4.0.jar
-libraryjars libs/ormlite-android-4.48.jar
-libraryjars libs/ormlite-core-4.48.jar
-libraryjars libs/universal-image-loader-1.9.0.jar
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}
-keep public class * extends android.app.fragment
-keep public class * extends android.app.activity
-keep public class * extends android.app.application
-keep public class * extends android.app.service
-keep public class * extends android.content.broadcastreceiver
-keep public class * extends android.content.contentprovider
-keep public class * extends android.app.backup.backupagenthelper
-keep public class * extends android.preference.preference
-keep public class * extends android.support.v4.**
-keep public class com.android.vending.licensing.ilicensingservice
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.uuhelper.application.** { *; }
-keep class net.sourceforge.zbar.** { *; }
-keep class com.google.android.gms.** { *; }
-keep class com.bank.pingan.model.** { *; }
-keep public class * extends com.j256.ormlite.android.apptools.ormlitesqliteopenhelper
-keep public class * extends com.j256.ormlite.android.apptools.openhelpermanager
-keep class com.android.vending.licensing.ilicensingservice
-keep class android.support.v4.** { *; }
-keep class org.apache.commons.net.** { *; }
-keep class com.tencent.** { *; }
-keep class com.umeng.** { *; }
-keep class com.umeng.analytics.** { *; }
-keep class com.umeng.common.** { *; }
-keep class com.umeng.newxp.** { *; }
-keep class com.j256.ormlite.** { *; }
-keep class com.j256.ormlite.android.** { *; }
-keep class com.j256.ormlite.field.** { *; }
-keep class com.j256.ormlite.stmt.** { *; }
-dontwarn android.support.v4.**
-dontwarn org.apache.commons.net.**
-dontwarn com.tencent.**
-keepclasseswithmembernames class * {
native <methods>;
}
public <init>(android.content.context, android.util.attributeset);
public <init>(android.content.context, android.util.attributeset, int);
-keepclassmembers enum * {
public static **[] values();
public static ** valueof(java.lang.string);
-keep class * implements android.os.parcelable {
public static final android.os.parcelable$creator *;
-keepclasseswithmembers class * {
public <init>(android.content.context);
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.webview
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep enum com.facebook.**
-keepattributes exceptions,innerclasses,signature
-keepattributes sourcefile,linenumbertable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**
-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.tencent.mm.sdk.openapi.wxmediamessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.wxmediamessage$imediaobject {*;}
-keep class im.yixin.sdk.api.yxmessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.yxmessage$yxmessagedata{*;}
-keep public class [your_pkg].r$*{
public static final int *;