美文网首页
android之代码混淆

android之代码混淆

作者: 切切歆语 | 来源:发表于2019-11-26 22:48 被阅读0次

    项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小APK包。

    Android 中通过ProGuard 来混淆Java代码,仅仅是混淆java代码。它是无法混淆Native代码,资源文件drawable、xml等文件。

    ProGuard作用
    压缩: 移除无效的类、属性、方法等
    优化: 优化字节码,并删除未使用的结构
    混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c;
    不能混淆

    在AndroidManifest中配置的类,比如四大组件
    JNI调用的方法
    反射用到的类
    WebView中JavaScript调用的方法
    Layout文件引用到的自定义View
    一些引入的第三方库(一般都会有混淆说明的)

    要做混淆,首先在build.gradle文件中把 minfyEnabled false 改成 true

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

    之后打开 proguard-rules.pro 文件 加以下代码:

    1:基本指令区

    -optimizationpasses 5          # 指定代码的压缩级别
    -dontusemixedcaseclassnames   # 是否使用大小写混合
    -dontskipnonpubliclibraryclassmembers  #指定不去忽略非公共的库的类
    -dontpreverify           # 混淆时是否做预校验
    -verbose                # 混淆时是否记录日志
    
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法
    

    2:通用混淆配置

    -keep public class * extends android.app.Activity
    -keep public class * extends android.support.v7.app.AppCompatActivity
    -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.view.View
    -keep public class com.android.vending.licensing.ILicensingService
    -keep class android.support.** {*;}
    
    -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, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    -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();
    }
    -keep class **.R$* {
     *;
    }
    -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);
    }
    

    3:实体类

    -keep class com.demo.login.bean.** { *; }
    -keep class com.demo.main.bean.** { *; }
    

    4:第三方包 以 glide 和 butterknife 为例 一般官网都会有混淆代码,去把他们官网的混淆代码Copy下来就可以了

    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
    }
    
    -keep class butterknife.** { *; }
    -dontwarn butterknife.internal.**
    -keep class **$$ViewBinder { *; }
    -keep class **$$ViewInjector { *; }
    
    -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
    }
    
    -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
    }
    

    5:与js互相调用的类

    -keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface { 
          <methods>; 
    }
    

    当然也还有其他的 反射相关的类和方法 具体情况根据自己的项目而定。

    现在可以混淆打包 ,在用反编译工具看看Java代码是不是反编译了;其他需求可以留言讨论

    相关文章

      网友评论

          本文标题:android之代码混淆

          本文链接:https://www.haomeiwen.com/subject/gxjsictx.html