欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android打包混淆Copy解决方案

程序员文章站 2022-07-06 10:59:18
android打包混淆copy解决方案。 1. 概念 将android项目进行打包之时,将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件 2.作用 生成apk包体积...

android打包混淆copy解决方案。

1. 概念

将android项目进行打包之时,将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件

2.作用

生成apk包体积变小,减少反编译后泄漏代码的可能性


配置

moudle的build.gradle文件中

Android打包混淆Copy解决方案

minifyenabled true 开启混淆 ,默认false
proguard-rules.pro 一般在moudle目录最下面,里面存放一些代码混淆规则

规则

如今混淆指令已经很完善了,基本上都没有什么变动,在新开发项目中,复制以下代码即可

基本的混淆模版

############################################
#
# 对于一些基本指令的添加
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5

# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames

# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses

# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose

# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers

# 不做预校验,preverify是proguard的四个步骤之一,android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify

# 保留annotation不混淆
-keepattributes *annotation*,innerclasses

# 避免混淆泛型
-keepattributes signature

# 抛出异常时保留代码行号
-keepattributes sourcefile,linenumbertable

# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*


#############################################
#
# android开发中一些需要保留的公共部分
#
#############################################

# 保留我们使用的四大组件,自定义的application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.activity
-keep public class * extends android.app.appliction
-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


# 保留support下的所有类及其内部类
-keep class android.support.** {*;}

# 保留继承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**

# 保留r下面的资源
-keep class **.r$* {*;}

# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
    native ;
}

# 保留在activity中的方法参数是view的方法,
# 这样以来我们在layout中写的onclick就不会被影响
-keepclassmembers class * extends android.app.activity{
    public void *(android.view.view);
}

# 保留枚举类不被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueof(java.lang.string);
}

# 保留我们自定义控件(继承自view)不被混淆
-keep public class * extends android.view.view{
    *** get*();
    void set*(***);
    public (android.content.context);
    public (android.content.context, android.util.attributeset);
    public (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;
    !static !transient ;
    !private ;
    !private ;
    private void writeobject(java.io.objectoutputstream);
    private void readobject(java.io.objectinputstream);
    java.lang.object writereplace();
    java.lang.object readresolve();
}

# 对于带有回调函数的onxxevent、**on*listener的,不能被混淆
-keepclassmembers class * {
    void *(**on*event);
    void *(**on*listener);
}

# webview处理,项目中没有使用到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);
}

第三方库模版

根据官方github文档注释进行混淆

实体类混淆

-keep class 你的实体类所在的包.** { *; }