android gradle 的插件終于把混淆代碼的task內建進去了,加上最近,android studio 用的是gradle 來建構項目, 下定決心把android gralde 建構項目的使用者指南全部看完, 讓不會用gradle 的人也用gradle建構android項目,讓打包(注意,打包和建構是兩碼事)多版本android不再痛苦。最後,題外話:珍惜生命,遠離ant....
順便貼上官方為什麼使用gradle 的理由
Domain Specific Language (DSL) to describe and manipulate the build logic
Build files are Groovy based and allow mixing of declarative elements through the DSL and using code to manipulate the DSL elements to provide custom logic.
Built-in dependency management through Maven and/or Ivy.
Very flexible. Allows using best practices but doesn’t force its own way of doing things.
Plugins can expose their own DSL and their own API for build files to use.
Good Tooling API allowing IDE integration
首先我們學習幾個gradle 的腳本文法,掌握了這幾個文法,你就能非常簡單的用gradle建構打包android項目了。 首先,我們來看下一個最簡單android<code>build.gradle</code>
build.gradle
英語的介紹都來自與 gradle官方文檔, 主要後邊的中文不是翻譯,是補充介紹。。
<code>buildscript{}</code>
Configures the build script classpath for this project. 說白了就是設定腳本的運作環境
<code>repositories{}</code>
Returns a handler to create repositories which are used for retrieving dependencies and uploading artifacts produced by the project. 大意就是支援java 依賴庫管理(maven/ivy),用于項目的依賴。這也是gradle 強力的地方。。。
<code>dependencies{}</code>
The dependency handler of this project. The returned dependency handler instance can be used for adding new dependencies. For accessing already declared dependencies, the configurations can be used. 依賴包的定義。支援maven/ivy,遠端,本地庫,也支援單檔案,如果前面定義了<code>repositories{}</code>maven 庫,使用maven的依賴(我沒接觸過ivy。。)的時候隻需要按照用類似于<code>com.android.tools.build:gradle:0.4</code>,gradle 就會自動的往遠端庫下載下傳相應的依賴。
<code>apply plugin:</code>
聲明建構的項目類型,這裡當然是android了。。。
<code>android{}</code>
設定編譯android項目的參數,接下來,我們的建構android項目的所有配置都在這裡完成。
要用gradle建構你的有兩種方式:(build.gradle 放到項目目錄下)
利用adt 22導出 build.gradle.
複制别人寫好的build.gradle 檔案.
根據gradle 規則,手寫android 的build.gradle 檔案。
個人推薦1,2 方法。。。。
一個android build.gradle 最基本基本檔案
接着在指令行cd 到項目目錄下
例如: cd e:\workplace\andoridGradle
如果你是第一次使用gradle 建構android項目建議你先使用<code>gradle clean</code> 把android gradle 插件,還有相關依賴包下載下傳下來并且對環境進行初始化,如果出錯了,一般可能是下載下傳逾時,試多幾次即可,最後你會看到如下提示:<code>BUILD SUCCESSFUL</code>
The TaskContainer.add() method has been deprecated and is scheduled to be remove d in Gradle 2.0. Please use the create() method instead.
:clean UP-TO-DATE
BUILD SUCCESSFUL
Total time: 7.847 secs
完成以上的步驟,就可以正式使用gralde 建構你的android項目了。
然後使用<code>gradle build</code> 就完成了android 項目的建構了。如果,你是照着以上步驟走的話,你将會想項目目錄裡面看到一個build 的目錄,裡面就是用gradle 建構android項目的全部例如了,結構目錄看附錄。
最終打包的apk 就在build/apk 目錄下了。然後,你會發現,兩個apk 一個是 [項目名]-debug-unaligned [項目名]-release-unsigned
如果以上内容你都掌握的話,接下來就将詳細說說如何利用gralde 打包android apk。
上面說了一大堆東西,其實并不吸引人去使用gradle,如果隻是建構項目的話,adt不是更合适嗎?如果,你看完以下内容還是這麼覺得的話,你就沒必要折騰gradle了。。。。。。
<code>gradle clean</code>
<code>gradle build</code>
現在來解釋一下上一節的問題,apk目錄下的兩個apk 的含義
為什麼産生了兩個apk?
預設的android gralde 插件定義了兩種apk 的類型debug, release,這兩種類型的詳細對比看附錄。
這個是android gralde 插件 <code>buildTypes{}</code> 方法産生的,預設配置好了兩個預設模闆,當然你也可以修改,前面我們就是在修改預設的release 的配置,讓輸出release類型的的apk,具有簽名和混淆。
對于多管道包,android 插件提供了一個名為<code>Product Flavor{}</code> 的配置,用于進行多管道打包。
例如,我的android應用有海外版,和國内版本,而且這兩個版本的包名是不一樣的!!(我就舉兩個市場的例子安裝這個思路,你要打包100個不同的市場隻是幾行代碼的事情。)。
你隻需要在<code>android{}</code> 補充上
然後<code>gradle clean</code>,<code>gradle build</code>,在build/apk 下面你會看到一堆的包,命名格式[項目名]-[管道名]-release
僅此而已?
<code>Product Flavor{}</code> 不隻是能改包名那麼簡單,還能夠對編譯的源碼目錄進行切換。
什麼意思? 不知道各位有沒有用過友盟做使用者統計,如果,你用的是分發管道分析,你需要修改AndroidManifest.xml 添加上 <code><meta-data android:value="hiapk" android:name="UMENG_CHANNEL"/></code>
如果,你很多管道,,然後你就會很痛苦,現在用gradle 就非常舒服,你隻需要在<code>android.sourceSets</code>指定我們的管道名就行,android gradle 插件,會自動打包!!!例如
然後運作<code>gradle clean</code>,<code>gradle build</code>,省下的時間去喝杯咖啡,睡個覺什麼的都好。。。 ###外部依賴### android gradle 對于外部jar 包的應用支援maven/ivy 管理的包,也支援指定具體檔案,前面已經在上文說過。上面示範的完整 build.gradle gist 裡面也有寫。你需要加上如下代碼即可:build.gradle
至此,對于用android gradle 建構android應用程式,打包android 程式,所需要的所有知識,在以上已經說明,隻要你是認真看上面文章的,對于,如何打依賴于android library project 的包,可以看附錄提供的那個德國人寫的例子,而對于<code>build.gradle</code> 裡面的代碼你需要把<code>0.2</code>, 改為<code>0.4</code>即可。至于用gradle 運作android test case部分的教程,個人感覺寫了也白寫(我寫過關于andorid 測試相關的文章,也錄制過視訊,是以有這個感覺。),估計不會有人關注,是以,如果你對用gradle 進行android test的話,可以看附錄裡面提供的官方gradle手冊。
對于這部分内容,你讀與不讀,并不影響你使用gradle 打包android 項目。至于讀了的好處就是你能夠更好的使用gradle。。
debug, release,這兩種類型的預設配置如下:
Property name
Default values for debug
Default values for release / other
debuggable
true
false
jniDebugBuild
renderscriptDebugBuild
renderscriptOptimLevel
3
packageNameSuffix
null
versionNameSuffix
signingConfig
android.signingConfigs.debug
zipAlign
defaultConfig {} 配置參數清單
Property Name
Default value in DSL object
Default value
versionCode
-1
value from manifest if present
versionName
minSdkVersion
targetSdkVersion
packageName
testPackageName
app package name + “.test”
testInstrumentationRunner
android.test.InstrumentationTestRunner
runProguard
proguardFile
'proguard-android.txt' or 'proguard-android-optimize.txt'
build 結構目錄
tree
吐槽一下。。。用ant腳本的(也許你沒有接觸過。。)。在以前你用ant 腳本打包apk的時候需要打包不同包名,你需要用ant 讀取<code>AndroidManifest.xml</code> 然後又正則比對替換裡面packagename 參數。。雖然描述得過程很簡單,你真去寫的時候你就蛋疼了(對于一個ant外行人來說,個人感覺ant的學習曲線太陡峭了,如果是兩年前的我,可能還寫得出這樣的ant腳本(當年費了很大的功夫學習了一個多星期),不過,因為很少用到(後來知道maven了。。果斷放棄了ant,為什麼不在android使用maven? 因為,android 的maven 插件式非官方的,而且現在看來maven 的xml實在很複雜,看起來就頭疼))*
本文轉自 liam2199 部落格,原文連結: http://blog.51cto.com/youxilua/1204595 如需轉載請自行聯系原作者