打包APK又一个看起来难 却不难并且不可或缺的标配,为什么这样说呢?由于没有混淆,你的代码被别人反编译你的代码将像一个裸奔的人一样展示在别人的面前。你的APP的安全将得不到保证。Android搞的混淆就是为了解决此类的问题。当然,很重要的东西还是建议用JNI完毕。
第一步: 我们要了解build.gradle文件里须要做什么配置
buildTypes { release { // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" //混淆 minifyEnabled true //Zipalign优化 zipAlignEnabled true // 移除没用的resource文件 shrinkResources true //混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.config } debug { signingConfig signingConfigs.config } }
第二步:我们到proguard-rules.pro文件里配置那些混淆 那些不
-optimizationpasses 10 # 指定代码的压缩级别 -dontusemixedcaseclassnames # 是否使用大写和小写混合 #-dontskipnonpubliclibraryclasses # 是否混淆第三方jar -dontpreverify # 混淆时是否做预校验 -verbose # 混淆时是否记录日志 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所採用的算法 -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 com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆 -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 native <methods>; } -keepclasseswithmembers class * { # 保持自己定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); # 保持自己定义控件类不被混淆 } -keepclassmembers class * extends android.app.Activity { # 保持自己定义控件类不被混淆 public void *(android.view.View); } -keepclassmembers enum * { # 保持枚举 enum 类不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *; } #-keep class MyClass; # 保持自己定义的类不被混淆 #假设有引用v4包能够加入以下这行 -keep class android.support.v4.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.app.Fragment以上通常是我们项目中必须设置的基本混淆配置
#假设引用了v4或者v7包,能够忽略警告,由于用不到android.support -dontwarn android.support.** #保持自己定义组件不被混淆 -keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } #保持 Serializable 不被混淆 -keepnames class * implements java.io.Serializable #保持 Serializable 不被混淆而且enum 类也不被混淆 -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(); } -keepclassmembers class * { public void *ButtonClicked(android.view.View); } #不混淆资源类 -keepclassmembers class **.R$* { public static <fields>; } #xUtils(保持注解,及使用注解的Activity不被混淆。不然会影响Activity中你使用注解相关的代码无法使用) -keep class * extends java.lang.annotation.Annotation {*;} -keep class com.otb.designerassist.activity.** {*;} #自己项目特殊处理代码(这些地方我使用了Gson类库和注解,所以不希望被混淆。以免影响程序) -keep class com.otb.designerassist.entity.** {*;} -keep class com.otb.designerassist.http.rspdata.** {*;} -keep class com.otb.designerassist.service.** {*;} # 以libaray的形式引用的图片载入框架,不想混淆(注意。此处不是jar包形式,想混淆去掉"#") -keep class com.nostra13.universalimageloader.** { *; } ###-------- Gson 相关的混淆配置-------- -keepattributes Signature -keepattributes *Annotation* -keep class sun.misc.Unsafe { *; } ###-------- pulltorefresh 相关的混淆配置--------- -dontwarn com.handmark.pulltorefresh.library.** -keep class com.handmark.pulltorefresh.library.** { *;} -dontwarn com.handmark.pulltorefresh.library.extras.** -keep class com.handmark.pulltorefresh.library.extras.** { *;} -dontwarn com.handmark.pulltorefresh.library.internal.** -keep class com.handmark.pulltorefresh.library.internal.** { *;} ###--------- reservoir 相关的混淆配置------- -keep class com.anupcowkur.reservoir.** { *;} ###-------- ShareSDK 相关的混淆配置--------- -keep class cn.sharesdk.** { *; } -keep class com.sina.sso.** { *; } ###--------------umeng 相关的混淆配置----------- -keep class com.umeng.** { *; } -keep class com.umeng.analytics.** { *; } -keep class com.umeng.common.** { *; } -keep class com.umeng.newxp.** { *; } ###-----------MPAndroidChart图库相关的混淆配置------------ -keep class com.github.mikephil.charting.** { *; } #微信支付 -keep class com.tencent.mm.sdk.** {*;}以上是一些第三方使用的jar包等 混淆配置
第一个问题:
这样的是包的警告 这里说明一下 dontwarn 是告诉打包工具。这个包别警告了。 keep是保持包里面的类和方法。
所以 那个包经过了 就
-dontwarn xxxx(包名).** 就能够攻克了 比方 :
-dontwarn com.google.gson.**