安卓混淆java代码_Android R8代码混淆

Android Gradle插件升级至3.4.0版本之后,带来一个新特性-新一代混淆工具R8,做为D8的升级版替代Proguard;在应用压缩、应用优化方面提供更极致的体验。

3 k# A- k7 Y6 L& A1 ZR8 和 Proguard

2 u9 z+ ]( O* |0 o. y

1 t. K' y' T2 i) i6 Z: q  CR8 一步到位地完成了所有的缩减(shrinking),去糖(desugaring)和 转换成 Dalvik 字节码(dexing )过程。0 d* x- n8 B1 w9 ?1 u2 Z

缩减(shrinking)过程实现以下三个重要的功能:

' L" l# H) O- K& l! H/ J% B) O2 D4 M) O  r  C, P; L

代码缩减:从应用及其库依赖项中检测并安全地移除未使用的类、字段、方法和属性。

* t  p0 e5 u8 S2 b8 z6 H; J

资源缩减:从封装应用中移除不使用的资源,包括应用库依赖项中的不使用的资源。6 p& [, M  ]7 }+ P

优化:检查并重写代码,以进一步减小应用的 DEX 文件的大小。" p! o8 S9 F( T

混淆:缩短类和成员的名称,从而减小 DEX 文件的大小。, p! I4 ^, k& v" I7 NR8 和当前的代码缩减解决方案 Proguard 相比,R8 可以更快地缩减代码,同时改善输出大小。下面将通过几张数据图来对比(数据源自于 benchmark):

5 q" Y7 V. r  u$ W* `+ I3 M4 c0 x) z' o

65556f982685a310ffe99a28e18d572e.png

7be12d108f6d7ea5e04a0628d949a702.png

( s9 k5 n3 `: b: {. f% K

d961e41bdaf6fe719b2bc50237f39df1.pngR8混淆使用

# V* n) w! c- `9 a# H& d& P5 ^. E% a! S1 r$ P2 h% C( s. j

R8的使用非常简单,使用方式与Proguard并无差异,Android Studio创建项目时默认是关闭的,因为这会加长工程打包时间,所以开发阶段不建议开启。开启方式如下:

R5 z# r7 t7 @* ~: xbuildTypes {        release {            // 启用代码收缩、混淆和优化。            minifyEnabled true            // 启用资源缩减            shrinkResources true            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }可以看到gradle中加载了两个混淆配置文件, 其中 proguard-rules.pro 供开发者自定义混淆规则;proguard-android-optimize.txt 这是默认的配置文件,包含一些通用的混淆规则,在sdk/tools/proguard目录下,其中包含的内容如下:$ X6 f1 H& u  c9 u9 m4 _

# This is a configuration file for ProGuard.# http://proguard.sourceforge.net/index.html#manual/usage.html## This file is no longer maintained and is not used by new (2.2+) versions of the# Android plugin for Gradle. Instead, the Android plugin for Gradle generates the# default rules at build time and stores them in the build directory.# Optimizations: If you don't want to optimize, use the# proguard-android.txt configuration file instead of this one, which# turns off the optimization flags.  Adding optimization introduces# certain risks, since for example not all optimizations performed by# ProGuard works on all versions of Dalvik.  The following flags turn# off various optimizations known to have issues, but the list may not# be complete or up to date. (The "arithmetic" optimization can be# used if you are only targeting Android 2.0 or later.)  Make sure you# test thoroughly if you go this route.-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*-optimizationpasses 5-allowaccessmodification-dontpreverify# The remainder of this file is identical to the non-optimized version# of the Proguard configuration file (except that the other file has# flags to turn off optimization).-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-verbose-keepattributes *Annotation*-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native-keepclasseswithmembernames class * {    native ;}# keep setters in Views so that animations can still work.# see http://proguard.sourceforge.net/manual/examples.html#beans-keepclassmembers public class * extends android.view.View {   void set*(***);   *** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick-keepclassmembers class * extends android.app.Activity {   public void *(android.view.View);}# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}-keepclassmembers class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator CREATOR;}-keepclassmembers class **.R$* {    public static ;}# The support library contains references to newer platform versions.# Don't warn about those in case this app is linking against an older# platform version.  We know about them, and they are safe.-dontwarn android.support.**# Understand the @Keep support annotation.-keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {*;}-keepclasseswithmembers class * {    @android.support.annotation.Keep ;}-keepclasseswithmembers class * {    @android.support.annotation.Keep ;}-keepclasseswithmembers class * {    @android.support.annotation.Keep (...);}ProGuard常用规则

, n. u* F2 A$ T5 T- A5 S# e8 x$ e8 W( I9 {4 E  g, l: \

关闭压缩! ?3 l3 D3 M" p  f! ]

-dontshrink关闭代码优化

- S9 Y& N! B3 Y" F* _% T-dontoptimize关闭混淆7 n) S* ]- Z$ a2 r2 y

-dontobfuscate指定代码优化级别,值在0-7之间,默认为5

/ F0 O; P" k6 W4 \, g$ Z-optimizationpasses 5混淆时不使用大小写混合类名( R$ D1 C) w  ^) q- |4 P

-dontusemixedcaseclassnames不忽略库中的非public的类

6 K. T4 J, W5 O1 G# ~# O0 u-dontskipnonpubliclibraryclasses不忽略库中的非public的类成员; x$ m8 V5 v5 e1 u- }+ R; k

-dontskipnonpubliclibraryclassmembers输出详细信息

?% f- @& Z, E  k-verbose不做预校验,预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度

% e- p3 n, K0 r2 h- z; M3 B-dontpreverify保持指定包下的类名,不包括子包下的类名

( }& h2 R0 ~. F, n& d-keep class com.xy.myapp*保持指定包下的类名,包括子包下的类名

3 T) B5 V3 ]: {$ x% ^-keep class com.xy.myapp**保持指定包下的类名以及类里面的内容

& ?' x: C9 z' M8 u# S4 q8 F-keep class com.xy.myapp.* {*;}保持所有继承于指定类的类

% Z0 X/ f6 X, j. C/ ~-keep public class * extends android.app.Activity其它keep方法:

7 n( _5 N# b$ Z; Y保留防止被移除或者被混淆防止被混淆类和类成员-keep-keepnames仅类成员-keepclassmembers-keepclassmembernames如果拥有某成员,保留类和类成员-keepclasseswithmembers-keepclasseswithmembernames如果我们要保留一个类中的内部类不被混淆则需要用$符号,如下例子表示保持MyClass内部类JavaScriptInterface中的所有public内容。

" t& C2 l8 Z& v6 X4 @6 z4 P-keepclassmembers class com.xy.myapp.MyClass$JavaScriptInterface {   public *;}保持指定类的所有方法

2 h# C1 B' k! Y9 C7 n, e-keep class com.xy.myapp.MyClass {    public ;}保持指定类的所有字段' O, r% _2 l( N( ~

-keep class com.xy.myapp.MyClass {    public ;}保持指定类的所有构造器3 }3 |5 ?' ?# g/ k

-keep class com.xy.myapp.MyClass {    public ;}保持用指定参数作为形参的方法

- q3 @2 A- `& l- d" N$ f+ c. E-keep class com.xy.myapp.MyClass {    public (java.lang.String);}类文件除了定义类,字段,方法外,还为它们附加了一些属性,例如注解,异常,行号等,优化操作会删除不必要的属性,使用-keepattributes可以保留指定的属性

3 t+ \4 b0 g* c6 Z0 y6 m-keepattributes Exceptions,InnerClasses,Signature,Deprecated,                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod使指定的类不输出警告信息" V7 W' y# [; x

-dontwarn com.squareup.okhttp.**常用混淆模版( J6 D' B1 }; k8 @

' o) x2 H6 M  o: j/ g$ F# 指定代码的压缩级别-optimizationpasses 5     # 不忽略库中的非public的类成员-dontskipnonpubliclibraryclassmembers # google推荐算法-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*# 避免混淆Annotation、内部类、泛型、匿名类-keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod# 抛出异常时保留代码行号-keepattributes SourceFile,LineNumberTable# 保持四大组件-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class * extends android.view.View-keep public class com.android.vending.licensing.ILicensingService# 保持support下的所有类及其内部类-keep class android.support.** {*;}# 保留继承的-keep public class * extends android.support.v4.**-keep public class * extends android.support.v7.**-keep public class * extends android.support.annotation.**# 保持自定义控件-keep public class * extends android.view.View{    *** get*();    void set*(***);    public (android.

% c8 i/ b+ e% C7 {; cJava吧 收集整理 java论坛 www.java8.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值