Android混淆和加固详解
生活随笔
收集整理的這篇文章主要介紹了
Android混淆和加固详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我項(xiàng)目中添加的混淆
一、混淆
# 指定代碼的壓縮級別 0 - 7(指定代碼進(jìn)行迭代優(yōu)化的次數(shù),在Android里面默認(rèn)是5,這條指令也只有在可以優(yōu)化時(shí)起作用。)-optimizationpasses 5# 混淆時(shí)不會產(chǎn)生形形色色的類名(混淆時(shí)不使用大小寫混合類名)-dontusemixedcaseclassnames# 指定不去忽略非公共的庫類(不跳過library中的非public的類)-dontskipnonpubliclibraryclasses# 指定不去忽略包可見的庫類的成員-dontskipnonpubliclibraryclassmembers#不進(jìn)行優(yōu)化,建議使用此選項(xiàng),-dontoptimize# 不進(jìn)行預(yù)校驗(yàn),Android不需要,可加快混淆速度。-dontpreverify# 屏蔽警告-ignorewarnings# 指定混淆是采用的算法,后面的參數(shù)是一個(gè)過濾器# 這個(gè)過濾器是谷歌推薦的算法,一般不做更改-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 保護(hù)代碼中的Annotation不被混淆-keepattributes *Annotation*# 避免混淆泛型, 這在JSON實(shí)體映射時(shí)非常重要-keepattributes Signature# 拋出異常時(shí)保留代碼行號-keepattributes SourceFile,LineNumberTable#優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員,這可以提高優(yōu)化步驟的結(jié)果。# 比如,當(dāng)內(nèi)聯(lián)一個(gè)公共的getter方法時(shí),這也可能需要外地公共訪問。# 雖然java二進(jìn)制規(guī)范不需要這個(gè),要不然有的虛擬機(jī)處理這些代碼會有問題。當(dāng)有優(yōu)化和使用-repackageclasses時(shí)才適用。#指示語:不能用這個(gè)指令處理庫中的代碼,因?yàn)橛械念惡皖惓蓡T沒有設(shè)計(jì)成public ,而在api中可能變成public-allowaccessmodification#當(dāng)有優(yōu)化和使用-repackageclasses時(shí)才適用。 #-repackageclasses com.test# 混淆時(shí)記錄日志(打印混淆的詳細(xì)信息)# 這句話能夠使我們的項(xiàng)目混淆后產(chǎn)生映射文件# 包含有類名->混淆后類名的映射關(guān)系-verbose# ----------------------------- 默認(rèn)保留 ----------------------------- # 保持哪些類不被混淆 #繼承activity,application,service,broadcastReceiver,contentprovider....不進(jìn)行混淆-keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.view.View -keep public class * extends android.app.Service -keep class android.support.** {*;}## 保留support下的所有類及其內(nèi)部類 #---------------------------------------------------- # 保留support下的所有類及其內(nèi)部類 -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.** #----------------------------------------------------#這個(gè)主要是在layout 中寫的onclick方法android:onclick="onClick",不進(jìn)行混淆 #表示不混淆Activity中參數(shù)是View的方法,因?yàn)橛羞@樣一種用法,在XML中配置android:onClick=”buttonClick”屬性,#當(dāng)用戶點(diǎn)擊該按鈕時(shí)就會調(diào)用Activity中的buttonClick(View view)方法,如果這個(gè)方法被混淆的話就找不到了-keepclassmembers class * extends android.app.Activity{public void *(android.view.View);}#----------------------------------------------------# 保留枚舉類不被混淆-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);} #----------------------------------------------------#表示不混淆任何一個(gè)View中的setXxx()和getXxx()方法,#因?yàn)閷傩詣赢嬓枰邢鄳?yīng)的setter和getter的方法實(shí)現(xiàn),混淆了就無法工作了。-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);}#----------------------------------------------------# 這指定了繼承Serizalizable的類的如下成員不被移除混淆-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$* {*;}#--------------------------6.0及以上--------------------------#butterknife-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewInjector{ *; }-keepclasseswithmembernames class * {@butterknife.* <fields>; }-keepclasseswithmembernames class * {@butterknife.* <methods>; }#--------------------------------------------------------== # support-design -dontwarn android.support.design.** -keep class android.support.design.** { *; } -keep interface android.support.design.** { *; } -keep public class android.support.design.R$* { *; } #---------------------------------------------------- #不混淆資源類下static的 -keepclassmembers class **.R$* {public static <fields>; } #----------------------------------------------------#工具類不混淆 #-keep com.zhongyou.jiangxiplay.utils.** { *; } #-keep com.zhongyou.jiangxiplay.util.** { *; } #----------------------------------------------------# 對于帶有回調(diào)函數(shù)的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * {void *(**On*Event);void *(**On*Listener); } #----------------------------------------------------# 保留我們自定義控件(繼承自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);}#-------------------------阿里oss上傳圖片---------------------------------------keep class com.alibaba.sdk.android.oss.** { *; }-dontwarn okio.**-dontwarn org.apache.commons.codec.binary.**#---------------------------------實(shí)體類--------------------------- #--------(實(shí)體Model不能混淆,否則找不到對應(yīng)的屬性獲取不到值)------dontwarn com.zhongyou.jiangxiplay.entity.**#對含有反射類的處理-keep class com.zhongyou.jiangxiplay.entity.** { *; }#--------(實(shí)體Model不能混淆,否則找不到對應(yīng)的屬性獲取不到值)------dontwarn com.aliyun.vodplayerview.entity.**#對含有反射類的處理-keep class com.aliyun.vodplayerview.entity.** { *; } #---------------------------------------------------- # Fresco -keep class com.facebook.** {*;} -keep interface com.facebook.** {*;} -keep enum com.facebook.** {*;} #---------------------------------------------------- # Glide specific rules # -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {**[] $VALUES;public *; }#---------------------------------------------------- -keepattributes *Annotation* -keepclassmembers class ** {@org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {<init>(java.lang.Throwable); } # ----------------------------- 第三方庫、框架、SDK ----------------------------- -dontwarn com.google.gson.** -keep class com.google.gson.**{*;}#====okhttputils==== #-libraryjars libs/okhttputils.jar -dontwarn com.zhy.http.** -keep class com.zhy.http.**{*;} -keep interface com.zhy.http.**{*;}# OkHttp3 -dontwarn okhttp3.logging.** -keep class okhttp3.internal.**{*;} -dontwarn okio.** # Retrofit -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; }# -----------------------------阿里云視頻播放器------------------------------keep class com.alivc.player.**{*;}-keep class com.aliyun.clientinforeport.**{*;}-keep class com.aliyun.vodplayer.**{*;}-dontwarn com.alivc.player.**#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.ImageHeaderParser$** {**[] $VALUES;public *; }二、對抗apk重打包
1、獲取apk的簽名信息
public int getSignature(String packageName){PackageManager pm=this.getPackageManager();PackageInfo packageInfo=null;int sig=0;try {packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);android.content.pm.Signature[] signatures = packageInfo.signatures;sig=signatures[0].hashCode();} catch (PackageManager.NameNotFoundException e) {sig=0;e.printStackTrace();}return sig;}2、驗(yàn)證簽名,簽名不一致退出程序
private static final String TAG="signature"; if (getSignature("com.zhongyou.jiangxiplay")!=3417684655){android.os.Process.killProcess(android.os.Process.myPid()); }三、判斷是否是在模擬器上運(yùn)行,如果在模擬器上運(yùn)行退出應(yīng)用
private void isPhone() {if (IsMoNiQi.notHasBlueTooth()||IsMoNiQi.notHasLightSensorManager(this)||IsMoNiQi.isFeatures()||IsMoNiQi.checkIsNotRealPhone()){ // ToastUtils.showToast(this,"檢查到您的設(shè)備違規(guī),將限制您的所有功能使用!");android.os.Process.killProcess(android.os.Process.myPid());return;}}總結(jié)
以上是生活随笔為你收集整理的Android混淆和加固详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最全的芯片封装介绍
- 下一篇: nsis出错_安装程序出现NSIS ER