Android Studio中module打混淆jar包和aar包

623 阅读4分钟

1.在module项目下build.gradle中添加以下配置:

android {
    buildTypes {
        //开发调试的时候有效
        debug {
            // true显示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
//            minifyEnabled true
//            zipAlignEnabled true
//            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        //打包的时候使用
        release {
            // true显示Log
            buildConfigField "boolean", "LOG_DEBUG", "true"
            //混淆
            minifyEnabled true
            //Zipalign优化
            zipAlignEnabled true
            //加载混淆配置文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    lintOptions {
        abortOnError false //忽略lint错误
    }
}

task clearJar(type: Delete) {
    delete 'build/libs/sdk.jar'//这行表示如果你已经打过一次包了,再进行打包则把原来的包删掉
}

task makeJar(type: Copy) {
    from('build/intermediates/aar_main_jar/release/') //这行表示要打包的文件的路径,根据下面的内容,其实是该路径下的classes.jar
    into('build/libs/')  //这行表示打包完毕后包的生成路径,也就是生成的包存在哪
    include('classes.jar')  //看到这行,如果你对分包有了解的话,你就可以看出来这行它只是将一些类打包了
    rename ('classes.jar', 'sdk.jar')
    exclude('test/', 'BuildConfig.class', 'R.class')//去掉不需要打包的目录和文件
    exclude{it.name.startsWith('R');}//去掉R开头的文件
}

makeJar.dependsOn(clearJar, build)

2.proguard-rules.pro中添加混淆配置

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

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

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

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

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

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

# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses

# 避免混淆泛型
-keepattributes Signature

# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable

# 忽略警告
-ignorewarnings

# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-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 <methods>;
}

# 保留在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 <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(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 <fields>;
    !private <fields>;
    !private <methods>;
    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);
}

# 保持 - Library. 保持所有公共和受保护类, 字段, 和方法.
-keep public class * {
    public protected <fields>;
    public protected <methods>;
}

3.打包

点击红框中按钮,选择Run,等待打包完成即可 在这里插入图片描述

得到jar包和arr包的目录,在module项目下 在这里插入图片描述

Android Studio自带的混淆效果一般,有的类没有混淆,可以使用三方混淆工具和加密工具。

ProguardGui界面化工具

  1. 拷贝sdk.jar到桌面,在桌面创建个名字为profile无后缀的所有类型文件 在这里插入图片描述 用编辑工具打开 profile 复制以下内容到文件并保存
-injars sdk.jar
-outjars sdk2.jar

# 这是你的Android Studio安装位置jre目录下的运行时jar包路径,低版本Android Studio为rt.jar(路径不对记得更改)
-libraryjars 'D:\Program Files\Android\Android Studio\jre\lib\jrt-fs.jar'
# 这是你的Sdk位置android.jar包路径(路径不对记得更改)
-libraryjars 'C:\Users\Admin\AppData\Local\Android\Sdk\platforms\android-30\android.jar'
# 这是你的Android Studio安装位置的r8.jar包路径,低版本Android Studio如果没有注释下面这段内容(路径不对记得更改)
-libraryjars 'D:\Program Files\Android\Android Studio\plugins\android\lib\r8.jar'

-dontskipnonpubliclibraryclassmembers
-printusage unused.txt
-dontoptimize
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-optimizationpasses 5
-overloadaggressively
-keeppackagenames
-flattenpackagehierarchy ''
-repackageclasses ''
-keepattributes *Annotation*,Signature
-renamesourcefileattribute SourceFile
-adaptclassstrings
-adaptresourcefilenames **.properties
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-dontpreverify
-verbose
-ignorewarnings
-dump class_files.txt
-printseeds seeds.txt


# 保持 - Library. 保持所有公共和受保护类, 字段, 和方法.
-keep public class * {
    public protected <fields>;
    public protected <methods>;
}

# 此外保持 - 枚举. 保持是特殊的静态方法在所需
# 枚举类.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
  1. 解压Proguard压缩包后打开目录,双击proguardgui.bat 打开界面 (注意:运行需要有java运行环境,配置好jre全局环境变量) 然后点击“加载设置”--》选择桌面的 profile 文件 在这里插入图片描述
  2. 如图点击 1 确认界面中没有报错,点击2 在这里插入图片描述
  3. 接着点击1“查看设置”对比一下与profile文件中内容一样就行,再点击2 开始打包
  4. 界面中看到打包成功提示 在这里插入图片描述
  5. 桌面显示多出的sdk2.jar 在这里插入图片描述

完结