Android Studio混淆打包

android混淆打包融师,可提高apk的安全性,去除沒(méi)用的資源,減小apk的體積。(PS:雖說(shuō)高手還是能反編譯)
build.gradle中android{
buildTypes {
debug {
// 顯示Log
buildConfigField "boolean", "ISOPENLOG", "true"
minifyEnabled false //
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
//關(guān)閉日志
buildConfigField "boolean", "ISOPENLOG", "false"
//Zipalign優(yōu)化
zipAlignEnabled true
// 移除無(wú)用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard- .pro'
}
}
}
Tip:如果混淆打包遇到找不到原因的問(wèn)題带膀,不妨試試將debug也混淆,并將日志開(kāi)關(guān)打開(kāi)橙垢。
/**

  • 日志開(kāi)關(guān)
    */
    private static boolean isOpenLog = BuildConfig.ISOPENLOG;
    //這樣配置很方便垛叨,也不會(huì)在上線時(shí)忘記關(guān)閉日志開(kāi)關(guān)。
    proguard-rules.pro配置文件如下:

    Add project specific ProGuard rules here.

By default, the flags in this file are appended to flags specified

in D:\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 *;
}

指定代碼的壓縮級(jí)別

-optimizationpasses 5

包明不混合大小寫

-dontusemixedcaseclassnames

不去忽略非公共的庫(kù)類

-dontskipnonpubliclibraryclasses

優(yōu)化 不優(yōu)化輸入的類文件

-dontoptimize

預(yù)校驗(yàn)

-dontpreverify

混淆時(shí)是否記錄日志

-verbose

混淆時(shí)所采用的算法

-optimizations !code/simplification/arithmetic,!field/,!class/merging/

保護(hù)注解

-keepattributes Annotation

保持哪些類不被混淆

-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Fragment
-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

如果有引用v4包可以添加下面這行

-keep public class * extends android.support.v4.app.Fragment

Bean 不被混淆

-keep class com.test.api.request.{;}
-keep class com.test.api.response.
{;}
-keep class com.test.model.*{;}

忽略警告

-ignorewarning

記錄生成的日志數(shù)據(jù),gradle build時(shí)在本項(xiàng)目根目錄輸出##

apk 包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)

-dump proguard/class_files.txt

未混淆的類和成員

-printseeds proguard/seeds.txt

列出從 apk 中刪除的代碼

-printusage proguard/unused.txt

混淆前后的映射

-printmapping proguard/mapping.txt
########記錄生成的日志數(shù)據(jù)柜某,gradle build時(shí) 在本項(xiàng)目根目錄輸出-end######

如果引用了v4或者v7包

-dontwarn android.support.**

混淆保護(hù)自己項(xiàng)目的部分代碼以及引用的第三方j(luò)ar包library-end####

#保持 native 方法不被混淆  

-keepclasseswithmembernames class * {
native <methods>;
}

保持自定義控件類不被混淆

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}

保持自定義控件類不被混淆

-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
(...);
}

保持 Parcelable 不被混淆

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

保持 Serializable 不被混淆

-keepnames class * implements java.io.Serializable

保持 Serializable 不被混淆并且enum 類也不被混淆

-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();
}

保持枚舉 enum 類不被混淆

-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * {
public void *ButtonClicked(android.view.View);
}

不混淆資源類

-keepclassmembers class *.R$ {
public static <fields>;
}

避免混淆泛型 如果混淆報(bào)錯(cuò)建議關(guān)掉

-keepattributes Signature

移除Log類打印各個(gè)等級(jí)日志的代碼嗽元,打正式包的時(shí)候可以做為禁log使用,這里可以作為禁止log打印的功能使用喂击,另外的一種實(shí)現(xiàn)方案是通過(guò)BuildConfig.DEBUG的變量來(lái)控制

-assumenosideeffects class android.util.Log {

public static *** v(...);

public static *** i(...);

public static *** d(...);

public static *** w(...);

public static *** e(...);

}

#############################################################################################
######################## 以上通用 ##################################
#############################################################################################
####################### 常用第三方模塊的混淆選項(xiàng) ###################################

gson

如果用用到Gson解析包的剂癌,直接添加下面這幾行就能成功混淆,不然會(huì)報(bào)錯(cuò)惭等。

-keepattributes Signature

Gson specific classes

-keep class sun.misc.Unsafe { *; }

Application classes that will be serialized/deserialized over Gson

-keep class com.google.gson.** { ; }
-keep class com.google.gson.stream.
* { *; }

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

butterknife

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

百度地圖忽略混淆

-keep class com.baidu.** { ; }
-keep class vi.com.gdi.bgl.android.
{;}

X 騰訊X5內(nèi)核忽略混淆

-keep class com.tencent.** { *; }

X Smack忽略混淆

-keep class org.jivesoftware.smack.*{ ; }
-keep class org.jivesoftware.smackx.
{ *; }

X glide忽略混淆

-keep class com.bumptech.glide.**{ *; }
-keep class com.sinodata.elove.utils.GlideCache{ *; }

引用的其他Module可以直接在app的這個(gè)混淆文件里配置

如果使用了Gson之類的工具要使被它解析的JavaBean類即實(shí)體類不被混淆珍手。

-keep class com.matrix.app.entity.json.** { ; }
-keep class com.matrix.appsdk.network.model.
* { *; }

混淆保護(hù)自己項(xiàng)目的部分代碼以及引用的第三方j(luò)ar包library#######

如果在當(dāng)前的application module或者依賴的library module中使用了第三方的庫(kù),并不需要顯式添加規(guī)則

-libraryjars xxx

添加了反而有可能在打包的時(shí)候遭遇同一個(gè)jar多次被指定的錯(cuò)誤辞做,一般只需要添加忽略警告和保持某些class不被混淆的聲明琳要。

以libaray的形式引用了開(kāi)源項(xiàng)目,如果不想混淆 keep 掉,在引入的module的build.gradle中設(shè)置minifyEnabled=false

遇到問(wèn)題開(kāi)發(fā)logcat秤茅,一步一步解決稚补,總會(huì)混淆成功的。2333框喳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末课幕,一起剝皮案震驚了整個(gè)濱河市厦坛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乍惊,老刑警劉巖杜秸,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異润绎,居然都是意外死亡撬碟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門莉撇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呢蛤,“玉大人,你說(shuō)我怎么就攤上這事棍郎∑湔希” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵涂佃,是天一觀的道長(zhǎng)励翼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)巡李,這世上最難降的妖魔是什么抚笔? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮侨拦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辐宾。我一直安慰自己狱从,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布叠纹。 她就那樣靜靜地躺著季研,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誉察。 梳的紋絲不亂的頭發(fā)上与涡,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音持偏,去河邊找鬼驼卖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸿秆,可吹牛的內(nèi)容都是我干的酌畜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卿叽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桥胞!你這毒婦竟也來(lái)了恳守?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贩虾,失蹤者是張志新(化名)和其女友劉穎催烘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缎罢,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伊群,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屁使。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片在岂。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛮寂,靈堂內(nèi)的尸體忽然破棺而出蔽午,到底是詐尸還是另有隱情,我是刑警寧澤酬蹋,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布及老,位于F島的核電站,受9級(jí)特大地震影響范抓,放射性物質(zhì)發(fā)生泄漏骄恶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一匕垫、第九天 我趴在偏房一處隱蔽的房頂上張望僧鲁。 院中可真熱鬧,春花似錦象泵、人聲如沸寞秃。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)春寿。三九已至,卻和暖如春忽孽,著一層夾襖步出監(jiān)牢的瞬間绑改,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工兄一, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厘线,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓瘾腰,卻偏偏與公主長(zhǎng)得像皆的,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹋盆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前兩周應(yīng)業(yè)務(wù)需要研究了一下混淆打包和sdk混淆技術(shù)费薄。在此記錄下心得硝全。 1.apk混淆打包 如果要對(duì)apk進(jìn)行混淆,...
    babybus_superdo閱讀 6,710評(píng)論 0 7
  • 轉(zhuǎn)載自: http://blog.csdn.net/u012188405/article/details/5198...
    fjxmyzy閱讀 1,712評(píng)論 1 5
  • 混淆規(guī)則 因?yàn)锳ndroid是使用Java開(kāi)發(fā)的楞抡,所以開(kāi)發(fā)者可以使用ProGuard對(duì)代碼進(jìn)行混淆伟众。SDK已經(jīng)集成...
    CarlosLynn閱讀 1,518評(píng)論 0 0
  • 1.首先需要在app下的build.gradle下配置,true表示編譯時(shí)會(huì)混淆代碼\ 2.在proguard-r...
    Thomas_yy閱讀 6,641評(píng)論 0 6
  • 在Android Studio當(dāng)中混淆APK實(shí)在是太簡(jiǎn)單了召廷,借助SDK中自帶的Proguard工具凳厢,只需要修改ap...
    自由翱翔de錘錘閱讀 2,524評(píng)論 1 2