1. 程式人生 > >混淆程式碼總結

混淆程式碼總結

混淆程式碼網址很棒的網址:

配置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,就一定能夠找到答案,只是時間長短不同而已。