美文网首页
jar的包生成和ProGuardGui混淆

jar的包生成和ProGuardGui混淆

作者: Sunsol | 来源:发表于2018-06-06 17:42 被阅读0次

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

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

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

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

    相关文章

      网友评论

          本文标题:jar的包生成和ProGuardGui混淆

          本文链接:https://www.haomeiwen.com/subject/rctisftx.html