jar的包生成和ProGuardGui混淆

jar包的生成

首先创建一个Android Library,把自己相关的代码放入进去
找到此modulebuild.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
    ;
}

# Preserve all native method names and the names of their classes.
-keepclasseswithmembers,allowshrinking class * {
    native ;
}

# Keep - Libraries. Keep all public and protected classes, fields, and methods.
-keep public class * {
    public protected ;
    public protected ;
}

# 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 ;
}

-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日志

其他参数看一下英文就可以明白是什么了。

  1. 在混淆的过程中,刚开始我遇到了找不到androidjavascript 互调方法的问题,最后发现混淆后配置文件把我的@JavascriptInterface字符给过滤掉了,解决方案就是加上-keepattributes *Annotation*,让混淆是保留 Java 注释符。
  2. 在混淆时,一定要使用-libraryjars把所用到的库加载进去。

好了,以上就是我这个android小白的借鉴和简单总结,希望对你们有所帮助,如有不足和错误,请不吝指出,感谢 ~

你可能感兴趣的:(jar的包生成和ProGuardGui混淆)