android之代码混淆

来源:互联网 发布:13是什么意思网络语言 编辑:程序博客网 时间:2024/06/08 10:48

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

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

ProGuard作用

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

不能混淆

 

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

要做混淆,首先在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:第三方包  以 glidebutterknife 为例  一般官网都会有混淆代码,去把他们官网的混淆代码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代码是不是反编译了;其他需求可以留言讨论


原创粉丝点击