Android如何优雅地防止Bean类混淆

相信大家在开发Android app都会遇到一个问题:在打release包时bean类常常被混淆,导致出现空指针进而引发crash

如何做到保持指定的类不被混淆?方法不止一个

1、 在混淆配置文件中添加bean类包名,这样该包下所有的bean类都可以不被混淆了

-keep public class yourBeanPackageName.**{*;}

2、 使用@keep注解(推荐

Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现bug;你只要引用appcompat库或者support library就可以使用该注解了

dependencies {
    compile 'com.android.support:support-annotations:versionNum'//两选一
    compile 'com.android.support:appcompat-versionNum'//两选一
}

keep注解的定义

@Retention(CLASS)
@Target({PACKAGE,TYPE,ANNOTATION_TYPE,CONSTRUCTOR,METHOD,FIELD})
public @interface Keep {
}

我们可以看出keep注解可以作用于包、类、接口、注解类型、构造器、方法、字段上,@那里,那里就可以不混淆是不是很方便;

注意: 如果你的Android SDK Tools版本足够高(>24),那么在proguard-rules.pro文件其实不用做任何改动,因为Google已经帮我们在proguard-android.txt文件配置好了(如果较低就把下面代码拷贝到proguard-android.txt中),具体相关配置如下:

# 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 <methods>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <fields>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <init>(...);
}

3、 自定义注解

自定义注解原理其实和Keep一样,这里不在阐述了

发布了49 篇原创文章 · 获赞 63 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/dbs1215/article/details/53358406
今日推荐