ProGuard ------------- Android 混淆详解

启用的ProGuard

  • 在应用夹数文件下build.gradle中进行配置,将minifyEnabled对划线true
<span style="color:#404040"><span style="color:#333333"><code><span style="color:#333333">buildTypes</span> <strong>{</strong>
        <span style="color:#333333">release</span> <strong>{</strong>
            <span style="color:#333333">minifyEnabled</span> <strong>true</strong>
            <span style="color:#333333">proguardFiles</span> <span style="color:#990000"><strong>getDefaultProguardFile</strong></span><strong>(</strong><span style="color:#a61717">'</span><span style="color:#333333">proguard</span><strong>-</strong><span style="color:#333333">android</span><strong>.</strong><span style="color:teal">txt</span><span style="color:#a61717">'</span><strong>),</strong> <span style="color:#a61717">'</span><span style="color:#333333">proguard</span><strong>-</strong><span style="color:#333333">rules</span><strong>.</strong><span style="color:teal">pro</span><span style="color:#a61717">'</span>
        <strong>}</strong>
    <strong>}</strong>
</code></span></span>

如上代码所示,在release打包的英文就会按照我们proguard-rules.pro的配置进行混淆,在调试时是不会进行混淆的。

混淆ProGuard的常用语法

后面的文件名,类名,或者包名等都可以使用占位符代替,标示一个字符可以匹配多个字符,但如果是一个类,不会匹配其前面的包名,*可以匹配多个字符,会匹配前面的包名。

  • 输入输出选项:
    1. -include filename 从给定的文件中读取配置参数;
    2. -injars class_path 输入(即使用的)罐子文件路径;
    3. -outjars class_path 输出罐子路径;
    4. -libraryjars class_path 指定的罐将不被混淆;
    5. -skipnonpubliclibraryclasses 跳过(不混淆)jars中的非公共课;
    6. -dontskipnonpubliclibraryclasses 不跳过(混淆)jars中的非公共类默认选项;
    7. -dontskipnonpubliclibraryclassmenbers 不跳过jars中的非公共类的成员;
    8. -keepdirectories [directory_filter] 指定目录keep to out jars中;
  • 保持不变的选项(混淆不进行处理的内容):
    1. -keep {Modifier} {class_specification} 保护指定的类文件和类的成员;
    2. -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好;
    3. -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在;
    4. -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除);
    5. -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除);
    6. -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后);
    7. -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件;
  • 压缩选项:
    1. -dontshrink 不启用; 收缩操作默认启用,主要的作用是将一些无效代码给移除,即没有被显示调用的代码;
    2. -printusage {filename} 打印被移除的代码,在标准输出;
    3. -whyareyoukeeping {class_specification} 打印在收缩过程中为什么有些代码被保留;
  • 优化选项
    1. -dontoptimize 不启用; shrink.shrink操作默认启用,主要的作用是将一些无效代码给移除,即没有被显示调用的代码;
    2. -optimizations optimization_filter 根据optimization_filter指定要优化的文件;
    3. -optimizationpasses n 优化数量N;
    4. -assumenosideeffects class_specification 优化时允许访问并修改类和类的成员的访问修饰符,可能作用域会变大;
    5. -mergeinterfacesaggressively 合并接口,即使它们的实现类未实现合并后接口的所有方法;
  • 混淆选项
    1. -dontobfuscate 不混淆;
    2. -printmapping [filename] 打印映射旧名到新名;
    3. -applymapping filename 打印相关;
    4. -obfuscationdictionary filename 指定外部模糊字典;
    5. -classobfuscationdictionary filename 指定类模糊字典;
    6. -packageobfuscationdictionary filename 指定包模糊字典;
    7. -overloadaggressively 过度加载,多个属性和方法使用相同的名字,只是参数和返回类型不同可能各种异常;
    8. -useuniqueclassmembernames 类和类成员都使用唯一的名字;
    9. -dontusemixedcaseclassnames 不使用大小写混合类名;
    10. -keeppackagenames [package_filter] 保持包名不混淆;
    11. -flattenpackagehierarchy [package_name] 指定重新打包,所有包重命名,这个选项会进一步模糊包名,将包里的类混淆成Ñ个再重新打包到一个个的封装中;
    12. -repackageclasses [package_name] 将包里的类混淆成Ñ个再重新打包到一个统一的包中会覆盖flattenpackagehierarchy选项;
    13. -keepattributes [attribute_filter] 混淆时可能被移除下面这些东西,如果想保留,需要用该选项;“ ,,,,,”AnnotationExceptionsSignatureDeprecatedSourceFileSourceDirLineNumberTable
  • 预校验选项
    1. -dontpreverify 不预校验,默认选项;
  • 通用选项
    1. -verbose 打印日志;
    2. -dontnote [class_filter] 不打印某些错误;
    3. -dontwarn [class_filter] 不打印警告信息;
    4. -ignorewarnings 忽略警告,继续执行;
    5. -printconfiguration [filename] 打印配置文件;
    6. -dump [filename] 指定打印类结构;

Android的默认的ProGuard配置

一般一个的Android应用项目创建成功后,系统默认有一个空的写满注释的文件proguard-rules.pro,可以我们在安装SDK目录Android_SDK\tools\proguard下找着proguard-android.txt这个文件,里面有系统默认准备的一些配置:

<span style="color:#404040"><span style="color:#333333"><code>
<span style="color:#a61717">#</span><span style="color:#333333">This</span> <span style="color:#333333">is</span> <span style="color:#333333">a</span> <span style="color:#333333">configuration</span> <span style="color:#333333">file</span> <strong>for</strong> <span style="color:#333333">ProGuard</span><strong>.</strong>
<span style="color:#a61717">#</span>http:<span style="color:#999988"><em>//<a data-cke-saved-href="http://proguard.sourceforge.net/index.html#manual/usage.html" href="http://proguard.sourceforge.net/index.html#manual/usage.html" class="vglnk">proguard.sourceforge.net/index.html#manual/usage.html</a></em></span>

<strong>-</strong><span style="color:#333333">dontusemixedcaseclassnames</span>  <span style="color:#a61717">#不使用大小写混合</span>
<strong>-</strong><span style="color:#333333">dontskipnonpubliclibraryclasses</span>  <span style="color:#a61717">#不混淆第三方</span><span style="color:#333333">jar</span>
<strong>-</strong><span style="color:#333333">verbose</span>  <span style="color:#a61717">#混淆时记录日志</span>

<span style="color:#a61717">#</span> <span style="color:#333333">Optimization</span> <span style="color:#333333">is</span> <span style="color:#333333">turned</span> <span style="color:#333333">off</span> <span style="color:#333333">by</span> <strong>default</strong><strong>.</strong> <span style="color:#333333">Dex</span> <span style="color:#333333">does</span> <span style="color:#333333">not</span> <span style="color:#333333">like</span> <span style="color:#333333">code</span> <span style="color:#333333">run</span>
<span style="color:#a61717">#</span> <span style="color:#333333">through</span> <span style="color:#333333">the</span> <span style="color:#333333">ProGuard</span> <span style="color:#333333">optimize</span> <span style="color:#333333">and</span> <span style="color:#333333">preverify</span> <span style="color:#990000"><strong>steps</strong></span> <strong>(</strong><span style="color:#333333">and</span> <span style="color:#333333">performs</span> <span style="color:#333333">some</span>
<span style="color:#a61717">#</span> <span style="color:#333333">of</span> <span style="color:#333333">these</span> <span style="color:#333333">optimizations</span> <span style="color:#333333">on</span> <span style="color:#333333">its</span> <span style="color:#333333">own</span><strong>).</strong>
<strong>-</strong><span style="color:#333333">dontoptimize</span>  <span style="color:#a61717">#不优化输入的类文件</span>
<strong>-</strong><span style="color:#333333">dontpreverify</span>  <span style="color:#a61717">#混淆时不做预校验</span>
<span style="color:#a61717">#</span> <span style="color:#333333">Note</span> <span style="color:#333333">that</span> <strong>if</strong> <span style="color:#333333">you</span> <span style="color:#333333">want</span> <span style="color:#333333">to</span> <span style="color:#333333">enable</span> <span style="color:#333333">optimization</span><strong>,</strong> <span style="color:#333333">you</span> <span style="color:#333333">cannot</span> <span style="color:#333333">just</span>
<span style="color:#a61717">#</span> <span style="color:#333333">include</span> <span style="color:#333333">optimization</span> <span style="color:#333333">flags</span> <span style="color:#333333">in</span> <span style="color:#333333">your</span> <span style="color:#333333">own</span> <span style="color:#333333">project</span> <span style="color:#333333">configuration</span> <span style="color:#333333">file</span><strong>;</strong>
<span style="color:#a61717">#</span> <span style="color:#333333">instead</span> <span style="color:#333333">you</span> <span style="color:#333333">will</span> <span style="color:#333333">need</span> <span style="color:#333333">to</span> <span style="color:#333333">point</span> <span style="color:#333333">to</span> <span style="color:#333333">the</span>
<span style="color:#a61717">#</span> <span style="color:#dd1144">"proguard-android-optimize.txt"</span> <span style="color:#333333">file</span> <span style="color:#333333">instead</span> <span style="color:#333333">of</span> <strong>this</strong> <span style="color:#333333">one</span> <span style="color:#333333">from</span> <span style="color:#333333">your</span>
<span style="color:#a61717">#</span> <span style="color:#333333">project</span><strong>.</strong><span style="color:teal">properties</span> <span style="color:#333333">file</span><strong>.</strong>

<strong>-</strong><span style="color:#333333">keepattributes</span> <strong>*</strong><span style="color:#333333">Annotation</span><strong>*</strong>  <span style="color:#a61717">#保留注解</span>
<strong>-</strong><span style="color:#333333">keep</span> <strong>public</strong> <strong>class</strong> <span style="color:#445588"><strong>com</strong></span><strong>.</strong><span style="color:teal">google</span><strong>.</strong><span style="color:teal">vending</span><strong>.</strong><span style="color:teal">licensing</span><strong>.</strong><span style="color:teal">ILicensingService</span>
<strong>-</strong><span style="color:#333333">keep</span> <strong>public</strong> <strong>class</strong> <span style="color:#445588"><strong>com</strong></span><strong>.</strong><span style="color:teal">android</span><strong>.</strong><span style="color:teal">vending</span><strong>.</strong><span style="color:teal">licensing</span><strong>.</strong><span style="color:teal">ILicensingService</span>

<span style="color:#a61717">#</span> <span style="color:#333333">For</span> <strong>native</strong> <span style="color:#333333">methods</span><strong>,</strong> <span style="color:#333333">see</span> http:<span style="color:#999988"><em>//<a data-cke-saved-href="http://proguard.sourceforge.net/manual/examples.html#native" href="http://proguard.sourceforge.net/manual/examples.html#native" class="vglnk">proguard.sourceforge.net/manual/examples.html#native</a></em></span>
<span style="color:#a61717">#</span> <span style="color:#a61717">保持</span> <strong>native</strong> <span style="color:#a61717">方法不被混淆</span>
<strong>-</strong><span style="color:#333333">keepclasseswithmembernames</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>
    <span style="color:#445588"><strong>native</strong></span> <strong><</strong><span style="color:#333333">methods</span><strong>>;</strong>
<strong>}</strong>

<span style="color:#a61717">#</span> <span style="color:#333333">keep</span> <span style="color:#333333">setters</span> <span style="color:#333333">in</span> <span style="color:#333333">Views</span> <span style="color:#333333">so</span> <span style="color:#333333">that</span> <span style="color:#333333">animations</span> <span style="color:#333333">can</span> <span style="color:#333333">still</span> <span style="color:#333333">work</span><strong>.</strong>
<span style="color:#a61717">#</span> <span style="color:#333333">see</span> http:<span style="color:#999988"><em>//<a data-cke-saved-href="http://proguard.sourceforge.net/manual/examples.html#beans" href="http://proguard.sourceforge.net/manual/examples.html#beans" class="vglnk">proguard.sourceforge.net/manual/examples.html#beans</a></em></span>
<strong>-</strong><span style="color:#333333">keepclassmembers</span> <strong>public</strong> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#445588"><strong>extends</strong></span> <span style="color:#333333">android</span><strong>.</strong><span style="color:teal">view</span><strong>.</strong><span style="color:teal">View</span> <strong>{</strong>
   <span style="color:#445588"><strong>void</strong></span> <span style="color:#333333">set</span><strong>*(***);</strong>
   <strong>***</strong> <span style="color:#333333">get</span><strong>*();</strong>
<strong>}</strong>

<span style="color:#a61717">#</span> <span style="color:#333333">We</span> <span style="color:#333333">want</span> <span style="color:#333333">to</span> <span style="color:#333333">keep</span> <span style="color:#333333">methods</span> <span style="color:#333333">in</span> <span style="color:#333333">Activity</span> <span style="color:#333333">that</span> <span style="color:#333333">could</span> <span style="color:#333333">be</span> <span style="color:#333333">used</span> <span style="color:#333333">in</span> <span style="color:#333333">the</span> <span style="color:#333333">XML</span> <span style="color:#333333">attribute</span> <span style="color:#333333">onClick</span>
<strong>-</strong><span style="color:#333333">keepclassmembers</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#445588"><strong>extends</strong></span> <span style="color:#333333">android</span><strong>.</strong><span style="color:teal">app</span><strong>.</strong><span style="color:teal">Activity</span> <strong>{</strong>
   <strong>public</strong> <span style="color:#445588"><strong>void</strong></span> <strong>*(</strong><span style="color:#333333">android</span><strong>.</strong><span style="color:teal">view</span><strong>.</strong><span style="color:teal">View</span><strong>);</strong>
<strong>}</strong>

<span style="color:#a61717">#</span> <span style="color:#333333">For</span> <span style="color:#333333">enumeration</span> <span style="color:#333333">classes</span><strong>,</strong> <span style="color:#333333">see</span> http:<span style="color:#999988"><em>//<a data-cke-saved-href="http://proguard.sourceforge.net/manual/examples.html#enumerations" href="http://proguard.sourceforge.net/manual/examples.html#enumerations" class="vglnk">proguard.sourceforge.net/manual/examples.html#enumerations</a></em></span>
<strong>-</strong><span style="color:#333333">keepclassmembers</span> <strong>enum</strong> <strong>*</strong> <strong>{</strong>
    <strong>public</strong> <strong>static</strong> <strong>**[]</strong> <span style="color:#333333">values</span><strong>();</strong>
    <strong>public</strong> <strong>static</strong> <strong>**</strong> <span style="color:#333333">valueOf</span><strong>(</strong><span style="color:#333333">java</span><strong>.</strong><span style="color:teal">lang</span><strong>.</strong><span style="color:teal">String</span><strong>);</strong>
<strong>}</strong>

<strong>-</strong><span style="color:#333333">keepclassmembers</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#445588"><strong>implements</strong></span> <span style="color:#333333">android</span><strong>.</strong><span style="color:teal">os</span><strong>.</strong><span style="color:teal">Parcelable</span> <strong>{</strong>
  <strong>public</strong> <strong>static</strong> <strong>final</strong> <span style="color:#333333">android</span><strong>.</strong><span style="color:teal">os</span><strong>.</strong><span style="color:teal">Parcelable</span><span style="color:#333333">$Creator</span> <span style="color:#333333">CREATOR</span><strong>;</strong>
<strong>}</strong>

<strong>-</strong><span style="color:#333333">keepclassmembers</span> <strong>class</strong> <span style="color:#a61717">**.</span><span style="color:#445588"><strong>R</strong></span><span style="color:#a61717">$</span><strong>*</strong> <strong>{</strong>
    <strong>public</strong> <strong>static</strong> <strong><</strong><span style="color:#333333">fields</span><strong>>;</strong>
<strong>}</strong>

<span style="color:#a61717">#</span> <span style="color:#333333">The</span> <span style="color:#333333">support</span> <span style="color:#333333">library</span> <span style="color:#333333">contains</span> <span style="color:#333333">references</span> <span style="color:#333333">to</span> <span style="color:#333333">newer</span> <span style="color:#333333">platform</span> <span style="color:#333333">versions</span><strong>.</strong>
<span style="color:#a61717">#</span> <span style="color:#333333">Don</span><span style="color:#a61717">'</span><span style="color:#333333">t</span> <span style="color:#333333">warn</span> <span style="color:#333333">about</span> <span style="color:#333333">those</span> <span style="color:#333333">in</span> <strong>case</strong> <strong>this</strong> <span style="color:#333333">app</span> <span style="color:#333333">is</span> <span style="color:#333333">linking</span> <span style="color:#333333">against</span> <span style="color:#333333">an</span> <span style="color:#333333">older</span>
<span style="color:#a61717">#</span> <span style="color:#333333">platform</span> <span style="color:#333333">version</span><strong>.</strong>  <span style="color:#333333">We</span> <span style="color:#333333">know</span> <span style="color:#333333">about</span> <span style="color:#333333">them</span><strong>,</strong> <span style="color:#333333">and</span> <span style="color:#333333">they</span> <span style="color:#333333">are</span> <span style="color:#333333">safe</span><strong>.</strong>
<strong>-</strong><span style="color:#333333">dontwarn</span> <span style="color:#333333">android</span><strong>.</strong><span style="color:teal">support</span><strong>.**</strong>

<span style="color:#a61717">#</span> <span style="color:#333333">Understand</span> <span style="color:#333333">the</span> @Keep <span style="color:#333333">support</span> <span style="color:#333333">annotation</span><strong>.</strong>
<strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">annotation</span><strong>.</strong><span style="color:teal">Keep</span>

<strong>-</strong><span style="color:#333333">keep</span> @android<strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">annotation</span><strong>.</strong><span style="color:teal">Keep</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{*;}</span>

<span style="color:#a61717">-</span><span style="color:#445588"><strong>keepclasseswithmembers</strong></span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>
    <span style="color:#a61717">@</span><span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">annotation</span><strong>.</strong><span style="color:teal">Keep</span> <strong><</strong><span style="color:#333333">methods</span><strong>>;</strong>
<strong>}</strong>

<strong>-</strong><span style="color:#333333">keepclasseswithmembers</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>
    <span style="color:#a61717">@</span><span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">annotation</span><strong>.</strong><span style="color:teal">Keep</span> <strong><</strong><span style="color:#333333">fields</span><strong>>;</strong>
<strong>}</strong>

<strong>-</strong><span style="color:#333333">keepclasseswithmembers</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>
    <span style="color:#a61717">@</span><span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">annotation</span><strong>.</strong><span style="color:teal">Keep</span> <strong><</strong><span style="color:#333333">init</span><strong>>(...);</strong>
<strong>}</strong>

</code></span></span>

查看ProGuard的输出文件

混淆之后,ProGuard的会给我们输出一些文件,在/build/proguard/目录下,分别有以下文件:

  • mapping.txt

    表示混淆前后代码的对照表,这个文件非常重要,如果你的代码混淆后会产生的错误的话,登录提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推,每次发布都要保留它方便该版本出现问题时调出日志进行排查,它可以根据版本号或是发布时间命名来保存或是放进代码版本控制中。

  • dump.txt

    描述APK内所有类文件的内部结构。

  • seeds.txt

    列出了没有被混淆的类和成员。

  • usage.txt

    列出了源代码中被删除在APK中不存在的代码。

混淆总结

  1. 如果使用了GSON之类的工具要保证实体类不被混淆
  2. 如果使用了自定义控件那就需要保证它们不参与混淆
  3. 第三方库中的类不进行混淆
  4. 代码中使用了反射,需要保证该反射类类名方法不变
  5. 继承了序列化接口的类不混淆
  • Fragment
<span style="color:#404040"><span style="color:#333333"><code><span style="color:#a61717">#如果引用了</span><span style="color:#333333">v4</span><span style="color:#a61717">或者</span><span style="color:#333333">v7</span><span style="color:#a61717">包</span>
<span style="color:#a61717">#</span> <span style="color:#333333">Keep</span> <span style="color:#333333">the</span> <span style="color:#333333">support</span> <span style="color:#333333">library</span>
<strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">v4</span><strong>.**</strong> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
<strong>-</strong><span style="color:#333333">keep</span> <strong>interface</strong> <span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">v4</span><strong>.**</strong> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
<span style="color:#a61717">#</span> <span style="color:#333333">Keep</span> <span style="color:#333333">the</span> <span style="color:#333333">support</span> <span style="color:#333333">library</span>
<strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">v7</span><strong>.**</strong> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
<strong>-</strong><span style="color:#333333">keep</span> <strong>interface</strong> <span style="color:#445588"><strong>android</strong></span><strong>.</strong><span style="color:teal">support</span><strong>.</strong><span style="color:teal">v7</span><strong>.**</strong> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
</code></span></span>
  • ButterKnife 6.0
<span style="color:#404040"><span style="color:#333333"><code><strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#445588"><strong>butterknife</strong></span><strong>.**</strong> <strong>{</strong> <strong>*;</strong> <strong>}</strong> 
  <strong>-</strong><span style="color:#333333">dontwarn</span> <span style="color:#333333">butterknife</span><strong>.</strong><span style="color:teal">internal</span><strong>.**</strong>
  <strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#a61717">**$$</span><span style="color:#445588"><strong>ViewInjector</strong></span> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
  <strong>-</strong><span style="color:#333333">keepclasseswithmembernames</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>
          <span style="color:#a61717">@</span><span style="color:#445588"><strong>butterknife</strong></span><strong>.*</strong> <strong><</strong><span style="color:#333333">fields</span><strong>>;</strong>
  <strong>}</strong>
  <strong>-</strong><span style="color:#333333">keepclasseswithmembernames</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>
     <span style="color:#a61717">@</span><span style="color:#445588"><strong>butterknife</strong></span><strong>.*</strong> <strong><</strong><span style="color:#333333">methods</span><strong>>;</strong>
  <strong>}</strong>
</code></span></span>
  • ButterKnife 7.0
<span style="color:#404040"><span style="color:#333333"><code><strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#445588"><strong>butterknife</strong></span><strong>.**</strong> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
<strong>-</strong><span style="color:#333333">dontwarn</span> <span style="color:#333333">butterknife</span><strong>.</strong><span style="color:teal">internal</span><strong>.**</strong>
<strong>-</strong><span style="color:#333333">keep</span> <strong>class</strong> <span style="color:#a61717">**$$</span><span style="color:#445588"><strong>ViewBinder</strong></span> <strong>{</strong> <strong>*;</strong> <strong>}</strong>
<strong>-</strong><span style="color:#333333">keepclasseswithmembernames</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>  
 <span style="color:#a61717">@</span><span style="color:#445588"><strong>butterknife</strong></span><strong>.*</strong> <strong><</strong><span style="color:#333333">fields</span><strong>>;</strong>
<strong>}</strong>
<strong>-</strong><span style="color:#333333">keepclasseswithmembernames</span> <strong>class</strong> <span style="color:#a61717">*</span> <span style="color:#a61717">{</span>   
<span style="color:#a61717">@</span><span style="color:#445588"><strong>butterknife</strong></span><strong>.*</strong> <strong><</strong><span style="color:#333333">methods</span><strong>>;</strong>
<strong>}</strong>
</code></span></span>

更多内容可以参考以下博客:

Android proguard详解

混淆样子

Android的代码混淆之混淆规则

Android的开发实践:利用的ProGuard进行代码混淆

使用ProGuard的混淆Android的代码

转载自  https://donniesky.me/2016/04/15/how-use-proguard/

发布了6 篇原创文章 · 获赞 15 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/pkorochi/article/details/100925696