1)手動打包html
項目寫完了,如今須要把應用上傳到市場,問題出現—怎麼把代碼變成.apk(Android的可安裝文件)。
1. 建立簽名文件 java
2. 填寫好籤名參數android
3. 生成APK
注意:簽名的密碼和密匙的密碼注意保管,不要忘了,簽名文件別泄漏了,也別搞丟了git
我最開始就有這個疑問,咱們的代碼不是點了下運行按鈕就直接安裝到手機上了嗎,咱們在在項目Project目錄的build/outputs/apk
目錄下能夠找到剛剛新鮮生成的app-debug.apk.直接把這個上傳給市場不就好了嗎。程序員
NO,固然不行,想一想手機安裝App的時候怎麼來區分各個APK的。
經過包名+簽名 來肯定一個應用的惟一性,那個 debug.apk 只是系統用來給咱們調試用的,若是上傳到市場,怎麼來保證他的安全性。github
OK,咱們已經解決了第一步—怎麼打包。上傳上去後,市場反饋發現咱們的App寫得太棒了,這時候老大讓趕快多上些平臺,主流的平臺、非主流的平臺都要放上去。
那麼問題來了,爲了方便統計各個平臺的安裝狀況,配合運營推廣,須要統計各個平臺的安裝狀況。 web
不錯,咱們須要用到分渠道打包,那麼咱們須要解決兩個問題
1. 怎麼區分各個平臺的標識
2. 怎麼每次版本更新都生成幾十個包、幾百個包
第一個簡單,用過友盟打包的同窗確定不陌生這段代碼安全
<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID"></meta-data>
value裏面填的就是各個平臺的值,好比填寫uc、yyb(應用寶)、360、baidu替換掉Channel_ID
,App安裝好,能夠讀取這個值而後傳給後臺,從而實現區分各個平臺的安裝需求。
第二個問題:
在Eclipse時代,最開始我是手動打的,一次打30個包,每次最怕版本更新,基本一下午都在作機械運動,如今想起來手都在抽筋。
後來,學會了Ant自動打包,快卻是快,只是配置太坑爹了,超級麻煩。
如今有了Android Studio,媽媽不再用擔憂我不能愉快的打包了。
隨便新建一個項目,修改Module:app build.gradle
爲app
apply plugin: 'com.android.application' android { signingConfigs { config { keyAlias 'maker' keyPassword '1234make' storeFile file('/Users/Nevermore/AndroidStudioProjects/Blog/jks/makeapp.jks') storePassword 'make1234' } } compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.example.makeapp" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { debug { minifyEnabled false debuggable true } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.config debuggable false } }
//渠道配置
productFlavors {
uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"] } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } yyb { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yyb"] } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' }
咱們須要配置:工具
signingConfigs
這是剛纔咱們新建的密匙信息 buildTypes
打包類型,包括了Debug和Release productFlavors
打包渠道就在這兒配置咯 同時在AndroidManifest裏面加上,渠道標識(注意紅色背影的字符串必定要對得上)
3 如今還有個問題—代碼寫完了怎麼生成渠道包呢
OK,在命令行輸入 gradlew assembleRelease
,表示生成全部Release包,生成的包在build\outputs\apk
目錄下,若是你要生成指定的包(uc|360|baidu),指定的版本(Release|Debug),右邊的Gradle Project
能夠幫到你
4. 刪除多餘的 unaligned.apk
執行完-gradlew assembleRelease
,發現一個問題,生成的不只有咱們須要的包,unaligned.apk
類型的Apk也輸出來了unaligned.apk
是還沒執行對齊命令的包,是中間形態,這個須要刪除,不必不知道爲何Gradle沒有幫咱們刪了這沒啥用的玩意兒,問題是咱們也不想一個一個的手動刪除。好吧,寫了一個腳本命令,在輸出文件夾的命令行執行以下:
find . -name "*-unaligned.apk" | xargs rm -rf
5 優化gradle代碼
剛纔寫的代碼
productFlavors { uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"] } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } yyb { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yyb"] } }
有些冗餘,修改下減小咱們的代碼量
6. Gradle
對新人來講語法有學習曲線,能不能再容易一點
我們有工具啊,打開頂部Build
選擇紅色部分,裏面的編輯框能夠幫助咱們更快的熟悉Gradle
來看看代碼和編輯框的具體關係吧
7. 打包太多,須要清理一下
想一想,若是隻是打渠道包的話,沒有必要對整個項目進行編譯,來生成渠道號。
若是能直接修改apk的渠道號,而不須要再從新簽名能節省很多打包的時間。幸運的是咱們找到了這種方法。直接解壓apk,解壓後的根目錄會有一個META-INF目錄。
若是在META-INF目錄內添加空文件,能夠不用從新簽名應用。所以,經過爲不一樣渠道的應用添加不一樣的空文件,能夠惟一標識一個渠道。
採用這種方式,每打一個渠道包只需複製一個apk,在META-INF中添加一個使用渠道號命名的空文件便可。
這種打包方式速度很是快,900多個渠道不到一分鐘就能打完。
沒錯,這就是美團的打包策略
使用方式:https://github.com/GavinCT/AndroidMultiChannelBuildTool
使用本工具,Android 程序員僅需將 ChannelUtil.java 放入到工程裏使用,之後打包的事情就不用本身動手了。
安裝個 Python 環境,運行一下 MultiChannelBuildTool.py,誰均可以打包了!
畢竟實踐是檢驗真理的惟一標準:
拷貝一個,咱們剛剛生成的app-uc-release.apk
到項目目錄
果真厲害,1S就出來這麼多包。
反編譯看看,包打得對不對
命令行
apktool d xxx.apk
打開目錄,首先確認咱們生成的XML裏面的標識符
而後看到,美團極速打包方案也完成
可是,使用Gradle生成4個渠道,咱們花了 26.5秒
人家 只花了目測 1s