android 代码混淆

proguard 原理
Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。
一, 我们用到反射的地方。
二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。
三, 是我们的java 元素名称是在配置文件中配置好的。
所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。

proguard 作用
压缩、优化和混淆Java字节码文件
它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件
他还可以使用简短的无意义的名称来重命名已经存在的类、方法和属性
 
proguard 使用
在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:
target=android-8
proguard.config=proguard.cfg
在根目录下创建proguard.cfg文件,里面配置相关的混淆规则
我用的idea,点击build->generate signed akp,这里需要先签名,之会有个选项running proguard打勾,并且选择proguard.cfg的路径开始打包
打完包之后会有很多信息输出在项目根目录下的proguard_logs目录下
dump.txt :描述了apk内所有class文件的内部结构
Mapping.txt : 表示混淆前后代码的对照表
seeds.txt : 列出了没有被混淆的类和成员
usage.txt : 列出了源代码中被删除,在apk中不存在的代码
 
 
proguard.cfg 参数解析
参数: 
-include {filename}    从给定的文件中读取配置参数 
-basedirectory {directoryname}    指定基础目录为以后相对的档案名称 
-injars {class_path}    指定要处理的应用程序jar,war,ear和目录 
-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称 
-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 
-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。 
-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。 

保留选项 
-keep {Modifier} {class_specification}    保护指定的类文件和类的成员 
-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好 
-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 
-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 
-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件 

压缩 
-dontshrink    不压缩输入的类文件 
-printusage {filename} 
-whyareyoukeeping {class_specification}     

优化 
-dontoptimize    不优化输入的类文件 
-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用 
-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员 

混淆 
-dontobfuscate    不混淆输入的类文件 
-printmapping {filename} 
-applymapping {filename}    重用映射增加混淆 
-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称 
-overloadaggressively    混淆时应用侵入式重载 
-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆 
-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中 
-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中 
-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名 
-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 
-renamesourcefileattribute {string}    设置源文件中给定的字符串常量
 

-optimizationpasses 5  ->设置混淆的压缩比率 0 ~ 7 

-dontusemixedcaseclassnames -> Aa aA 

-dontskipnonpubliclibraryclasses ->如果应用程序引入的有jar包,并且想混淆jar包里面的class 

-dontpreverify 

-verbose ->混淆后生产映射文件 map 类名->转化后类名的映射

 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  ->混淆采用的算法.

 

例子:

# 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:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributes *Annotation*

-keepattributes Signature

#-library dyuproject
-keeppackagenames java.util.**
-dontwarn java.util.**

-keep public class ?????.app.common.sso.WeChatPLT{ *;}
-keepnames class ?????????.activity.AbstractH5Activity$* {
public <fields>;
public <methods>;
}

-keepnames class ?????????.h5.AdvertiseH5Activity$* {
public <fields>;
public <methods>;
}
-keep public class ?????????.fragment.** {*;}
-keep public class ?????????.homepage.MainFragmentActivity {*;}
-keep public class ?????.???.service.???Service {*;}

-keep public class java.util..**{ *; }
-keep public class ?????.app.processor.ResponseTypeReference{ *; }
-keep public class ?????.app.processor.BaseProcessorV2{ *; }
-keep public class ?????.app.processor.BaseProcessorV2$ProcessorTask{ *; }
-keep public class ?????.app.processor.RestAsyncTaskV2{ *; }

#-keep public class * extends ?????.app.processor.BaseProcessorV2{ *; }
#-keep public class * extends ?????.app.processor.RestAsyncTaskV2{ *; }
-keep public class ?????????.activity.**{ *; }

-dontnote com.handmark.pulltorefresh.library.PullToRefreshBase$OnSmoothScrollFinishedListener
-dontnote **ILicensingService
-keep public class com.handmark.pulltorefresh.library.**{ *; }
-keep public class com.handmark.pulltorefresh.library.PullToRefreshBase$OnSmoothScrollFinishedListener { *; }

-keep public class ?????.app.model.** {
public void set*(***);
public *** get*();
public *** is*();
}
-keep public class ?????.app.common.http.entities.**{
public void set*(***);
public *** get*();
}
-keep public class ?????.app.common.** {*;}
-keep public class ?????.???.model.** {
public void set*(***);
public *** get*();
public *** is*();
}

-keepclassmembers public class ?????.app.common.sso.WeChatPLT{
public void onEvent(***);
}


-keep class **.R$* {
*;
}

-keep public class ?????.app.utils.TrackerUtil{ *; }
#-keep public class ?????.app.utils.FileUtils{ *; }

#-libraryjars libs/jackson-mapper-lgpl-1.7.4.jar
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.jackson.** { *; }

#-libraryjars libs/jackson-core-lgpl-1.7.4.jar
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.jackson.** { *; }

#-libraryjars libs/alipay.jar
-dontwarn com.alipay.android.app.**
-keep class com.alipay.android.app.** { *; }

#-libraryjars libs/jpush-sdk-release1.5.5.jar
-dontwarn cn.jpush.android.**
-keep class cn.jpush.android.** { *; }

#-libraryjars libs/libammsdk.jar
-dontwarn com.tencent.mm.**
-keep class com.tencent.mm.** { *; }

#-libraryjars libs/libGoogleAnalyticsServices.jar
-dontwarn com.google.**
-keep class com.google.** { *; }

#-libraryjars libs/locSDK_3.1.jar
-dontwarn com.baidu.location.**
-keep class com.baidu.location.** { *; }

#-libraryjars libs/mta-sdk-1.0.0.jar
-dontwarn com.tencent.stat.**
-keep class com.tencent.stat.** { *; }

#-libraryjars libs/open_sdk.jar
-dontwarn com.tencent.**
-keep class com.tencent.** { *; }

#-libraryjars libs/photoview.jar
-dontwarn uk.co.senab.photoview.**
-keep class uk.co.senab.photoview.** { *; }

#-libraryjars libs/scribe-1.3.1.jar
-dontwarn org.scribe.**
-keep class org.scribe.** { *; }

#-libraryjars libs/umeng_sdk.jar
-dontwarn com.umeng.**
-keep class com.umeng.** { *; }

#-libraryjars libs/UPPayAssistEx.jar
-dontwarn com.unionpay.**
-keep class com.unionpay.** { *; }

#-libraryjars libs/UPPayPluginEx.jar
-dontwarn com.unionpay.**
-keep class com.unionpay.** { *; }

#-libraryjars libs/weibosdkcore.jar
-dontwarn com.sina.**
-keep class com.sina.** { *; }

#-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-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 com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

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

-keep public class com.alipay.** {*;}
-keep public class com.sina.** {*;}
-keep public class com.handmark.** {*;}
-keep public class de.greenrobot.** {*;}
-dontwarn de.greenrobot.**
-keep public class com.sina.** {*;}
-keep public class com.squareup.** {*;}
-dontwarn com.squareup.**
-keep public class com.baidu.** {*;}
-keep public class com.slidingmenu.** {*;}
-keep public class com.tecent.** {*;}
-keep public class com.google.** {*;}
-keep public class com.unionpay.** {*;}
-keep public class com.UCMobile.** {*;}
-keep public class org.** {*;}
-keep public class uk.** {*;}
-keep public class android.* {*;}
-keep public class u.** {*;}
-keep public class com.crashlytics.** {*;}

 

 

posted @ 2015-01-12 19:43  saki_god  阅读(398)  评论(0编辑  收藏  举报