在實際項目開發過程當中,因爲運營的須要,咱們每每須要知道咱們的APP在各大應用市場的下載和具體使用狀況,這時候咱們每每須要接入第三方統計,較經常使用的就是友盟統計。具體接入方式能夠查看友盟統計的官方接入文檔:html
仔細觀察文檔能夠發現,在舊版本中,咱們是經過在AndroidManifest.xml
文件中配置java
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
來實現渠道號的設置的,而後每次打新渠道包的時候,只須要手動修改這個Channel ID
便可,固然,爲了減小這種手動輸入,咱們能夠經過productFlavor
來實現多渠道打包,但這本質上仍是每次都從新打一個包,只是解放了咱們的雙手,但並無解決打包效率低、耗時的問題。其實咱們須要的就是把咱們要統計的App的渠道ID傳給友盟,來讓友盟進行渠道的統計,對此,友盟提供了新的接入方式:python
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret)
這時候咱們能夠將以前AndroidManifest.xml
中的channelId
配置相關的<meta-data>
刪除,只須要提供channel便可,而後就能夠經過美團Walle或者其餘方式來獲取到這個channel便可。android
傳統打包方案除了經過productFlavor方式外,還要經過apktools方式逆向來實現多渠道,這種方式原理也很簡單,就是講apk解壓,而後經過修改AndroidManifest.xml中的渠道值,再從新進行打包和簽名。這種方式咱們每次打包時再也不須要從新構建項目。只需先打包生成一個apk,而後在該apk的基礎上生成其餘渠道包便可。這種方式雖然比以前快了不少,但還能更快。git
美團第一代多渠道打包方式提供了在META-INF
目錄內添加空文件這種方案,具體能夠參考:https://tech.meituan.com/mt-a...,這種方案快在,咱們能直接修改apk的渠道號,而不須要再從新簽名,這樣能節省很多打包的時間。據美團將,這種打包方式速度很是快,900多個渠道不到一分鐘就能打完。github
可是好景不長,在Android 7.0(Nougat)推出了新的應用簽名方案APK Signature Scheme v2
後,以前快速生成渠道包的方式(美團Android自動化之旅—生成渠道包)已經行不通了(固然,咱們能夠暫時經過設置v2SigningEnabled false
來繼續經過以前的方式打包,但最好仍是應該接受新的改變),由於以前的簽名方案並不會校驗META-INF
目錄,於是咱們對該目錄的修改並不須要從新簽名。而新的方案下,咱們對apk中包含的文件的任何修改,都會引發校驗失敗。這時美團推出了第二代多渠道打包方案Walle。segmentfault
第二代多渠道打包方案Walle的思路其實就是從Zip文件自己入手,由於apk本質上仍是一個Zip文件,美團經過在ZIP文件格式的 Central Directory
區塊所在文件位置的前面添加一個APK Signing Block
區塊,而後把渠道信息寫到這個區塊中,以後再讀出這個信息,就完成了。固然,實際細節比較複雜。具體能夠參考新一代開源Android渠道包生成工具Walle,聽說這種打包方式速度很是快,對一個30M大小的APK包只須要100多毫秒(包含文件複製時間)就能生成一個渠道包,而在運行時獲取渠道信息只須要大約幾毫秒的時間。app
在接入Walle以前,咱們須要建立好籤名文件,而且在項目的build.gralde中進行配置,相似這種:工具
signingConfigs { myConfig { storeFile file("../Walle.jks") storePassword "abc12345" keyAlias "Walle" keyPassword "abc12345" } } buildTypes { debug { signingConfig signingConfigs.myConfig minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { signingConfig signingConfigs.myConfig minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
具體關於如何建立簽名文件,能夠參考:
Android Studio下應用簽名的方法以及獲取 MD五、SHA1(簽名)、SHA256 值,關於keystone簽名文件更詳細的知識,能夠參考:Android Keystore漫談
美團Walle
具體接入方法能夠參考:https://github.com/Meituan-Di...
這裏其餘咱們都按照默認便可,只須要根據本身的須要來編寫channel
文件便可,注意,這個文件不能有任何後綴。
gradle
集成Walle
後咱們就能夠經過
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
來獲取channel,而後把該channel傳給友盟進行渠道的統計:
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);
而後咱們須要進行多渠道打包的時候,只須要執行./gradlew clean assembleReleaseChannels
便可來生成全部的渠道包
有時候執行該命令,咱們可能會遇到R.java文件丟失的問題,可是經過AS的clean
又能從新生成,這時候咱們能夠把上述命令中的clean去掉,變爲經過命令./gradlew assembleReleaseChannels
生成
全部渠道包。
這樣,咱們就完成了渠道包的生成,若是想驗證是否能在代碼中成功獲取到渠道信息,咱們能夠在友盟的管理後臺查看,也能夠直接經過Log
在代碼中輸出到Logcat
中
相信任何在公司從事過App開發的,都知道應用在上線以前應該進行加固,可是我仍是在應用市場上見過沒加固的,直接使用jadx
反編譯以後,每一行代碼都能清清楚楚的看到,跟他們相關人員聯繫後,給個人答案是:「咱們知道沒有加固,這點咱們很早就清楚。」 「(⊙o⊙)…我.....」,而後還反問我一句:「你知道嗎,你用加固的話,那些加固廠商可能會在你apk里加入些東西」...我都無fuck說了,那你還集成那麼多的第三方服務幹嗎,他們就不會添加?這就是裸奔的理由?好了,吐槽結束。咱們在發佈apk到應用市場的時候,必定要進行apk加固,若是實在是信不過加固廠商,本身又牛逼的很的話,就本身寫吧。
這裏用的比較多的就是360加固了,使用也很簡單,就是講本身打包好的apk上傳上午,加固好以後再下載加固後的包便可。具體能夠查看360加固官網
這看起來一切流程都已經完成了,咱們就一個個把第二步中生成的那些渠道一個個上傳到360進行加固,而後下載下來不就好了。首先,若是渠道太多的話,這個是要死人的。更要命的是,當你一個個加密以後,居然發現這些都不能用,獲取不到渠道信息的時候
其實,這裏就涉及到一個問題,咱們直接經過美團Walle多渠道方案打包生成的apk,在通過360加固以後,是會丟掉渠道信息的,那麼如何解決呢,美團在GitHub上也提出瞭解決方案360加固失效?
做爲懶人,繁瑣的一步步本身去作是不可能,這輩子均可能的。這裏咱們就直接採用Jay-Goo
大佬提供的Python打包腳本ProtectedApkResignerForWalle,這也是美團官方推薦的方案。接下來咱們就講解若是使用該腳本
這裏咱們使用ProtectedApkResignerForWalle解決360加固丟失渠道信息的問題,能夠直接去ProtectedApkResignerForWalle倉庫查看,很簡單。這裏我只是將其餘一些須要注意的事情講下。
assembleRelease
這個task
或者經過工具欄上面的Build下面的Generated Signed Apk
release.encrypted.apk
git clone https://github.com/Jay-Goo/ProtectedApkResignerForWalle.git
命令來將倉庫clone
下來,而後把步驟1中生成的release.encrypted.apk
放入該項目的根目錄,並根據按照config.py文件中的註釋改爲本身項目配置最後,咱們須要經過jadx
反編譯利器來隨意查看某個apk是否加固成功,再安裝試試,看是否能正常獲取渠道信息。沒問題的話,就開心的加班發佈去吧。