Android开发实战——代码混淆解决方案,适配AndroidX
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android开发实战——代码混淆解决方案,适配AndroidX,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9026字,纯文字阅读大概需要13分钟。
内容图文
在android Studio中做混淆,基本就是对Proguard-rules.pro文件的操作。混淆的过程也是有规律可循的。下面我将分几个部分来分别介绍混淆过程。
(1)如何开启混淆。
(2)混淆的公共部分。
(3)需要我们不混淆的代码。
(4)libs下的第三方Jar包的混淆方式。
(5)complie的第三方Jar包的混淆方式。
(6)代码注释的混淆方式。
如何开启混淆
在Android Studio中找到你的项目module的build.gradle,将minifyEnabled设置为true就ok,如下图所示:
如何写混淆代码
#1.基本指令区 # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不进行优化,建议使用此选项, -dontoptimize # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify 能够加快混淆速度。 -dontpreverify # 使我们的项目混淆后产生映射文件包含有类名->混淆后类名的映射关系 -verbose # 使用printmapping指定映射文件的名称 -printmapping proguardMapping.txt # 屏蔽警告 -ignorewarnings # 指定混淆是采用的算法,后面的参数是一个过滤器这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/* # 保留Annotation不混淆 -keepattributes *Annotation* # 避免混淆泛型 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable
#2.默认保留区 # 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 # 因为这些子类都有可能被外部调用 -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 -keep public class com.google.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.** # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保留在Activity中的方法参数是view的方法,这样一来我们在layout中写的onClick就不会被影响 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保留枚举类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留我们自定义控件(继承自View)不被混淆 -keep public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); public <init>(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; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 保留R下面的资源 -keep class **.R$* { *; } # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } # 避免layout中onclick方法(android:onclick="onClick")混淆 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # webview -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -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); } #在app中与HTML5的JavaScript的交互进行特殊处理 #我们需要确保这些js要调用的原生方法不能够被混淆,于是我们需要做如下处理: #-keepclassmembers class com.XXX.XXX.JSInterface { # <methods>; #}
# 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.**
# 自己项目中定义的实体类 -keep class com.XXX.bean.** { *; } -keep class com.XXX.widget.** { *; } -keep class com.XXX.utils.** { *; } -keep class com.XXX.base.** { *; }
#第三方框架 # ButterKnife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } # EventBus -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); } # PictureSelector -keep class com.luck.picture.lib.** { *; } -dontwarn com.yalantis.ucrop** -keep class com.yalantis.ucrop** { *; } -keep interface com.yalantis.ucrop** { *; } -dontwarn org.codehaus.mojo.animal_sniffer.* # zxing -keep class com.google.zxing.{ *;} -dontwarn com.google.zxing.** -dontwarn cn.bingoogolapple.** -keep class cn.bingoogolapple.*{ *;} # Glide -dontwarn com.bumptech.glide.** -keep class com.bumptech.glide.**{*;} -keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.module.AppGlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # Gson -dontwarn sun.misc.** -keep class com.google.gson.examples.android.model.** { <fields>; } -keep class * extends com.google.gson.TypeAdapter -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer -keepclassmembers,allowobfuscation class * { @com.google.gson.annotations.SerializedName <fields>; } # OkHttp3 -dontwarn com.squareup.okhttp3.** -keep class com.squareup.okhttp3.** { *;} -dontwarn okio.** # Retrofit -dontnote retrofit2.Platform$IOS$MainThreadExecutor -keepattributes Exceptions -dontwarn retrofit2.** -keep class retrofit2.** { *; } # 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; } -dontnote rx.internal.util.PlatformDependent # 微信支付 -dontwarn com.tencent.mm.** -dontwarn com.tencent.wxop.stat.** -keep class com.tencent.mm.** {*;} -keep class com.tencent.wxop.stat.**{*;} # 支付宝钱包 -dontwarn com.alipay.** -dontwarn HttpUtils.HttpFetcher -dontwarn com.ta.utdid2.** -dontwarn com.ut.device.** -keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} -keep class com.alipay.mobilesecuritysdk.* -keep class com.ut.* # banner -dontwarn com.youth.banner.** -keep class com.youth.banner.**{*;} # loading -keep class com.wang.avi.** { *; } -keep class com.wang.avi.indicators.** { *; } # JPTabBar -keep class com.jpeng.** {*;} # SmartRefreshLayout -keep class com.scwang.** {*;} # 万能适配器 BaseRecyclerViewAdapterHelper -keep class com.chad.library.adapter.** { *; } -keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter -keep public class * extends com.chad.library.adapter.base.BaseViewHolder -keepclassmembers public class * extends com.chad.library.adapter.base.BaseViewHolder { <init>(android.view.View); } #友盟 -keep class com.umeng.**{*;} #您如果集成了U-APM产品可以加入该混淆 -keep class com.uc.**{*;} -keepclassmembers class*{ public<init>(org.json.JSONObject); } -keepclassmembers enum*{ publicstatic**[] values(); publicstatic** valueOf(java.lang.String); } # 屏幕适配 -keep class me.jessyan.autosize.** { *; } -keep interface me.jessyan.autosize.** { *; }
待更新。。。
注:一些用到了反射的类,单独写一下。反射代码不能被混淆。
内容总结
以上是互联网集市为您收集整理的Android开发实战——代码混淆解决方案,适配AndroidX全部内容,希望文章能够帮你解决Android开发实战——代码混淆解决方案,适配AndroidX所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。