Android混淆及多渠道打包總結(jié)


首先說說混淆

我們現(xiàn)在一般都用的as,很方便,直接在build.gradle里邊設(shè)置即可
- //混淆開關(guān)
minifyEnabled false
-//Zipalign優(yōu)化
zipAlignEnabled true
- // 移除無用的resource文件
shrinkResources true
- // proguardFiles這部分有兩段批狐,前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明前塔,免去了我們很多事嚣艇,這個(gè)文件的目錄在 /tools/proguard/proguard-android.txt , 后一部分是我們項(xiàng)目里的自定義的混淆文件,目錄就在 app/proguard-rules.txt
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

除了系統(tǒng)默認(rèn)的混淆文件我們不用管,我們只要注意我們的自定義混淆文件即可,在as中就是 "proguard-rules.pro" 文件

先簡單說一下混淆的一些常用語法:
-libraryjars class_path 應(yīng)用的依賴包华弓,如android-support-v4
-keep [,modifier,...] class_specification 不混淆某些類
-keepclassmembers [,modifier,...] class_specification 不混淆類的成員
-keepclasseswithmembers [,modifier,...] class_specification 不混淆類及其成員
-keepnames class_specification 不混淆類及其成員名
-keepclassmembernames class_specification 不混淆類的成員名
-keepclasseswithmembernames class_specification 不混淆類及其成員名
-assumenosideeffects class_specification 假設(shè)調(diào)用不產(chǎn)生任何影響食零,在proguard代碼優(yōu)化時(shí)會將該調(diào)用remove掉。如system.out.println和Log.v等等
-dontwarn [class_filter] 不提示warnning

再說一下Android 混淆原則:
反射用到的類不混淆
JNI方法不混淆
AndroidMainfest中的類不混淆寂屏,四大組件和Application的子類和Framework層下所有的類默認(rèn)不會進(jìn)行混淆
Parcelable的子類和Creator靜態(tài)成員變量不混淆贰谣,否則會產(chǎn)生android.os.BadParcelableException異常
使用GSON、fastjson等框架時(shí)迁霎,所寫的JSON對象類不混淆吱抚,否則無法將JSON解析成對應(yīng)的對象
使用第三方開源庫或者引用其他第三方的SDK包時(shí),需要在混淆文件中加入對應(yīng)的混淆規(guī)則
有用到WEBView的JS調(diào)用也需要保證寫的接口方法不混淆


下面貼出網(wǎng)上搜集到的i自定義混淆的一些資料(全部是在該文件下的設(shè)置),大概了解一下,以后用到可以去翻翻.(這些都是例子,具體要根據(jù)自己的項(xiàng)目結(jié)構(gòu)去設(shè)置)**
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\Administrator\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 *;}

# 有用到WEBView的JS調(diào)用接口不被混淆 
 -keepclassmembers class fqcn.of.javascript.interface.for.webview {   
      public *;  
 }    
#指定代碼的壓縮級別   
-optimizationpasses 5  
#包明不混合大小寫    
-dontusemixedcaseclassnames  
#不去忽略非公共的庫類    
-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.Activity    
-keep public class * extends android.app.Application    
-keep public class * extends android.app.Service   0
-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    
#忽略警告    
-ignorewarning  
#apk 包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)    
-dump class_files.txt    
#未混淆的類和成員    
-printseeds seeds.txt    
#列出從 apk 中刪除的代碼    
-printusage unused.txt    
#混淆前后的映射    
-printmapping mapping.txt    
#混淆保護(hù)自己項(xiàng)目的部分代碼以及引用的第三方j(luò)ar包library   
-libraryjars libs/umeng
-analytics-v5.2.4.jar    
sdk-v1.0.0.jar,look-v1.0.1.jar    
-libraryjars libs/sdk-v1.0.0.jar    
-libraryjars libs/look-v1.0.1.jar   
#忽略警告    
-dontwarn com.lippi.recorder.utils**    
#保留一個(gè)完整的包    
-keep class com.lippi.recorder.utils.** {        
        *;    
   }    
-keep class  com.lippi.recorder.utils.AudioRecorder{
        *;
    }    
#如果引用了v4或者v7包    
-dontwarn android.support.**    
#所有View的子類及其子類的get考廉、set方法都不進(jìn)行混淆    
-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*(...);    
  }    
#保持 native 方法不被混淆    
-keepclasseswithmembernames class * {        
        native <methods>;    
 }    #保持自定義控件類不被混淆    
-keepclasseswithmembers class * {        
            public <init>(android.content.Context, android.util.AttributeSet);    
  }    
#保持Activity中參數(shù)類型為View的所有方法    
-keepclassmembers class * extends android.app.Activity {       
        public void *(android.view.View);    
  }    
#保持 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 類不被混淆 如果混淆報(bào)錯(cuò)秘豹,建議直接使用上面的-keepclassmembers class * implements java.io.Serializable即可    
-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>;   
   }     
#不混淆所有的com.czy.bean包下的類和這些類的所有成員變量    
-keep class czy.**{
      *;
    }    
#避免混淆泛型 如果混淆報(bào)錯(cuò)建議關(guān)掉    
–keepattributes Signature    
#移除log 測試了下沒有用還是建議自己定義一個(gè)開關(guān)控制是否輸出日志   
-assumenosideeffects class android.util.Log {
         public static boolean isLoggable(java.lang.String, int);
         public static int v(...);
         public static int i(...);
         public static int w(...);
         public static int d(...);
         public static int e(...);
  }    
#如果用用到Gson解析包的,直接添加下面這幾行就能成功混淆昌粤,不然會報(bào)錯(cuò)既绕。    
-libraryjars libs/gson-2.2.2.jar
-keepattributes Signature
-keep class sun.misc.Unsafe { 
        *; 
  }
 # Application classes that will be serialized/deserialized over Gson  
-keep class com.google.gson.examples.android.model.** { 
          *; 
  }

接下來說說怎么打包

一般的簽名打一個(gè)包,其實(shí)沒什么,就簽名-->打包
這里其實(shí)主要的問題是一個(gè)多渠道打包的問題,我目前只會一種方法,就是通過gradle配置,聽朋友說還有一種幾百個(gè)包,三分鐘搞定的,還沒有研究.
接下來我就具體總結(jié)一下通過gradle配置文件,進(jìn)行多渠道打包的問題,(一次打五六個(gè)包,幾分鐘搞定,其實(shí)也挺快的!)
** 讓我們以友盟統(tǒng)計(jì)為例**

  • 首先我們現(xiàn)在Androidmaifest.xml文件里的application標(biāo)簽下,添加一個(gè)** meta-data**標(biāo)簽,如下圖所示:
Paste_Image.png
 這里用   **   ${    }    ** 引用,方便我們在build中,動態(tài)配置不同的打包渠道
  • 我們打開要打包的module下的build配置文件
    這里會有兩個(gè)方法,一個(gè)普通方法,一個(gè)快捷方法
    先說說普通方法,如下所示:
    roductFlavors {
    wandoujia {
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
    }
    baidu {
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
    }
    c360 {
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
    }
    uc {
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
    }
    ...
    ...
    ...
    }
    ** UMENG_CHANNEL_VALUE **,就是動態(tài)修改Androidmanifest中的value,分不同的渠道,比較麻煩,主題內(nèi)容重復(fù)
    快捷的方法就是把主題內(nèi)容抽出來單獨(dú)寫了一個(gè)方法:

          productFlavors { 
                wandoujia {}  
                baidu {}
                c360 {}
                ...
                ...
                ...
    
                productFlavors.all { flavor ->
                            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
                } 
           }
    

配置好以后,就是編譯打包了,首先** 要配置好gradle的環(huán)境變量** 方便我們在Terminal的方式(cmd應(yīng)該也可以,沒試過),運(yùn)行打包命令,如果不知道的話,我先貼出配置方法吧(其實(shí)跟java配置環(huán)境變量一樣一樣的)

  先找到gralde的根目錄啄刹,在系統(tǒng)變量里添加兩個(gè)環(huán)境變量:
  變量名為:GRADLE_HOME,變量值就為gradle的根目錄凄贩;
  所以變量值為:C:\Users\zilong\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1
  還有一個(gè)在系統(tǒng)變量里PATH里面添加gradle的bin目錄
  我的就是C:\Users\zilong\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1\bin

這里配置完成了鸵膏,接著在Terminal中敲下 ** gradle assembleRelease **就可以一次性生成所有的渠道包了。
所有生成的apk在項(xiàng)目的 ** build\outputs\apk **下怎炊。
如果想生成單個(gè)渠道的包怎么辦呢?不怕,我們有單個(gè)報(bào)的命令 ** gradle assembleWandoujiaRelease **,這樣就可以了.當(dāng)然這是豌豆莢的,百度,360,以此類推嘍~~~,如果不想用命令行怎么辦,不怕,我們as有這個(gè)功能,當(dāng)我們配置好參數(shù)以后,打開as右側(cè)的Gradle project面板,如下圖所示:


5I5I(A~B0%1_56@QW}9O635.png

接下來只要雙擊想要打包的渠道,就可以打包了,方便吧!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谭企,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子评肆,更是在濱河造成了極大的恐慌债查,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓜挽,死亡現(xiàn)場離奇詭異盹廷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)久橙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門俄占,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淆衷,你說我怎么就攤上這事缸榄。” “怎么了祝拯?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵甚带,是天一觀的道長。 經(jīng)常有香客問我佳头,道長鹰贵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任康嘉,我火速辦了婚禮碉输,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亭珍。我一直安慰自己敷钾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布块蚌。 她就那樣靜靜地躺著闰非,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峭范。 梳的紋絲不亂的頭發(fā)上财松,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼辆毡。 笑死菜秦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舶掖。 我是一名探鬼主播球昨,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眨攘!你這毒婦竟也來了主慰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鲫售,失蹤者是張志新(化名)和其女友劉穎共螺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情竹,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藐不,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秦效。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雏蛮。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阱州,靈堂內(nèi)的尸體忽然破棺而出挑秉,到底是詐尸還是另有隱情,我是刑警寧澤贡耽,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布衷模,位于F島的核電站鹊汛,受9級特大地震影響蒲赂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刁憋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一滥嘴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧至耻,春花似錦若皱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疤苹,卻和暖如春互广,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工惫皱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留像樊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓旅敷,卻偏偏與公主長得像生棍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子媳谁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涂滴,服務(wù)發(fā)現(xiàn),斷路器晴音,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • 這一章主要針對項(xiàng)目中可以用到的一些實(shí)用功能來介紹Android Gradle氢妈,比如如何隱藏我們的證書文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,572評論 3 25
  • ###多渠道打包概念 >* 發(fā)布到不同渠道上的apk,標(biāo)記不同的渠道,目的是為了統(tǒng)計(jì)該渠道的下載量,留存率等等數(shù)據(jù)...
    未聞椛洺閱讀 603評論 0 0
  • LeetCode10 這里s是要匹配的字符串段多,p是帶有“ . ”和“ * ”的匹配串首量。這道題可以用遞歸和DP解決,...
    方木Rudy閱讀 189評論 0 0