混淆代码总结

来源:互联网 发布:怎么开好淘宝店? 编辑:程序博客网 时间:2024/06/16 15:19

混淆代码网址很棒的网址:

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在打包的时候,应用程序会进行代码优化,优化的过程就把注解给去掉了。 

在前面加上这一句,注解就可以保留了:

-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;}
统计Android studio中有多少方法数:

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    }}
build.gradle(app):

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    }}
proguard配置文件:

# 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,就一定能够找到答案,只是时间长短不同而已。

0 0
原创粉丝点击