您的位置:首页 > 编程语言

混淆代码总结

2017-07-14 16:44 190 查看
混淆代码网址很棒的网址:
1.Android项目实战(二十五):Android studio 混淆+打包+验证是否成功
2.Android Studio(十一):代码混淆及打包apk
3.Android代码混淆之混淆规则
4.Error:warning: Ignoring InnerClasses
attribute for an anonymous inner class
5.Android App 混淆、打包、错误日志追踪
6.Android分享:代码混淆那些事
7.关于混淆的好多网址及问题:
配置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在打包的时候,应用程序会进行代码优化,优化的过程就把注解给去掉了。
在前面加上这一句,注解就可以保留了:

[java] view
plain copy

-keepattributes *Annotation*

打包成功后app运行崩溃的处理:
#Crash信息处理--keep住源文件以及行号
-keepattributes SourceFile,LineNumberTable
#保留数据库--记住一定不要加public-----------注明:这个是加密数据库

[java] view
plain copy

-keep class net.sqlcipher.** {*;}

-keep class net.sqlcipher.database.** {*;}

#autolayout--记住要写成1.4.5的依赖,1.4.3的会报AutoContentFrameLayout的错

[java] view
plain copy

-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下自动加载

[java] view
plain copy

sourceSets {

main { jniLibs.srcDirs = ['libs'] }

}

如果没有,单独 compile file

切记:
哎呀 微信分享不花钱
微信支付是要花钱的呀 阿西吧~

[java] view
plain copy

#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;

}

统计Android studio中有多少方法数:

build.gradle(project):

[java] view
plain copy

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

}

}

build.gradle(app):

[java] view
plain copy

apply plugin: 'com.android.application'

apply plugin: 'com.getkeepsafe.dexcount'//在项目build.gardle中配置代码

注意:要仔细观察

最后统计的方法数是methods,feilds在项目-app-build-outputs-dexcount-release.txt中
开启混淆开关:

[java] view
plain copy

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

}

}

proguard配置文件:

[java] view
plain copy

# 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

感悟:其实并不难 只是找不到。只要用心去找bug,就一定能够找到答案,只是时间长短不同而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息