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界面化工具
- 拷贝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);
}
- 解压Proguard压缩包后打开目录,双击proguardgui.bat 打开界面 (注意:运行需要有java运行环境,配置好jre全局环境变量)
然后点击“加载设置”--》选择桌面的 profile 文件
- 如图点击 1 确认界面中没有报错,点击2
- 接着点击1“查看设置”对比一下与profile文件中内容一样就行,再点击2 开始打包
- 界面中看到打包成功提示
- 桌面显示多出的sdk2.jar