混淆程式碼總結
混淆程式碼網址很棒的網址:
配置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,就一定能夠找到答案,只是時間長短不同而已。