【轉】Android Studio打包全攻略---從入門到精通

來源:互聯網
上載者:User

標籤:dma   參數   target   ice   src   學習   運營   amp   自動   

原文地址:http://blog.csdn.net/zivensonice/article/details/51672846

 

初出茅廬 手動打包怎麼手動打包

項目寫完了,現在需要把應用上傳到市場,問題出現—怎麼把代碼變成.apk(Android的可安裝檔案)。 
1. 建立簽名檔案 

2. 填寫好籤名參數 

3. 產生APK 
注意:簽名的密碼和密匙的密碼注意保管,不要忘了,簽名檔案別泄漏了,也別搞丟了

為什麼要打包

我最開始就有這個疑問,我們的代碼不是點了下運行按鈕就直接安裝到手機上了嗎,我們在在項目Project目錄的build/outputs/apk目錄下可以找到剛剛新鮮產生的app-debug.apk.直接把這個上傳給市場不就行了嗎。 
 
NO,當然不行,想想手機安裝App的時候怎麼來區分各個APK的。 
通過包名+簽名 來確定一個應用的唯一性,那個debug.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‘}

我們需要配置:

  1. signingConfigs這是剛才我們建立的密匙資訊
  2. buildTypes 打包類型,包括了Debug和Release
  3. productFlavors打包渠道就在這兒配置咯 同時在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://....";}

 

  1. 配合我寫介面的伺服器兄弟的電腦主機IP地址
  2. 測試伺服器環境地址
  3. 線上環境地址

開發的時候倒是沒啥問題,我手動注釋掉,切換具體要使用那個URL調試就行了,但是打包給測試的時候就麻煩了,需要三個環境都打好給他們,改一個打包,改一個打包,浪費時間,還經常把代碼弄混。 
這個時候,就到了Build Variants大顯神威的時候啦

變種版本是什麼

開啟檔案 

不需要,改代碼,要選擇運行那個環境直接切換,方便快捷


對比兩個版本的不同 

最後效果: 

構建


最後一個問題,

能不能在同一個手機上同時裝上不同環境的包

測試希望比較下不同環境下,App會有的差異 
同時裝上手機,也就是包名不同即可,顯然現在的我們已經不用自己手動去改了,直接配置參數 
 
最後,三個包都裝到手機上了 

這個方式同樣適合於Debug版本和Release版本同時安轉到手機上。 
比如你去面試,你想同時給面試官展示線上的版本和現在正在開發的版本,或者你想示範舊版本和新版版本的區別,你就可以通過這種方式達成.so easy…

構建定製版App

詳見: http://blog.csdn.net/zivensonice/article/details/51684931

登峰造極 打包安全

待續… 
代碼:https://github.com/zhouruikevin/makeapp

【轉】Android Studio打包全攻略---從入門到精通

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.