Android Studio打包全攻略---從入門到精通
初出茅廬 手動打包
怎麼手動打包
專案寫完了,現在需要把應用上傳到市場,問題出現—怎麼把程式碼變成.apk(Android的可安裝檔案)。
1. 建立簽名檔案
2. 填寫好籤名引數
3. 生成APK
注意:簽名的密碼和密匙的密碼注意保管,不要忘了,簽名檔案別洩漏了,也別搞丟了
為什麼要打包
我最開始就有這個疑問,我們的程式碼不是點了下執行按鈕就直接安裝到手機上了嗎,我們在在專案Project目錄的build/outputs/apk
目錄下可以找到剛剛新鮮生成的app-debug.apk.直接把這個上傳給市場不就行了嗎。
NO,當然不行,想想手機安裝App的時候怎麼來區分各個APK的。
通過包名+簽名
漸入佳境 渠道打包
OK,我們已經解決了第一步—怎麼打包。上傳上去後,市場反饋發現我們的App寫得太棒了,這時候老大讓趕快多上些平臺,主流的平臺、非主流的平臺都要放上去。
那麼問題來了,為了方便統計各個平臺的安裝情況,配合運營推廣,需要統計各個平臺的安裝情況。
分渠道打包
不錯,我們需要用到分渠道打包,那麼我們需要解決兩個問題
1. 怎麼區分各個平臺的標識
2. 怎麼每次版本更新都生成幾十個包、幾百個包
第一個簡單,用過友盟打包的同學肯定不陌生這段程式碼
<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />
value裡面填的就是各個平臺的值,比如填寫uc、yyb(應用寶)、360、baidu替換掉Channel_ID
,App安裝好,可以讀取這個值然後傳給後臺,從而實現區分各個平臺的安裝需求。
第二個問題:
在Eclipse時代,最開始我是手動打的,一次打30個包,每次最怕版本更新,基本一下午都在做機械運動,現在想起來手都在抽筋。
後來,學會了Ant自動打包,快倒是快,只是配置太坑爹了,超級麻煩。
現在有了Android Studio,媽媽再也不用擔心我不能愉快的打包了。
隨便新建一個專案,修改Module:app build.gradle
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和ReleaseproductFlavors
打包渠道就在這兒配置咯 同時在AndroidManifest裡面加上,渠道標識
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="example.com.makeapk">
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
...省略
</manifest>
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"]
}
}
有些冗餘,修改下減少我們的程式碼量
productFlavors {
uc {}
_360 {}
baidu {}
yyb {}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
是不是美觀多了
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
1分鐘900個包果然不是夢
Build Variants(構建變種版本)
切換URL
開發每次除錯介面,我常常會配置3個URL
public class Constant {
public static final String URL = "主機IP地址:10.18.3.1";
// public static final String URL = "線上環境:http://www....";
// public static final String URL = "測試環境http://....";
}
- 配合我寫介面的伺服器兄弟的電腦主機IP地址
- 測試伺服器環境地址
- 線上環境地址
開發的時候倒是沒啥問題,我手動註釋掉,切換具體要使用那個URL除錯就行了,但是打包給測試的時候就麻煩了,需要三個環境都打好給他們,改一個打包,改一個打包,浪費時間,還經常把程式碼弄混。
這個時候,就到了Build Variants大顯神威的時候啦
變種版本是什麼
開啟方式
不需要,改程式碼,要選擇執行那個環境直接切換,方便快捷
對比兩個版本的不同
最後效果:
構建
最後一個問題,
能不能在同一個手機上同時裝上不同環境的包
測試希望比較下不同環境下,App會有的差異
同時裝上手機,也就是包名不同即可,顯然現在的我們已經不用自己手動去改了,直接配置引數
最後,三個包都裝到手機上了
這個方式同樣適合於Debug版本和Release版本同時安轉到手機上。
比如你去面試,你想同時給面試官展示線上的版本和現在正在開發的版本,或者你想演示舊版本和新版版本的區別,你就可以通過這種方式達成.so easy…