1. 程式人生 > >Android Studio 混淆打包及常見第三方依賴的混淆配置

Android Studio 混淆打包及常見第三方依賴的混淆配置

首先要在build.gradle中開啟混淆,也就是minifyEnabled true,我用的build.gradle具體如下所示:

def releaseTime() {
    return new Date().format("yyyy.MM.dd", TimeZone.getTimeZone("UTC"))
}

android {
    .... 

    buildTypes {
        release {
            // 混淆
            minifyEnabled true
            // Zipalign優化
            zipAlignEnabled true
// 移除無用的resource檔案 shrinkResources true // 前一部分代表系統預設的android程式的混淆檔案,該檔案已經包含了基本的混淆宣告,後一個檔案是自己的定義混淆檔案 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' applicationVariants.all { variant -> variant.
outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 輸出apk名稱為appname-1.0-beta1-xxxx-xx-xx.apk def fileName = "app-${defaultConfig.versionName}-beta1-${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName) } } } } } .... }

  上面註釋中寫到proguard-Android.txt檔案,這是系統預設的混淆檔案,具體在../sdk/tools/proguard/目錄下,其中包含了android最基本的混淆,一般不需要改動,我們需要配置的是專案中app下的proguard-rules.pro檔案,在此提供一份混淆模板。

#############################################
#
# 對於一些基本指令的新增
#
#############################################
# 程式碼混淆壓縮比,在0~7之間,預設為5,一般不做修改
-optimizationpasses 5

# 混合時不使用大小寫混合,混合後的類名為小寫
-dontusemixedcaseclassnames

# 指定不去忽略非公共庫的類
-dontskipnonpubliclibraryclasses

# 這句話能夠使我們的專案混淆後產生對映檔案
# 包含有類名->混淆後類名的對映關係
-verbose

# 指定不去忽略非公共庫的類成員
-dontskipnonpubliclibraryclassmembers

# 不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。
-dontpreverify

# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses

# 避免混淆泛型
-keepattributes Signature

# 丟擲異常時保留程式碼行號
-keepattributes SourceFile,LineNumberTable

# 指定混淆是採用的演算法,後面的引數是一個過濾器
# 這個過濾器是谷歌推薦的演算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*


#############################################
#
# Android開發中一些需要保留的公共部分
#
#############################################

# 保留我們使用的四大元件,自定義的Application等等這些類不被混淆
# 因為這些子類都有可能被外部呼叫
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService


# 保留support下的所有類及其內部類
-keep class android.support.** {*;}

# 保留繼承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**

# 保留R下面的資源
-keep class **.R$* {*;}

# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

# 保留在Activity中的方法引數是view的方法,
# 這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}

# 保留列舉類不被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# 保留我們自定義控制元件(繼承自View)不被混淆
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

# 保留Parcelable序列化類不被混淆
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

# 保留Serializable序列化的類不被混淆
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# 對於帶有回撥函式的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}

# webView處理,專案中沒有使用到webView忽略即可
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
    public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.webView, jav.lang.String);
}

# 移除Log類列印各個等級日誌的程式碼,打正式包的時候可以做為禁log使用,這裡可以作為禁止log列印的功能使用
# 記得proguard-android.txt中一定不要加-dontoptimize才起作用
# 另外的一種實現方案是通過BuildConfig.DEBUG的變數來控制
#-assumenosideeffects class android.util.Log {
#    public static int v(...);
#    public static int i(...);
#    public static int w(...);
#    public static int d(...);
#    public static int e(...);
#}

#############################################
#
# 專案中特殊處理部分
#
#############################################

#-----------處理反射類---------------



#-----------處理js互動---------------



#-----------處理實體類---------------
# 在開發的時候我們可以將所有的實體類放在一個包內,這樣我們寫一次混淆就行了。
#-keep public class com.ljd.example.entity.** {
#    public void set*(***);
#    public *** get*();
#    public *** is*();
#}


#-----------處理第三方依賴庫---------

  下面介紹常用第三方混淆配置(已按字母排序,不定期更新):

# AndroidEventBus
-keep class org.simple.** { *; }
-keep interface org.simple.** { *; }
-keepclassmembers class * {
    @org.simple.eventbus.Subscriber <methods>;
}

# 百度地圖(jar包換成自己的版本,記得簽名要匹配)
-libraryjars libs/baidumapapi_v2_1_3.jar
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-keep class com.sinovoice.** {*;}
-keep class pvi.com.** {*;}
-dontwarn com.baidu.**
-dontwarn vi.com.**
-dontwarn pvi.com.**

# Bugly
-dontwarn com.tencent.bugly.**
-keep class com.tencent.bugly.** {*;}

# ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; } 
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
} 
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# EventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Facebook
-keep class com.facebook.** {*;}
-keep interface com.facebook.** {*;}
-keep enum com.facebook.** {*;}

# FastJson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
-keepattributes Signature
-keepattributes *Annotation*

# Fresco
-keep class com.facebook.fresco.** {*;}
-keep interface com.facebook.fresco.** {*;}
-keep enum com.facebook.fresco.** {*;}

# 高德相關依賴
# 集合包:3D地圖3.3.2 導航1.8.0 定位2.5.0
-dontwarn com.amap.api.**
-dontwarn com.autonavi.**
-keep class com.amap.api.**{*;}
-keep class com.autonavi.**{*;}
# 地圖服務
-dontwarn com.amap.api.services.**
-keep class com.map.api.services.** {*;}
# 3D地圖
-dontwarn com.amap.api.mapcore.**
-dontwarn com.amap.api.maps.**
-dontwarn com.autonavi.amap.mapcore.**
-keep class com.amap.api.mapcore.**{*;}
-keep class com.amap.api.maps.**{*;}
-keep class com.autonavi.amap.mapcore.**{*;}
# 定位
-dontwarn com.amap.api.location.**
-dontwarn com.aps.**
-keep class com.amap.api.location.**{*;}
-keep class com.aps.**{*;}
# 導航
-dontwarn com.amap.api.navi.**
-dontwarn com.autonavi.**
-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 *;
}

# Gson
-keepattributes Signature-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
# 使用Gson時需要配置Gson的解析物件及變數都不混淆。不然Gson會找不到變數。
# 將下面替換成自己的實體類
-keep class com.example.bean.** { *; }

# Jackson
-dontwarn org.codehaus.jackson.**
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.jackson.** { *;}
-keep class com.fasterxml.jackson.** { *; }

# 極光推送
-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

# OkHttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

# Okio
-dontwarn com.squareup.**  
-dontwarn okio.**  
-keep public class org.codehaus.* { *; }  
-keep public class java.nio.* { *; }

# OrmLite
-keepattributes *DatabaseField* 
-keepattributes *DatabaseTable* 
-keepattributes *SerializedName*  
-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }

# Realm
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
-dontwarn javax.**
-dontwarn io.realm.**

# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

# Retrolambda
-dontwarn java.lang.invoke.*

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

# 微信支付
-dontwarn com.tencent.mm.**
-dontwarn com.tencent.wxop.stat.**
-keep class com.tencent.mm.** {*;}
-keep class com.tencent.wxop.stat.**{*;}

# 信鴿
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep class com.tencent.android.tpush.**  {* ;}
-keep class com.tencent.mid.**  {* ;}
-keepattributes *Annotation*

# 新浪微博
-keep class com.sina.weibo.sdk.* { *; }  
-keep class android.support.v4.* { *; }  
-keep class com.tencent.* { *; }  
-keep class com.baidu.* { *; }  
-keep class lombok.ast.ecj.* { *; }  
-dontwarn android.support.v4.**  
-dontwarn com.tencent.**s  
-dontwarn com.baidu.**  

# 訊飛語音
-dontwarn com.iflytek.**
-keep class com.iflytek.** {*;}

# 銀聯
-dontwarn com.unionpay.**
-keep class com.unionpay.** { *; }

# 友盟統計分析
-keepclassmembers class * { public <init>(org.json.JSONObject); }
-keepclassmembers enum com.umeng.analytics.** {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# 友盟自動更新
-keepclassmembers class * { public <init>(org.json.JSONObject); }
-keep public class cn.irains.parking.cloud.pub.R$*{ public static final int *; }
-keep public class * extends com.umeng.**
-keep class com.umeng.** { *; }

# 支付寶錢包
-dontwarn com.alipay.**
-dontwarn HttpUtils.HttpFetcher
-dontwarn com.ta.utdid2.**
-dontwarn com.ut.device.**
-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 *;}
-keep class com.alipay.mobilesecuritysdk.*
-keep class com.ut.*

相關推薦

Android Studio 混淆打包常見第三方依賴混淆配置

首先要在build.gradle中開啟混淆,也就是minifyEnabled true,我用的build.gradle具體如下所示:def releaseTime() { return new Date().format("yyyy.MM.dd", TimeZone.

android studio使用要點常見錯誤

1、主專案跟他的依賴lib要放在同一個目錄才能在eclipse中export 2、匯入eclipse中匯出的專案到studio後的配置: (1)開啟工作空間目錄下的 gradle –> wrapper –> gradle-wrapper.properties 。修改一下

Android Studio專案打包常見錯誤3:com.android.ide.common.process.ProcessException: Failed to execute aapt

Error while generating dependencies split APK com.android.ide.common.process.ProcessException: Failed to execute aapt Caused by: java.util.NoSuchE

Android Studio專案打包常見錯誤2:AAPT: libpng error: Not a PNG file

Generate Signed APK: Errors while building APK. You can find the errors in the 'Messages' view. 錯誤資訊: AAPT: libpng error: Not a PNG file FAILU

android studio注意要點常見錯誤

1、主專案跟他的依賴lib要放在同一個目錄才能在eclipse中export (2)開啟工作空間目錄下的 build.gradle 檔案。修改以下內容: classpath ‘com.android.tools.build:gradle:0.x.+’ –

Android Studio混淆模板常用第三方混淆(看了都說好)

首先要在build.gradle中開啟混淆,也就是minifyEnabled true,我用的build.gradle具體如下所示: def releaseTime() { return new Date().format("yyyy.MM.dd", TimeZone.getTimeZ

Android studio svn忽略檔案提交程式碼,混淆程式碼打包

Android Studio 中建議忽略的檔案: -  .idea  資料夾 -  .gradle  資料夾 - 所有的  build  資料夾 - 所有的  .iml  檔案

Android Studio專案打包(二)常見錯誤:Execution failed for task ':app:mergeReleaseResources'等等

    Generate Signed APK: Errors while building APK. You can find the errors in the 'Messages' view. 錯誤1: AAPT: libpng error: Not

使用android studio中遇到的常見問題解決方法

軟體環境:android studio 記錄一下自己使用android studio過程中遇到的問題和解決方案 Question 1: "cannot resolve symbol R" 解決方法

Android Studio多渠道打包和程式碼混淆教程

http://coolshell.info/blog/2015/03/android-studio-prefrence.html 什麼是Gradle Gradle是一種依賴管理工具,基於Groovy語言,面向Java應用為主,它拋棄了基於XML的各種繁瑣配置,取而

android studio gradle打包,怎麼樣通過打不同的包名所依賴的專案不同,即所生成的apk大小不一樣呢(每個apk不包含所有的依賴的專案)

問題:gradle打包,怎麼樣通過打不同的包名所依賴的專案不同,即所生成的apk大小不一樣呢(每個apk不包含所有的依賴的專案)??? 解決:通過修改build.gradle檔案中 在android{}新增如下程式碼:   在dependencies{}中新增 “F

Android Studio多渠道打包如何使用不同的資源,依賴和java程式碼

第一步:在build.gradle檔案中,設定productFlavors實現多渠道 //例項 productFlavors { baidu { appli

Android: Android Studio簽名打包的兩種方式(zz)

信息 rda pan 相同 prop .cn 一個 一次 ack 註:給我們自己開發的app簽名,就代表著我自己的版權,以後要進行升級,也必須要使用相同的簽名才行。簽名就代表著自己的身份(即keystore),多個app可以使用同一個簽名。如果不知道簽名是啥意思,請自行百度

Android Studio簽名打包應用

要求 系統環境變量 pro 技術 ces log sdn 數字簽名 調試 轉載請註明來源: http://blog.csdn.net/kjunchen/article/details/50812391 可直接看看以下的Android Studi

解決Android Studio 3.0導入module依賴後unable to merge index

無法 文件夾 post -i 估計 檢查 gradle 網上 mar 解決Android Studio 3.0導入module依賴後unable to merge index 項目需要使用im, 在項目裏導入了騰訊im的幾個module依賴, 項目無法編譯, 報錯unabl

Android studio 匯入另外一個專案作為依賴包問題集錦

昨天導師給了個任務,就是把AS的一個專案匯入到另外一個專案中作為library,跟之前把github上的開源專案匯入到工程中作為依賴是一樣的,由於之前只匯入過jar包 沒有匯入過一個專案,因此我就開搜了,結果因為搜的姿勢不對一直不行,百度搜索第一個eoe論壇的辦法也不管用,下面貼出我成功匯入的方法:

android studio 裝置除錯Logcat檢視

文章轉載自:http://www.cnblogs.com/apaojun/p/4283944.html 現在android的開發工具基本上都改用android studio而慢慢棄用eclipse了,那麼android studio的除錯裝置該怎麼設定和檢視程式的Logcat呢? &n

Android的.so檔案常見問題彙總

早期的Android系統幾乎只支援ARMv5的CPU架構,你知道現在它支援多少種嗎?7種! Android系統目前支援以下七種不同的CPU架構: ARMv5,ARMv7 (從2010年起), x86 (從2011年起), MIPS (從2012年起), ARMv8

Android Studio APK打包

APK簽名: 首先我們先要找到bulid: 點選Generate Signed APK: 找到我們需要簽名的專案,然後點選Next: 就會出來這個, 然後我們點選Create New...就會彈出一個視窗: 注意:password要和confirm要一

Android Studio的Preview的常見問題和技巧

轉自:Android Studio的Preview的常見問題和技巧 Android Studio提供了一個強大的“Preview”工具,可以幫助您預覽您的佈局檔案將如何在使用者的裝置上呈現。XML佈局可能是Android開發中最常用的資源。 您的專案中每個活動至少有一個佈局檔案。 Android