前言

本文记录一使用Android studio 混淆的使用,这里以打包aar为例。

正文

AS中创建一个library模块,这里假设为SkinLib

打开混淆配置

/SkinLib/build.gradle中,打开混淆配置,这里只配置了release的混淆,debug版本是没有配置的,如果你想都配置也可以的。

android {
  //...
    buildTypes {
        release {
            minifyEnabled true //默认为false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
  //...
}

配置混淆规则

/SkinLib/proguard-rules.pro

如果没有就创建

下面是简单配置的规则,可以实现我的需求,只暴露出接口,其他的都混淆了。

#保留所有具有公有访问权限的类和其公共成员不被混淆(可以代替上面所有的keep语句,彻底将误删的概率降到最低)
-keepclasseswithmembers class com.biumall.skin.SkinActivity{
    public *;
    protected *;
}

class com.biumall.skin.SkinActivity 是我需要暴露的接口,其他的可以不让对接人知道。

PS: protected 的方法(或者函数)混淆后会默认变成public

其他的混淆规则,我摘抄的

#保留所有具有公有访问权限的类和其公共成员不被混淆(可以代替上面所有的keep语句,彻底将误删的概率降到最低)
-keepclasseswithmembers class com.biumall.skin.SkinActivity{
    public *;
    protected *;
}

#指定不压缩的类文件,默认压缩。除各种-keep选项列出的类以及它们直接或间接依赖的类之外,所有类和类成员都将被删除。
#在每个优化步骤之后也会压缩,因为某些优化后可能会有更多类和类成员可以被删除。
#-dontshrink

#保持哪些类不被混淆
#-keep public class * extends androidx.appcompat.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 class com.biumall.skin**{*;}

#保持该路径下所有的类都不被混淆
#-keep class com.biumall.skin.SkinActivity{
#   protected void switchSkin();
#   protected boolean openChangeSkin();
#}

# 代码混淆压缩比,在0~7之间,默认为5,一般不下需要修改
#-optimizationpasses 5

# 混淆时不使用大小写混合,混淆后的类名为小写
# windows下的同学还是加入这个选项吧(windows大小写不敏感)
#-dontusemixedcaseclassnames

# 指定不去忽略非公共的库的类
# 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用,此时就需要加入此条声明
#-dontskipnonpubliclibraryclasses

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

# 不做预检验,preverifyproguard的四个步骤之一
# Android不需要preverify,去掉这一步可以加快混淆速度
#-dontpreverify

# 保持自定义控件类不被混淆
#-keepclasseswithmembers class * {
#    public <init>(android.content.Context, android.util.AttributeSet);
#}

# 保持 native 方法不被混淆
#-keepclasseswithmembernames class * {
#    native <methods>;
#}

#如果有引用v4或者v7包,需添加
#-keep public class * extends android.support.v4**
#-keep public class * extends android.support.v7.**

#混淆第三方jar包,其中xxxjar包名
#-libraryjars libs/xxx.jar

#不混淆某个包内的所有文件
#-keep class com.biumall.skin.*{*;}

#忽略某个包的警告
#-dontwarn com.xxx**

#不混淆泛型
#-keepattributes Signature

#不混淆Serializable
#-keepnames class * implements java.io.Serializable

# 保持 Parcelable 不被混淆
#-keep class * implements android.os.Parcelable {
#    public static final android.os.Parcelable$Creator *;
#}

上面大部分注释了,需要的可以自己放开,如果还不满足,可以看下面参考文章。

开始打aar包

Android Studio右侧,打开gradle功能项,选择需要打包的module,因为需要打混淆的aar包,所以执行assemble这个task,点击执行即可,具体如下图[图片来源于参考文章一]

Android Studio混淆aar包记录

生成的aar包路径在当前module的build/outputs/aar文件夹下,存在两个,以下是我的:

SkinLib1-debug.aar
SkinLib1-release.aar
  1. SkinLib1-debug.aar是未混淆的
  2. SkinLib1-release.aar是混淆了的,给客户或其他就用这个版本即可

参考文章

  1. Android Studio 打带混淆得aar包_zone_q的博客-CSDN博客
  2. Android Studio实现代码混淆_gordon001的博客-CSDN博客_android studio 混淆
  3. Android Studio 打包APK代码混淆(采坑总结)_吕氏春秋i的博客-CSDN博客

相关文章

暂无评论

none
暂无评论...