zoukankan      html  css  js  c++  java
  • android之代码混淆

    项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小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:第三方包  以 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代码是不是反编译了;其他需求可以留言讨论

  • 相关阅读:
    大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 时序算法)
    大数据时代:基于微软案例数据库数据挖掘知识点总结(结果预测篇)
    svg图片的缩放拖拽
    计算机网络之以太网,通俗点的说法
    yield 与生成器
    安卓开发第一记 android stdio 安装后 新建测试项目报错
    Javascript的异常捕获机制
    小而实用的工具插件集锦(JQGrid,zTree)
    proxifier 注册码 +电脑全局代理设置
    雷林鹏分享:jsp 发送邮件
  • 原文地址:https://www.cnblogs.com/zhangqie/p/7216369.html
Copyright © 2011-2022 走看看