当前位置:   article > 正文

Android Proguard 不混淆所有第三方jar(忽略配置设置)_android不混淆第三方库

android不混淆第三方库

今天给大家分享一个只混淆自己的项目代码而不混淆所有第三方jar的方法(没错,是所有的第三方都不进行混淆,无论来什么第三方,都不需要动混淆配置)

不混淆所有第三方重大突破

今天又被同事逼迫看了一下Proguard官网,发现原来是支持指定多个目录混淆的

例如你有:com.a.a、com.b.b、com.c.c、com.第三方等

现在只想混淆com.a.a和com.b.b,那么你写成如下即可
```
-keep class !com.a.a.**,!com.b.b.**,** {*;}
```

使用注意:如果你项目用的第三方特别杂乱、特别多,不混淆的话会导致包体积增大很多

一、为app添加混淆

在app的buildTypes里开启对指定包进行混淆,这里我混淆了release和debug的,并且增加了一个debug模式的混淆类型(注①)

  1. buildTypes {
  2. release {
  3. minifyEnabled true
  4. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  5. signingConfig signingConfigs.release
  6. }
  7. //不混淆,便于开发debug
  8. debug {
  9. minifyEnabled false
  10. signingConfig signingConfigs.release
  11. }
  12. //debug混淆模式,以便给测试人员测试
  13. debugProguard {//除了字符串和注释其他的不要沾半点中文
  14. initWith debug
  15. minifyEnabled true
  16. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  17. }
  18. }

二、增加混淆逻辑

第二步就是关键了,混淆的配置(放在app目录下即可,上面写的是相对路径,所以必须在app目录下,不是根目录)

  1. # Add project specific ProGuard rules here.
  2. # By default, the flags in this file are appended to flags specified
  3. # in /Users/chenmengjia/Library/Android/sdk/tools/proguard/proguard-android.txt
  4. # You can edit the include path and order by changing the proguardFiles
  5. # directive in build.gradle.
  6. #
  7. # For more details, see
  8. # http://developer.android.com/guide/developing/tools/proguard.html
  9. # Add any project specific keep options here:
  10. # If your project uses WebView with JS, uncomment the following
  11. # and specify the fully qualified class name to the JavaScript interface
  12. # class:
  13. #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  14. # public *;
  15. #}
  16. #默认的proguard-android.txt已经增加了Annotation、native、view的setget方法、Activity参数为view的方法、Enum枚举、Parcelable、R,此处不再写
  17. #------------------------------------------通用区域----------------------------------------------------
  18. #----------------------基本指令------------------------
  19. #代码混淆压缩比,在07之间,默认为5,一般不需要改
  20. -optimizationpasses 5
  21. #混淆时不使用大小写混合,混淆后的类名为小写
  22. -dontusemixedcaseclassnames
  23. #指定不去忽略非公共的库的类
  24. -dontskipnonpubliclibraryclasses
  25. #指定不去忽略非公共的库的类的成员
  26. -dontskipnonpubliclibraryclassmembers
  27. #不做预校验,preverify是proguard的4个步骤之一
  28. #Android不需要preverify,去掉这一步可加快混淆速度
  29. -dontpreverify
  30. #有了verbose这句话,混淆后就会生成映射文件
  31. #包含有类名->混淆后类名的映射关系
  32. #然后使用printmapping指定映射文件的名称
  33. -verbose
  34. -printmapping proguardMapping.txt
  35. #指定混淆时采用的算法,后面的参数是一个过滤器
  36. #这个过滤器是谷歌推荐的算法,一般不改变
  37. -optimizations !code/simplification/cast,!field/*,!class/merging/*
  38. #保护代码中的Annotation不被混淆,这在JSON实体映射时非常重要,比如fastJson
  39. -keepattributes *Annotation*,InnerClasses
  40. #避免混淆泛型,这在JSON实体映射时非常重要,比如fastJson④
  41. -keepattributes Signature
  42. #抛出异常时保留代码行号,在异常分析中可以方便定位
  43. -keepattributes SourceFile,LineNumberTable
  44. #-----------------------全局混淆-----------------------
  45. #除了项目目录,其他都不混淆②
  46. -keep class !com.wang.**,!com.li.**,** {*;}
  47. -dontwarn **
  48. #---------------------默认保留-------------------------
  49. #基础保留
  50. -keep class * extends android.app.Activity
  51. -keep class * extends android.app.Application
  52. -keep class * extends android.app.Service
  53. -keep class * extends android.content.BroadcastReceiver
  54. -keep class * extends android.content.ContentProvider
  55. -keep class * extends android.app.backup.BackupAgentHelper
  56. -keep class * extends android.preference.Preference
  57. -keep class * extends android.view.View {
  58. <init>(...);
  59. }
  60. #序列化
  61. -keepclassmembers class * implements java.io.Serializable {
  62. static final long serialVersionUID;
  63. private static final java.io.ObjectStreamField[] serialPersistentFields;
  64. private void writeObject(java.io.ObjectOutputStream);
  65. private void readObject(java.io.ObjectInputStream);
  66. java.lang.Object writeReplace();
  67. java.lang.Object readResolve();
  68. }
  69. #EventBus的注解
  70. -keepclassmembers class * {
  71. @org.greenrobot.eventbus.Subscribe <methods>;
  72. }
  73. #WebView
  74. -keepclassmembers class * extends android.webkit.WebView {*;}
  75. -keepclassmembers class * extends android.webkit.WebViewClient {*;}
  76. -keepclassmembers class * extends android.webkit.WebChromeClient {*;}
  77. -keepclassmembers class * {
  78. @android.webkit.JavascriptInterface <methods>;
  79. }
  80. #-------------------------------------------项目定义区-------------------------------------------------
  81. #com.wang.*是为了适配其他项目③
  82. #bean
  83. -keep class com.wang.*.bean** {*;}
  84. #eventbus传递的类
  85. -keep class com.wang.*.eventbus.** {*;}
  86. #zxing相关,目前没动过
  87. -keep class com.wang.*.zxingjava.** {*;}
  88. #反射相关,暂无

对于某个特殊类或属性也可以在代码中使用@Keep注解来防止被混淆,举例如下

  1. @Keep//不混淆该类方法及属性,内部类需要再加注解
  2. public class TestClass {
  3. }

注:

①(release和debug在所有的module里默认都有(就算module没写也是存在的),如果想增加一个“debugProguard”则在每个module里都添加即可,不需要再配置一遍混淆,如下)

  1. buildTypes {
  2. debugProguard {
  3. initWith debug
  4. }
  5. }

②注意修改为自己的包名,如:-keep class !com.zhangshan.app.**,** {*;}

        AS3.0之前的混淆逻辑未测试,请自行测试
③反射、bean、eventbus等数据敏感区参照最后面的项目自定义自行增加

④Signature现在好像是个坑,这个属性目前没有任何作用,好像是最近才修复的:Incorrect handling of Record.Signature attribute · Issue #194 · Guardsquare/proguard · GitHub

很多新手总是出问题,此处追加demo:GitHub - weimingjue/ProguardExample: Proguard的示例

java代码里请改成自己的包路径,你的json解析文件及其他敏感数据请写在项目自定义区里面:

包路径即你java文件里声明“package com.x.x.x;”的前几个

问题1:没混淆正常,开了混淆就崩溃

请看日志!看日志!看日志!一般都是使用了反射出现的xxxNotFound异常或者一些bean数据类忘加了,自行添加忽略

问题2:开了混淆没任何作用

1.查看是否改成了自己的包路径(检查ApplicationId和packageName,如果不一致请按照上面修改)

2.查看release是否开启了混淆,打包时选择release,并用AS查看

4.确认你的混淆文件路径正确,并且和上面基本一致(如混淆文件乱放的、不小心写错了混淆文件、复制了其他人的混淆逻辑)

由于多数博客鱼龙混杂,本博客如果让你非常满意或解决了大家的根本性问题,希望多多支持在右边点赞和回复一下,举手之劳方便大家。

转载请注明出处:王能的博客Android Proguard 不混淆所有第三方jar(忽略配置设置)_王能的小屋-CSDN博客_android 不混淆

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/285536
推荐阅读
相关标签
  

闽ICP备14008679号