android学习之代码混淆小结

来源:互联网 发布:js点击切换显示隐藏 编辑:程序博客网 时间:2024/06/06 07:46

之前一直没有对代码混淆有一个很明确的认识,今天重新对代码混淆做了一番了解,并记录一下在android studio上是如何做代码混淆的。

第一步:

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

将Module下的build.gradle文件中将minifyEnabled false改为minifyEnabled true,则默认进行代码混淆。打包的时候选择release,否则只打包不会混淆。

第二步:

  • 混淆规则:
    proguard默认会对第三方库进行混淆,而有的第三方库本身是做过混淆或者使用了java反射技术,例如腾讯直播的SDK就采用了反射技术。这时候就要排除对这些第三方库的混淆。

摘自《Android代码混淆技巧》总结的混淆规则,觉得很全面。

1.如果使用了Gson之类的工具要使JavaBean类即实体类不被混淆。
2.如果使用了自定义控件那么要保证它们不参与混淆。
3.如果使用了枚举要保证枚举不被混淆。
4.对第三方库中的类不进行混淆

语法很多,我自己也记不全,不过一般的第三方库会给出混淆代码来方便我们集成,所以记不住也不需要太过担心

在android中在android Manifest文件中的activity,service,provider, receviter,等都不能进行混淆。一些在xml中配置的自定义的view也不能进行混淆,android提供的默认配置中都有。

-optimizationpasses 5#混淆时不会产生形形色色的类名-dontusemixedcaseclassnames#指定不去忽略非公共的类库-dontskipnonpubliclibraryclasses#不进行预校验-dontpreverify-verbose#优化操作-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#-------------------------------------通用混淆配置 start ---------------------------------------# 对于继承Android的四大组件等系统类,保持原样-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-keep class android.support.**{*;}-keep class android.support.v4.** { *; }-keep interface android.support.v4.app.** { *; }-keep public class * extends android.support.v4.**-dontwarn android.support.v4.**-dontwarn com.android.support.**-dontwarn android.support.**# 保对所有类的native方法名不进行混淆-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);}# 保护继承至View对象中的set/get方法-keepclassmembers public class * extends android.view.View {   void set*(***);   *** get*();}# 对枚举类型enum的所有类的以下指定方法的方法名不进行混淆-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}# 对实现了Parcelable接口的所有类的类名不进行混淆,对其成员变量为Parcelable$Creator类型的成员变量的变量名不进行混淆-keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *;}-keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; }-keep class **.R$* { *; }#----------------------------------------通用混淆配置 end ------------------------------------

以上只是最基本的混淆,具体项目中的第三方库具体添加!

贴出示例:

#保持gson不被混淆-keep class com.google.gson.** {*;}  #-keep class com.google.**{*;}  -keep class sun.misc.Unsafe { *; }  -keep class com.google.gson.stream.** { *; }  -keep class com.google.gson.examples.android.model.** { *; }   -keep class com.google.** {      <fields>;      <methods>;  }  # Butterknife混淆处理-keep class butterknife.** { *; }-keep class **$$ViewInjector { *; }-dontwarn butterknife.internal.**-keepclasseswithmembernames class * {    @butterknife.* <fields>;}-keepclasseswithmembernames class * {    @butterknife.* <methods>;}#EventBus不被混淆-keepclassmembers class ** {    public void onEvent*(**);}# Only required if you use AsyncExecutor-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {    <init>(java.lang.Throwable);}#Glide不被混淆-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {  **[] $VALUES;  public *;}# # -------------------------------------------# # ############### volley混淆 ############### # # --------------------------------------------keep class com.android.volley.** {*;}-keep class com.android.volley.toolbox.** {*;}-keep class com.android.volley.Response$* { *; }-keep class com.android.volley.Request$* { *; }-keep class com.android.volley.RequestQueue$* { *; }-keep class com.android.volley.toolbox.HurlStack$* { *; }-keep class com.android.volley.toolbox.ImageLoader$* { *; }# # -------------------------------------------# # ############### android-support-v4混淆 ############### # # --------------------------------------------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#如果引用了v4或者v7包,可以忽略警告,因为用不到android.support  -dontwarn android.support.**  # # -------------------------------------------# # ############### androidannotations混淆 ############### # # --------------------------------------------dontwarn org.springframework.**# universal-image-loader 混淆-dontwarn com.nostra13.universalimageloader.**-keep class com.nostra13.universalimageloader.** { *; }###-----------MPAndroidChart图库相关的混淆配置------------  -keep class com.github.mikephil.charting.** { *; }  #对WebView的处理-keepclassmembers class * extends android.webkit.WebViewClient {    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);    public boolean *(android.webkit.WebView, java.lang.String);}-keepclassmembers class * extends android.webkit.WebViewClient {    public void *(android.webkit.WebView, java.lang.String);}#支付宝保持不被混淆-dontwarn com.alipay.android.app.** -keep public class com.alipay.** {*;}# ========== fastjson ============-dontwarn com.alibaba.fastjson.**-keep class com.alibaba.fastjson.** {*;}# ================================####################zxing#####################  -keep class com.google.zxing.** {*;}  -dontwarn com.google.zxing.**  

上面总结了这么多,当然还有很多其他的第三方库,无法一一列出总结,都可以参考具体文档来进行混淆。

1 0
原创粉丝点击