android picasso混淆,让你彻底会安卓Proguard混淆

本文详细介绍了Android开发中的代码混淆工具Proguard的使用,包括其主要功能、关键字、通配符以及如何配置混淆规则以保留关键类和成员。混淆规则涉及到四大组件、自定义控件、枚举、第三方库等多个方面,确保混淆过程不会破坏应用的正常运行。同时,文章还提醒了在混淆时应注意的一些重要事项,如避免混淆自定义控件、枚举、反射类、Gson实体类以及四大组件等。
摘要由CSDN通过智能技术生成

代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。

Proguard是什么

Proguard是一个集文件压缩,优化,混淆和校验等功能的工具

它检测并删除无用的类,变量,方法和属性

它优化字节码并删除无用的指令.

它通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果.

最后它还校验处理后的代码

混淆的常见配置

Proguard关键字

Proguard关键字

描述

dontwarn

dontwarn是一个和keep可以说是形影不离,尤其是处理引入的library时.

keep

保留类和类中的成员,防止被混淆或移除

keepnames

保留类和类中的成员,防止被混淆,成员没有被引用会被移除

keepclassmembers

只保留类中的成员,防止被混淆或移除

keepclassmembernames

只保留类中的成员,防止被混淆,成员没有引用会被移除

keepclasseswithmembers

保留类和类中的成员,防止被混淆或移除,保留指明的成员

keepclasseswithmembernames

保留类和类中的成员,防止被混淆,保留指明的成员,成员没有引用会被移除

Proguard通配符

Proguard通配符

描述

匹配类中的所有字段

匹配类中所有的方法

匹配类中所有的构造函数

*

匹配任意长度字符,不包含包名分隔符(.)

**

匹配任意长度字符,包含包名分隔符(.)

***

匹配任意参数类型

...

...

例如:

(1) 保留某个包下面的类以及子包

-keep class de.greenrobot.dao.**

(2) 保留所有类中的public带View参数方法

处理xml中些onClick方法

-keepclassmembers class * extends android.app.Activity{

public void *(android.view.View);

}

开启混淆

通常我们需要找到项目路径下app目录下的build.gradle文件,找到minifyEnabled这个配置,然后设置为true即可.

release {

minifyEnabled true//是否启动混淆 ture:打开 false:关闭

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

基本混淆

#############################################

#

# 对于一些基本指令的添加

#

#############################################

# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改

-optimizationpasses 5

# 混合时不使用大小写混合,混合后的类名为小写

-dontusemixedcaseclassnames

# 指定不去忽略非公共库的类

-dontskipnonpubliclibraryclasses

# 这句话能够使我们的项目混淆后产生映射文件

# 包含有类名->混淆后类名的映射关系

-verbose

# 指定不去忽略非公共库的类成员

-dontskipnonpubliclibraryclassmembers

# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。

-dontpreverify

# 保留Annotation不混淆

-keepattributes *Annotation*,InnerClasses

# 避免混淆泛型

-keepattributes Signature

# 抛出异常时保留代码行号

-keepattributes SourceFile,LineNumberTable

# 指定混淆是采用的算法,后面的参数是一个过滤器

# 这个过滤器是谷歌推荐的算法,一般不做更改

-optimizations !code/simplification/cast,!field/*,!class/merging/*

#############################################

#

# Android开发中一些需要保留的公共部分

#

#############################################

# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆

# 因为这些子类都有可能被外部调用

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Appliction

-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

# 保留R下面的资源

-keep class **.R$* {*;}

# 保留本地native方法不被混淆

-keepclasseswithmembernames class * {

native ;

}

# 保留在Activity中的方法参数是view的方法,

-keepclassmembers class * extends android.app.Activity{

public void *(android.view.View);

}

# 保留枚举类不被混淆

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

# support

-keep public class * extends android.support.v4.**

-keep public class * extends android.support.v7.**

-keep public class * extends android.support.annotation.**

# androidx的混淆

-keep class com.google.android.material.** {*;}

-keep class androidx.** {*;}

-keep public class * extends androidx.**

-keep interface androidx.** {*;}

-dontwarn com.google.android.material.**

-dontnote com.google.android.material.**

-dontwarn androidx.**

# 保留我们自定义控件(继承自View)不被混淆

-keep public class * extends android.view.View{

*** get*();

void set*(***);

public (android.content.Context);

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

# 保留Parcelable序列化类不被混淆

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

# 保留Serializable序列化的类不被混淆

-keepclassmembers class * implements java.io.Serializable {

static final long serialVersionUID;

private static final java.io.ObjectStreamField[] serialPersistentFields;

!static !transient ;

!private ;

!private ;

private void writeObject(java.io.ObjectOutputStream);

private void readObject(java.io.ObjectInputStream);

java.lang.Object writeReplace();

java.lang.Object readResolve();

}

# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆

-keepclassmembers class * {

void *(**On*Event);

void *(**On*Listener);

}

# webview 还要注意native接口

-keepclassmembers class * extends android.webkit.WebViewClient {

public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);

public boolean *(android.webkit.WebView, java.lang.String);

}

-keepclassmembers class * extends android.webkit.WebViewClient {

public void *(android.webkit.webView, jav.lang.String);

}

# keep annotated by NotProguard

-keep @top.andnux.proguard.annotation.Keep class * {*;}

-keep class * {

@top.andnux.proguard.annotation.Keep ;

}

-keepclassmembers class * {

@top.andnux.proguard.annotation.Keep ;

}

# 删除代码中Log相关的代码

-assumenosideeffects class android.util.Log {

public static boolean isLoggable(java.lang.String, int);

public static int v(...);

public static int i(...);

public static int w(...);

public static int d(...);

public static int e(...);

}

第三方混淆

#############################################

#

# 第三方混淆规则

#

#############################################

# 百度地图混淆配置

-keep class com.baidu.** {*;}

-keep class mapsdkvi.com.** {*;}

# ButterKnife混淆配置

-keep class butterknife.** { *; }

-dontwarn butterknife.internal.**

-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {

@butterknife.* ;

}

-keepclasseswithmembernames class * {

@butterknife.* ;

}

# OkHttp3混淆配置

-dontwarn com.squareup.okhttp3.**

-keep class com.squareup.okhttp3.** { *;}

-dontwarn okio.**

# Retrofit2混淆配置

-dontwarn retrofit2.**

-keep class retrofit2.** { *; }

-keepattributes Signature

-keepattributes Exceptions

# RxJava、RxAndroid混淆配置

-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {

long producerIndex;

long consumerIndex;

}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {

rx.internal.util.atomic.LinkedQueueNode producerNode;

}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {

rx.internal.util.atomic.LinkedQueueNode consumerNode;

}

# Glide混淆配置

-keep public class * implements com.bumptech.glide.module.GlideModule

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

}

# Picasso混淆配置

-keep class com.parse.*{ *; }

-dontwarn com.parse.**

-dontwarn com.squareup.picasso.**

-keepclasseswithmembernames class * {

native ;

}

# Fastjson混淆配置

-dontwarn com.alibaba.fastjson.**

-keep class com.alibaba.fastjson.**{*; }

# Gson混淆配置

-keep class com.google.gson.** {*;}

-keep class com.google.**{*;}

-keep class sun.misc.Unsafe { *; }

-keep class com.google.gson.stream.** { *; }

-keep class com.google.gson.examples.android.model.** { *; }

# GreenDao混淆配置

-keep class de.greenrobot.dao.** {*;}

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {

public static Java.lang.String TABLENAME;

}

-keep class **$Properties

# 高徳地图混淆配置

-dontwarn com.amap.api.**

-dontwarn com.a.a.**

-dontwarn com.autonavi.**

-keep class com.amap.api.** {*;}

-keep class com.autonavi.** {*;}

-keep class com.a.a.** {*;}

# Bugly混淆配置

-dontwarn com.tencent.bugly.**

-keep public class com.tencent.bugly.**{*;}

# tinker

-dontwarn com.tencent.tinker.**

-keep class com.tencent.tinker.** { *; }

-keep class androidx.**{*;}

#EventBus 3.0.x

-keepattributes *Annotation*

-keepclassmembers class ** {

@org.greenrobot.eventbus.Subscribe ;

}

-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor

-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {

(java.lang.Throwable);

}

# umeng混淆规则

-dontwarn com.umeng.**

-dontwarn com.taobao.**

-dontwarn anet.channel.**

-dontwarn anetwork.channel.**

-dontwarn org.android.**

-dontwarn org.apache.thrift.**

-dontwarn com.xiaomi.**

-dontwarn com.huawei.**

-dontwarn com.meizu.**

-keepattributes *Annotation*

-keep class com.taobao.** {*;}

-keep class org.android.** {*;}

-keep class anet.channel.** {*;}

-keep class com.umeng.** {*;}

-keep class com.xiaomi.** {*;}

-keep class com.huawei.** {*;}

-keep class com.meizu.** {*;}

-keep class org.apache.thrift.** {*;}

-keep class com.alibaba.sdk.android.**{*;}

-keep class com.ut.**{*;}

-keep class com.ta.**{*;}

-keep public class **.R$*{

public static final int *;

}

总结哪些不应该混淆

使用了自定义控件那么要保证它们不参与混淆

使用了枚举要保证枚举不被混淆

对第三方库中的类不进行混淆

运用了反射的类也不进行混淆

使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆

在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找

有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样

Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常

使用的四大组件,自定义的Application* 实体类

JNI中调用的类

Layout布局使用的View构造函数(自定义控件)、android:onClick等。

结束语

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值