AndroidStudio生成自定义的混淆jar包(同时将assets目录打入jar包)(二)(by 星空武哥)

转载请标注原文地址:http://blog.csdn.net/lsyz0021/article/details/53107595

    在以前曾经写过两篇文章,关于是生成jar包和引用jar的文章,建议先看这两篇文章。

《Android Studio生成自定义的jar包http://blog.csdn.net/lsyz0021/article/details/52162414

《Android Studio如何引用so、arr、jar包》:http://blog.csdn.net/lsyz0021/article/details/52976439


    Android Studio生成自定义jar包(同时将assets目录打入jar包)(一)
    Android Studio生成自定义混淆jar包(同时将assets目录打入jar包)(二)


    今天我就给大家交给大家studio如何生成带混淆的jar包,其实和上一篇文章差不多,只不过是多了一些混淆文件。首先我们先新建一个module(我把它新建成了一个library)。在用AndroidStudio生成混淆jar的时候也百度过很多文章,但是大多都没有用。



为了一会给大家演示混淆后的效果,这里创建了几个文件 MainActivity、UserBean、LogUtil详细见demo



然后再在module的gradle中配置如下

[java]   view plain  copy
  1. def SDK_BASENAME = "mylibs";  
  2. def SDK_VERSION = "_v1.0";  
  3. def sdkDestinationPath = "build/outputs/jar/";  
  4. def zipFile = file('build/intermediates/bundles/release/classes.jar')  
  5.   
  6. task deleteBuild(type: Delete) {  
  7.     delete sdkDestinationPath + SDK_BASENAME + SDK_VERSION + ".jar"  
  8. }  
  9.   
  10. task makeJar(type: Jar) {  
  11.     from zipTree(zipFile)  
  12.     from fileTree(dir: 'src/main', includes: ['assets/**']) // 打包assets目录下的所有文件  
  13.     baseName = SDK_BASENAME + SDK_VERSION  
  14.     destinationDir = file(sdkDestinationPath)  
  15. }  
  16.   
  17. makeJar.dependsOn(deleteBuild, build)  

    上面的配置具体我就不讲解他们是什么意思了。

     因为我们是自己手动混淆了,所以要指定混淆规则,然后打开module的proguard-rules.pro文件,将AndroidStudio默认的混淆文件复制、粘贴到proguard-rules.pro中。




我的proguard-rules.pro文件



全部proguard-rules.pro配置如下

[java]   view plain  copy
  1. ###########################以下是AndroidStudio自带的混淆配置协议###############################  
  2.   
  3. # 表示混淆时不使用大小写混合类名  
  4. -dontusemixedcaseclassnames  
  5.   
  6. # 表示不跳过library中的非public的类  
  7. -dontskipnonpubliclibraryclasses  
  8.   
  9. # 打印混淆的详细信息  
  10. -verbose  
  11.   
  12. # Optimization is turned off by default. Dex does not like code run  
  13. # through the ProGuard optimize and preverify steps (and performs some  
  14. # of these optimizations on its own).  
  15. -dontoptimize  
  16.   
  17. # 表示不进行校验,这个校验作用 在java平台上的  
  18. -dontpreverify  
  19. # Note that if you want to enable optimization, you cannot just  
  20. # include optimization flags in your own project configuration file;  
  21. # instead you will need to point to the  
  22. "proguard-android-optimize.txt" file instead of this one from your  
  23. # project.properties file.  
  24. #使用注解需要添加  
  25. -keepattributes *Annotation*  
  26. -keep public class com.google.vending.licensing.ILicensingService  
  27. -keep public class com.android.vending.licensing.ILicensingService  
  28.   
  29. # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native  
  30. #指定不混淆所有的JNI方法  
  31. -keepclasseswithmembernames class * {  
  32.     native <methods>;  
  33. }  
  34.   
  35. # keep setters in Views so that animations can still work.  
  36. # see http://proguard.sourceforge.net/manual/examples.html#beans  
  37. #所有View的子类及其子类的get、set方法都不进行混淆  
  38. -keepclassmembers public class * extends android.view.View {  
  39.    void set*(***);  
  40.    *** get*();  
  41. }  
  42.   
  43. # We want to keep methods in Activity that could be used in the XML attribute onClick  
  44. # 不混淆Activity中参数类型为View的所有方法  
  45. -keepclassmembers class * extends android.app.Activity {  
  46.    public void *(android.view.View);  
  47. }  
  48.   
  49. # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations  
  50. # 不混淆Enum类型的指定方法  
  51. -keepclassmembers enum * {  
  52.     public static **[] values();  
  53.     public static ** valueOf(java.lang.String);  
  54. }  
  55.   
  56. # 不混淆Parcelable和它的子类,还有Creator成员变量  
  57. -keepclassmembers class * implements android.os.Parcelable {  
  58.   public static final android.os.Parcelable$Creator CREATOR;  
  59. }  
  60.   
  61. # 不混淆R类里及其所有内部static类中的所有static变量字段  
  62. -keepclassmembers class **.R$* {  
  63.     public static <fields>;  
  64. }  
  65.   
  66. # The support library contains references to newer platform versions.  
  67. # Don't warn about those in case this app is linking against an older  
  68. # platform version.  We know about them, and they are safe.  
  69. # 不提示兼容库的错误警告  
  70. -dontwarn android.support.**  
  71.   
  72. # Understand the @Keep support annotation.  
  73. -keep class android.support.annotation.Keep  
  74.   
  75. -keep @android.support.annotation.Keep class * {*;}  
  76.   
  77. -keepclasseswithmembers class * {  
  78.     @android.support.annotation.Keep <methods>;  
  79. }  
  80.   
  81. -keepclasseswithmembers class * {  
  82.     @android.support.annotation.Keep <fields>;  
  83. }  
  84.   
  85. -keepclasseswithmembers class * {  
  86.     @android.support.annotation.Keep <init>(...);  
  87. }  
  88.   
  89. #################################以下是自己添加的混淆协议###################################  
  90. #下面代码中的路径配置,你要修改成与你相对应的路径  
  91.   
  92. #引入依赖包rt.jar(jdk路径)(注意:如在makeJar的时候提示指定了两次,可以将其注释掉)  
  93. -libraryjars 'C:\Android_Develop_Tools\Java\jdk1.8.0_101\jre\lib\rt.jar'  
  94.   
  95. #引入依赖包android.jar(android SDK路径)(注意:如在makeJar的时候提示指定了两次,可以将其注释掉)  
  96. #-libraryjars 'C:\Android_Develop_Tools\sdk\platforms\android-23\android.jar'  
  97.   
  98. #如果用到Appcompat包,需要引入(注意:如在makeJar的时候提示指定了两次,可以将其注释掉)  
  99. #-libraryjars 'D:\AndroidStudioProjects\MyApplication\mylibrary\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.4.0\jars\classes.jar'  
  100. #-libraryjars 'D:\AndroidStudioProjects\MyApplication\mylibrary\build\intermediates\exploded-aar\com.android.support\support-v4\23.4.0\jars\classes.jar'  
  101.   
  102. #忽略警告  
  103. -ignorewarnings  
  104. #保证是独立的jar,没有任何项目引用,如果不写就会认为我们所有的代码是无用的,从而把所有的代码压缩掉,导出一个空的jar  
  105. #-dontshrink  
  106. #保护泛型  
  107. -keepattributes Signature  
  108.   
  109. -keep class com.lcw.mylibrary.LogUtil{  
  110.     public *;  
  111. }  

最后的我是禁止混淆LogUtil工具类,以便形成对比。根据混淆配置是AndroidStudio默认不混淆MainActivity,我们在也不混淆LogUtil。


然后你就在Terminal中输入

[java]   view plain  copy
  1. gradlew makeJar  

或者是双击 makeJar





我们将生成的jar包解压可以看到MainActivity和LogUtil没有被混淆,这就说明成功了。




注意:有可能你在执行命令的时候遇到下面类似的错误提示classes.jar is specified twice,说我们的classes.jar  指定了两次


解决方式:在proguard-rules.pro中将其注释掉即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值