Android 常用代码混淆

代码混淆主要是为了防止反编译,如何反编译?比较火的反编译工具github地址jadx,也可直接下载jadx-gui。这里可以看看我通过反编译工具查看apk混淆前和混淆后的两张图片

 

不难看出ClubActivity里面的成员变量和方法都变成了单个英文字母,从而降低了代码的可读性,提高安全性!

开始混淆:

Gradle配置

   buildTypes {
        debug {
            minifyEnabled false//是否混淆
            zipAlignEnabled true // Zipalign优化
//            shrinkResources true //移除无用的resource文件
            signingConfig signingConfigs.debug //签名
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  // 加载默认混淆配置文件
        }

        release {
            minifyEnabled true //是否开启混淆
            zipAlignEnabled true // Zipalign优化
//            shrinkResources true //移除无用的resource文件
            signingConfig signingConfigs.debug //签名
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  // 加载默认混淆配置文件
        }
    }

App下的proguard文件配置

网上基本配置

#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
-optimizationpasses 5       # 指定代码的压缩级别
-dontusemixedcaseclassnames     # 是否使用大小写混合
-dontskipnonpubliclibraryclasses        # 指定不去忽略非公共的库类
-dontskipnonpubliclibraryclassmembers       # 指定不去忽略包可见的库类的成员
-dontpreverify      # 混淆时是否做预校验
-verbose        # 混淆时是否记录日志
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*      # 混淆时所采用的算法
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------
-ignorewarnings     # 是否忽略检测,(是)
#如果有引用v4包可以添加下面这行
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

-dontwarn android.support.v7.**
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }

-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
#避免Parcelable混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#避免Serializable接口的子类中指定的某些成员变量和方法混淆
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
#表示不混淆R文件中的所有静态字段
-keep class **.R$* {
    public static <fields>;
}
-keepclassmembers class * {
    void *(**On*Event);
}
#----------------------------------------------------------------------------

#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
   public *;
}
-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, jav.lang.String);
}

三方引用配置(视情况而定,使用了什么三方,配置对应的混淆)

#---------------------------------Glide---------------------------------------
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

#-------------------------------Arouter---------------------------------
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

# If you use the byType method to obtain Service, add the following rules to protect the interface:
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

# If single-type injection is used, that is, no interface is defined to implement IProvider, the following rules need to be added to protect the implementation
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider

#------------------------------EventBus3.0-----------------------------
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

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

#---------------------------ButterKnife----------------------------------
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

#---------------------------友盟分享-------------------------------------
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-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 class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.umeng.weixin.handler.**
-keep class com.umeng.weixin.handler.*
-keep class com.umeng.qq.handler.**
-keep class com.umeng.qq.handler.*
-keep class UMMoreHandler{*;}
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep class com.tencent.mm.sdk.** {
   *;
}
-keep class com.tencent.mm.opensdk.** {
   *;
}
-keep class com.tencent.wxop.** {
   *;
}
-keep class com.tencent.mm.sdk.** {
   *;
}

-keep class com.twitter.** { *; }

-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep class com.kakao.** {*;}
-dontwarn com.kakao.**
-keep public class com.umeng.com.umeng.soexample.R$*{
    public static final int *;
}
-keep public class com.linkedin.android.mobilesdk.R$*{
    public static final int *;
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}
-keep class com.umeng.socialize.impl.ImageImpl {*;}
-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class  com.alipay.share.sdk.** {
   *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

-keep class com.linkedin.** { *; }
-keep class com.android.dingtalk.share.ddsharemodule.** { *; }
-keepattributes Signature

个人所需要配置(项目中的bean或entity)

#---------------------------定制类---------------------------
-keep class com.agenet.quhi.application.bean.**{*;}
-keep class com.agenet.quhi.hi_home.bean.**{*;}
-keep class com.agenet.quhi.hi_mine.bean.**{*;}
-keep class com.agenet.quhi.hi_shares.bean.**{*;}

配置的也就这么多,其中语法关键字可以业余时间学习学习,毕竟简单的保证哪些会被混淆,哪些不被混淆,还有混淆之后app是否能运行,都需要更多的学习。

### Android Studio中实现代码混淆的配置 在Android Studio中,代码混淆可以通过ProGuard或R8工具来实现。以下是详细的配置方法和注意事项: #### 1. 配置启用代码混淆 在`app/build.gradle`文件中,需要对`buildTypes`进行配置以启用代码混淆。具体配置如下: ```gradle android { buildTypes { release { // 启用代码混淆 minifyEnabled true // 启用资源压缩 shrinkResources true // 指定混淆规则文件 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } ``` 上述配置中,`minifyEnabled true`用于启用代码混淆功能[^2]。`shrinkResources true`则用于移除无用的资源文件[^2]。同时,通过`proguardFiles`指定了默认的混淆规则文件以及自定义的混淆规则文件`proguard-rules.pro`。 #### 2. ProGuard与R8的区别 ProGuard和R8是两种常用代码混淆工具。从Android Gradle Plugin 3.4.0开始,默认使用R8作为代码混淆工具[^1]。虽然R8取代了ProGuard,但它仍然兼容ProGuard的规则文件[^2]。因此,在大多数情况下,开发者无需修改现有的ProGuard规则即可直接使用R8。 #### 3. 自定义混淆规则 为了保护应用中的关键代码或第三方库,通常需要在`proguard-rules.pro`文件中添加自定义规则。以下是一些常见的混淆规则示例: - **保留特定类不被混淆**: ```pro -keep public class com.example.MyClass { *; } ``` 上述规则表示`com.example.MyClass`类及其所有成员不会被混淆[^4]。 - **保留注解类**: ```pro -keepattributes *Annotation* ``` 该规则确保注解信息不会被移除[^4]。 - **保留接口**: ```pro -keep public interface com.example.MyInterface { *; } ``` - **保留JSON序列化类**: 如果使用Gson等库进行JSON序列化,需要确保相关类的字段名称不被混淆: ```pro -keepclassmembers class * { @com.google.gson.annotations.SerializedName <fields>; } ``` #### 4. 测试混淆效果 完成混淆配置后,可以通过生成签名APK并使用反编译工具(如JD-GUI)检查混淆效果。如果发现某些代码未按预期混淆,可能需要调整`proguard-rules.pro`文件中的规则。 #### 5. 注意事项 - **调试模式下的混淆**:默认情况下,`debug`构建类型不会启用混淆。如果需要测试混淆效果,可以在`debug`构建类型中临时启用混淆- **混淆可能导致的问题**混淆可能会导致某些功能失效,尤其是在涉及反射或动态加载的情况下。此时需要根据具体情况调整混淆规则[^3]。 ### 示例代码 以下是一个完整的`app/build.gradle`文件示例: ```gradle android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } ``` 同时,`proguard-rules.pro`文件可以包含以下内容: ```pro -keep public class com.example.MyClass { *; } -keepattributes *Annotation* -keep public interface com.example.MyInterface { *; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值