混淆代码网址很棒的网址:
1.Android项目实战(二十五):Android studio 混淆+打包+验证是否成功
2.Android Studio(十一):代码混淆及打包apk
4.Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
配置Android sdk:
把sdk目录下的platform-tools和tools路径配置到path中,用分号间隔
cmd输入adb或者是android -h说明配置成功
反编译:
1.apk重命名为zip,复制classes.dex到dex2jar-2.0文件夹下
2.cmd执行cd C:\Users\27c1\Desktop\dex2jar-2.0\dex2jar-2.0----enter
3.再输入d2j-dex2jar.bat classes.dex,ok,多了一个classes.jar文件
4.jd.gui.exe打开上边那个jar文件就是Java代码
android在打包的时候,应用程序会进行代码优化,优化的过程就把注解给去掉了。
在前面加上这一句,注解就可以保留了:
- -keepattributes *Annotation*
打包成功后app运行崩溃的处理:
#Crash信息处理--keep住源文件以及行号-keepattributes SourceFile,LineNumberTable
#保留数据库--记住一定不要加public-----------注明:这个是加密数据库
- -keep class net.sqlcipher.** {*;}
- -keep class net.sqlcipher.database.** {*;}
#autolayout--记住要写成1.4.5的依赖,1.4.3的会报AutoContentFrameLayout的错
- -keep class com.zhy.** { *; }
- -dontwarn com.zhy.**
release.apk集成到AS-build-outputs-apk下
配置gradle的环境变量:
gradle路径:D:\Android\gradle\gradle-2.14.1
path中添加:D:\Android\gradle\gradle-2.14.1\bin
再加一个GRADLE_HOME:D:\Android\gradle\gradle-2.14.1
高德地图:
AndroidStudio获取shar1:Terminal下输入如下:
D:\>keytool -list -v -keystore d:\ddlx.jks -alias ddlx -storepass ddlxddkj -keypass ddlxddkj
关于libs下jar包的问题:
将jar包复制到libs下,右键add as library,build.gradle下就会有compile file(__.jar)
如果有这句话,libs下自动加载
- sourceSets {
- main { jniLibs.srcDirs = ['libs'] }
- }
如果没有,单独 compile file
切记:
哎呀 微信分享不花钱 微信支付是要花钱的呀 阿西吧~
- #mob
- -keep class android.net.http.SslError
- -keep class android.webkit.**{*;}
- -keep class cn.sharesdk.**{*;}
- -keep class com.sina.**{*;}
- -keep class m.framework.**{*;}
- -keep class **.R$* {*;}
- -keep class **.R{*;}
- -dontwarn cn.sharesdk.**
- -dontwarn **.R$*
- #Retrofit
- -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;
- }
build.gradle(project):
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:2.2.2'
- classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.1'// 项目根目录build.gradle配置代码
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
- }
- apply plugin: 'com.android.application'
- apply plugin: 'com.getkeepsafe.dexcount'//在项目build.gardle中配置代码
最后统计的方法数是methods,feilds在项目-app-build-outputs-dexcount-release.txt中
开启混淆开关:
- build.gradle(app):
- android {
- buildTypes {
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- // 不显示Log
- buildConfigField "boolean", "LOG_DEBUG", "false"
- //Zipalign优化
- zipAlignEnabled true
- // 移除无用的resource文件
- shrinkResources true
- // signingConfig signingConfigs.release //使用上述签名信息
- }
- debug{
- //开启代码混淆
- minifyEnabled true
- // 移除无用的resource文件
- shrinkResources true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- lintOptions {
- abortOnError false
- }
- }
- # Add project specific ProGuard rules here.
- # By default, the flags in this file are appended to flags specified
- # in C:\Users\123\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
- # You can edit the include path and order by changing the proguardFiles
- # directive in build.gradle.
- #
- # For more details, see
- # http://developer.android.com/guide/developing/tools/proguard.html
- # Add any project specific keep options here:
- # If your project uses WebView with JS, uncomment the following
- # and specify the fully qualified class name to the JavaScript interface
- # class:
- #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
- # public *;
- #}
- -optimizationpasses 5 # 指定代码的压缩级别
- -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);
- }
- ##保持自定义组件不被混淆
- #-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*(...);
- #}
- # 保持枚举 enum 类不被混淆
- -keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
- }
- #保持 Serializable 不被混淆
- -keepnames class * implements java.io.Serializable
- # 保持 Parcelable 不被混淆
- -keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
- }
- #保持 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();
- }
- #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
- #-keepclassmembers enum * {
- # public static **[] values();
- # public static ** valueOf(java.lang.String);
- #}
- #如果有引用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.**
- -keepclassmembers class * {
- public void *ButtonClicked(android.view.View);
- }
- #不混淆资源类
- -keepclassmembers class **.R$* {
- public static <fields>;
- }
- #Gson
- -keepattributes Signature
- -keepattributes *Annotation*
- -keep class sun.misc.Unsafe { *; }
- #xUtils
- -keep class * extends java.lang.annotation.Annotation {*;}
- -keep class com.otb.designerassist.activity.** {*;}
- #ButterKnife
- -keep class butterknife.** { *; }
- -dontwarn butterknife.internal.**
- -keep class **$$ViewBinder { *; }
- -keepclasseswithmembernames class * {
- @butterknife.* <fields>;
- }
- -keepclasseswithmembernames class * {
- @butterknife.* <methods>;
- }
- #微信分享支付登录
- -keep class com.tencent.mm.sdk.** {
- *;
- }
- #支付宝支付
- #-libraryjars libs/alipaySDK-20161009.jar
- #
- #-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 *;}
- #高德地图
- #3D 地图
- -keep class com.amap.api.maps.**{*;}
- -keep class com.autonavi.amap.mapcore.*{*;}
- -keep class com.amap.api.trace.**{*;}
- #定位
- -keep class com.amap.api.location.**{*;}
- -keep class com.amap.api.fence.**{*;}
- -keep class com.autonavi.aps.amapapi.model.**{*;}
- #搜索
- -keep class com.amap.api.services.**{*;}
- #2D地图
- -keep class com.amap.api.maps2d.**{*;}
- -keep class com.amap.api.mapcore2d.**{*;}
- #导航
- -keep class com.amap.api.navi.**{*;}
- -keep class com.autonavi.**{*;}
- #Glide混淆
- -keep public class * implements com.bumptech.glide.module.GlideModule
- -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
- **[] $VALUES;
- public *;
- }
- # 以libaray的形式引用的图片加载框架,不想混淆(注意,此处不是jar包形式,想混淆去掉"#")
- #-keep class com.nostra13.universalimageloader.** { *; }
- #适配器
- -keep class com.uyac.elegantlife.adapter.**{*;}
- #二维码
- #-libraryjars libs/core-3.0.0.jar
- #OkHttp
- -dontwarn com.squareup.okhttp.**
- -keep class com.squareup.okhttp.** {*;}
- -keep interface com.squareup.okhttp.** {*;}
- -dontwarn okio.**
- #小米push keep包下的所有类
- -keep class com.xiaomi.push.service.receivers.NetworkStatusReceiver {*;}
- -keep public class * extends android.content.BroadcastReceiver
- #可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。
- -dontwarn com.xiaomi.push.**
- #小米push service
- #Warning:com.xiaomi.push.service.XMPushService: can't find referenced method 'void setLatestEventInfo(android.content.Context,java.lang.CharSequence,java.lang.CharSequence,android.app.PendingIntent)' in library class android.app.Notification
- -dontwarn org.apache.http.**
- -dontwarn android.net.http.AndroidHttpClient
- -dontwarn com.google.android.gms.**
- -dontwarn com.android.volley.toolbox.**
- #Warning:library class android.test.AndroidTestCase extends or implements program class junit.framework.TestCase
- -dontwarn org.mockito.**
- -dontwarn sun.reflect.**
- -dontwarn android.test.**
- #Warning:library class org.apache.http.conn.scheme.LayeredSocketFactory extends or implements program class org.apache.http.conn.scheme.SocketFactory
- -keep class org.apache.http.** { *; }
- -dontwarn org.apache.http.**
- -dontwarn android.net.**
- #Warning:org.junit.internal.runners.statements.FailOnTimeout: can't find referenced class java.lang.management.ManagementFactory
- #-dontwarn org.hamcrest.**
- #-dontwarn android.test.**
- #-dontwarn android.support.test.**
- #
- #-keep class org.hamcrest.** {
- # *;
- #}
- -keep class org.junit.** { *; }
- -dontwarn org.junit.**
- -keep class junit.** { *; }
- -dontwarn junit.**
- #-keep class sun.misc.** { *; }
- #-dontwarn sun.misc.**
- #autolayout 主类继承的Activity--
- #注意:autolayout要改成1.4.5的版本
- -keep class * extends com.zhy.autolayout.AutoLayoutActivity
- -keep class com.zhy.** { *; }
- -dontwarn com.zhy.**
- #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.** { *;}
- #屏蔽警告
- #-ignorewarnings
- #测试签名打包后app崩溃无法运行的问题
- -keepattributes EnclosingMethod
- #保留数据库工具类
- -keep class com.ddgl.ddlx.utility.**{*;}
- #-keep class com.kklink.yuexia.db.**{*;}
- #-keep class com.kklink.database.**{*;}
- #-keep class com.ddgl.ddlx.** { *; }
- -keepattributes *Annotation*
- #保留model实体
- -keep class com.ddgl.ddlx.model.**{*;}
- -keep class com.ddgl.ddlx.dao.**{*;}
- #关于数据库
- #保留数据库驱动--数据库驱动往往是动态加载的
- -keep class * implements java.sql.Driver
- -keep class net.sqlcipher.** {
- *;
- }
- -keep class net.sqlcipher.database.** {
- *;
- }
- -keep class * extends java.util.ListResourceBundle {
- protected Object[][] getContents();
- }
- -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
- public static final *** NULL;
- }
- -keepnames @com.google.android.gms.common.annotation.KeepName class *
- -keepclassmembernames class * {
- @com.google.android.gms.common.annotation.KeepName *;
- }
- -keepnames class * implements android.os.Parcelable {
- public static final ** CREATOR;
- }
- -dontwarn com.google.android.gms.**
- -dontwarn com.google.common.**
- #Crash信息处理--keep住源文件以及行号
- -keepattributes SourceFile,LineNumberTable