Android Studio打包全攻略


轉載:http://www.2cto.com/kf/201606/517300.html

初出茅廬 手動打包

怎么手動打包

項目寫完了,現在需要把應用上傳到市場,問題出現—怎么把代碼變成.apk(Android的可安裝文件)。
1. 創建簽名文件
這里寫圖片描述
2. 填寫好簽名參數
這里寫圖片描述
3. 生成APK
注意:簽名的密碼和密匙的密碼注意保管,不要忘了,簽名文件別泄漏了,也別搞丟了

為什么要打包

我最開始就有這個疑問,我們的代碼不是點了下運行按鈕就直接安裝到手機上了嗎,我們在在項目Project目錄的build/outputs/apk目錄下可以找到剛剛新鮮生成的app-debug.apk.直接把這個上傳給市場不就行了嗎。
這里寫圖片描述
NO,當然不行,想想手機安裝App的時候怎么來區分各個APK的。
通過包名+簽名 來確定一個應用的唯一性,那個debug.apk只是系統用來給我們調試用的,如果上傳到市場,怎么來保證他的安全性。

漸入佳境 渠道打包

OK,我們已經解決了第一步—怎么打包。上傳上去后,市場反饋發現我們的App寫得太棒了,這時候老大讓趕快多上些平台,主流的平台、非主流的平台都要放上去。
那么問題來了,為了方便統計各個平台的安裝情況,配合運營推廣,需要統計各個平台的安裝情況。

分渠道打包

不錯,我們需要用到分渠道打包,那么我們需要解決兩個問題
1. 怎么區分各個平台的標識
2. 怎么每次版本更新都生成幾十個包、幾百個包
第一個簡單,用過友盟打包的同學肯定不陌生這段代碼

?
1
<code class = "hljs haskell" ><meta-data android:name= "UMENG_CHANNEL" android:value= "Channel_ID" ></meta-data></code>

value里面填的就是各個平台的值,比如填寫uc、yyb(應用寶)、360、baidu替換掉Channel_ID,App安裝好,可以讀取這個值然后傳給后台,從而實現區分各個平台的安裝需求。
第二個問題:
在Eclipse時代,最開始我是手動打的,一次打30個包,每次最怕版本更新,基本一下午都在做機械運動,現在想起來手都在抽筋。
后來,學會了Ant自動打包,快倒是快,只是配置太坑爹了,超級麻煩。
現在有了Android Studio,媽媽再也不用擔心我不能愉快的打包了。
隨便新建一個項目,修改Module:app build.gradle

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<code class = "hljs livecodeserver" >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'
}</code>

我們需要配置:

signingConfigs這是剛才我們新建的密匙信息 buildTypes 打包類型,包括了Debug和ReleaseproductFlavors打包渠道就在這兒配置咯 同時在AndroidManifest里面加上,渠道標識

?
1
2
3
4
5
<code class = "hljs r" ><manifest package = "example.com.makeapk" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <meta-data android:name= "UMENG_CHANNEL" android:value= "${UMENG_CHANNEL_VALUE}" >
     ...省略
</meta-data></manifest></code>

現在還有個問題—代碼寫完了怎么生成渠道包呢
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沒有幫我們刪了這沒啥用的玩意兒,問題是我們也不想一個一個的手動刪除。好吧,寫了一個腳本命令,在輸出文件夾的命令行執行如下:

?
1
<code class = "hljs lasso" > find . -name "*-unaligned.apk" | xargs rm -rf</code>

優化gradle代碼
剛才寫的代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code class = "hljs perl" >  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" ]
         }
     }</code>

有些冗余,修改下減少我們的代碼量

?
1
2
3
4
5
6
7
8
9
<code class = "hljs avrasm" >    productFlavors {
         uc {}
         _360 {}
         baidu {}
         yyb {}
     }
     productFlavors.all { flavor ->
         flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
     }</code>

是不是美觀多了
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就出來這么多包。

反編譯看看,包打得對不對
命令行

?
1
<code class = "hljs avrasm" >apktool d xxx.apk</code>

這里寫圖片描述

打開目錄,首先確認我們生成的XML里面的標識符
這里寫圖片描述
然后看到,美團極速打包方案也完成

這里寫圖片描述

但是,使用Gradle生成4個渠道,我們花了 26.5秒 人家 只花了目測 1s

1分鍾900個包果然不是夢

Build Variants(構建變種版本)

待續…

登峰造極 打包安全

待續…


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM