jar包的生成
首先创建一个Android Library,把自己相关的代码放入进去
找到此module
的build.gradle
,在里边加入以下代码:
task makeJar(type: Copy) {
delete 'build/Jar_V1.0.jar' //删除之前的旧jar包
from('build/intermediates/packaged-classes/release/') //从这个目录下取出默认jar包
into('build/libs') //将jar包输出到指定目录下
include('classes.jar')
rename('classes.jar', 'Jar_V1.0.jar') //自定义jar包的名字
}
makeJar.dependsOn(build)
备注:
这里需要特殊说明一下from
参数,我的Android Studio
的版本为:3.1,所以我使用的from
路径为:build/intermediates/packaged-classes/release/
,如果你使用的是3.1以前的版本就需要使用:build/intermediates/bundles/release
,因为Android Studio
在3.1版本对intermediates
目录有所变动。
以上设置好之后点开Android studio
右边的Gradle
,如下图:
在
other
中找到自定义的makeJar
,然后双击执行即可表示已经生成成功!
这个时候你就可以在你指定的
into
目录里边找到此jar
包了。
下面咱们简单介绍一下ProGuard
混淆的使用
本人刚开始使用的是 sdk 内提供的ProGurad
,路径为:sdk/tools/proguard/
,但是 sdk 中自带版本过低,所以自己就下载了一个,版本为:proguard6.0.3。
我使用的是ProGuardGui
,找到proguard6.0.3
文件夹下边的bin
文件
我使用的Mac,所以进入此目录下执行
sudo ./proguardgui.sh
即可打开ProGuardGui
客户端。以下是已经写好的配置信息,点击客户端上的
Load configuration
加载配置文件,一路Next
即可生成混淆后的jar包。以下是我的配置文件:
-injars build/libs/Jar_V1.0.jar
-outjars ../app/libs/Jar_release_V1.0.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/rt.jar
-libraryjars /Users/xxx/Documents/android-tool/sdk/platforms/android-26/android.jar
-target 1.6
-useuniqueclassmembernames
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
# Preserve the special static methods that are required in all enumeration
# classes.
-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# Android libraries - Javascript interfaces. Keep all methods from Android Javascripts.
-keepclassmembers class com.blood.a.SimpleService$JsInterface {
@android.webkit.JavascriptInterface
<methods>;
}
# Preserve all native method names and the names of their classes.
-keepclasseswithmembers,allowshrinking class * {
native <methods>;
}
# Keep - Libraries. Keep all public and protected classes, fields, and methods.
-keep public class * {
public protected <fields>;
public protected <methods>;
}
# Also keep - Serialization code. Keep all fields and methods that are used for
# serialization.
-keepclassmembers class * extends java.io.Serializable {
static final long serialVersionUID;
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 - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
native <methods>;
}
-assumenosideeffects class android.util.Log {
public static *** v(...);
public static *** i(...);
public static *** d(...);
public static *** w(...);
public static *** e(...);
}
pro 配置文件
此配置文件需要根据自己 jar 包中使用的东西来定义,下面我就简单介绍一下我的配置参数以及遇到的问题。
-injars // 需要混淆的jar包路径
-outjars // 混淆后的jar输出路径
-libraryjars // jar包所需要的库
-keepattributes *Annotation* // 保留Java注释符,比如 @JavascriptInterface
-useuniqueclassmembernames //方法同名混淆后亦同名,方法不同名混淆后亦不同名
-assumenosideeffects class android.util.Log // 过滤掉所有的Log日志
其他参数看一下英文就可以明白是什么了。
- 在混淆的过程中,刚开始我遇到了找不到
android
与javascript
互调方法的问题,最后发现混淆后配置文件把我的@JavascriptInterface
字符给过滤掉了,解决方案就是加上-keepattributes *Annotation*
,让混淆是保留 Java 注释符。 - 在混淆时,一定要使用
-libraryjars
把所用到的库加载进去。
好了,以上就是我这个android小白的借鉴和简单总结,希望对你们有所帮助,如有不足和错误,请不吝指出,感谢 ~
网友评论