Gradle 是一個基於Ant和Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,這比咱們的ANT使用XML構建配置要靈活的多。在編寫配置時,你能夠像編程同樣靈活,Gradle是基於Groovy的DSL語言,徹底兼容JAVA。javascript
Android Studio是使用Gradle進行自動化構建的IDE,當咱們在Android Studio新建項目的時候,項目的目錄大抵以下:html
├── app #Android App目錄
│ ├── app.iml
│ ├── build #構建輸出目錄
│ ├── build.gradle #構建腳本
│ ├── libs #so相關庫
│ ├── proguard-rules.pro #proguard混淆配置
│ └── src #源代碼,資源等
├── build
│ └── intermediates
├── build.gradle #工程構建文件
├── gradle
│ └── wrapper
├── gradle.properties #gradle的配置
├── gradlew #gradle wrapper linux shell腳本
├── gradlew.bat
├── LibSqlite.iml
├── local.properties #配置Androod SDK位置文件
└── settings.gradle #工程配置複製代碼
其中,settings.gradle用於配置project,標明其下有幾個module,好比這裏包含一個:app module(當咱們使用Android Studio添加一個在當前項目中添加一個module的時候,會自動的在這個文件中將新的module的名字include進來)java
include ':app'複製代碼
和settings.gradle在同一目錄下的build.gradle是一個頂級的build配置文件,在這裏能夠爲全部project以及module配置一些經常使用的配置。linux
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()//使用jcenter庫
}
dependencies {
// 依賴android提供的2.1.2的gradle build
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//爲全部的工程的repositories配置爲jcenters
allprojects {
repositories {
jcenter()
}
}複製代碼
在android.signingConfigs{}下定義一個或者多個簽名信息,而後在buildTypes{}配置使用便可。例如:android
android {
signingConfigs {
release {
//指定簽名用的文件,file對應的根目錄是gradle文件所在的根目錄
storeFile file("release.keystore")
//別名
keyAlias "release"
//key的密碼
keyPassword "123456"
//證書的密碼
storePassword "123456"
}
debug {
...
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.debug
}
}
}複製代碼
咱們能夠爲不一樣的buildTypes選擇是否啓用混淆,通常release發佈版本是須要啓用混淆的,這樣別人反編譯以後就很難分析你的代碼,而咱們本身開發調試的時候是不須要混淆的,因此debug不啓用混淆。對release啓用混淆的配置以下:git
android{
buildTypes {
release {
//是否啓用混淆
minifyEnabled true
//是否去除無效的資源文件,這個設置依賴於minifyEnabled的設置,所以要二者同時設置爲true纔會生效
shrinkResources true
//getDefaultProguardFile('proguard-android.txt')表示獲取SDK下'proguard-android.txt‘文件中的默認混淆規則
//'proguard-rules.pro'表示使用項目根目錄下的 'proguard-rules.pro'文件中的混淆規則
//proguard-rules.pro文件名能夠任意,只要在配置文件中指明便可
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}複製代碼
此處查看更多關於proguard的信息github
zipalign是一款重要的優化apk應用程序的工具。
apk包的本質是一個zip壓縮文檔,優化的目的是使包內未壓縮的數據可以有序的排列,從而減小應用程序運行時的內存消耗.shell
android{
buildTypes {
release {
zipAlignEnabled true
}
}
}複製代碼
經過設置productFlavors的值,咱們能夠指定不一樣的渠道包,而且每一個渠道包能夠自定義其applicationId、versionCode以及versionName等信息數據庫
android {
productFlavors {
dev{
applicationId "com.gdut.demo.dev"
}
qa{
applicationId "com.gdut.demo.qa"
}
pro{
applicationId "com.gdut.demo.pro"
}
}
}複製代碼
manifestPlaceholders,它容許咱們動態替換咱們在AndroidManifest文件裏定義的佔位符。例如:編程
<meta-data
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
<meta-data android:name="UMENG_SECRET" android:value="${umeng_app_secret}"/> 而後咱們能夠針對不一樣的flavors或者buildTypes動態的指定相應的值,例如: buildTypes { debug { manifestPlaceholders = [umeng_app_key: "替代的內容",umeng_app_secret:"替換的內容"] } ... }複製代碼
BuildConfig.java是Android Gradle自動生成的一個java類文件,沒法手動編譯,可是能夠經過Gradle控制,也就是說他是動態可配置的。在 gradle 文件 buildTypes 或者 productFlavors 下面,如:
buildTypes {
release{
//release的包中BuildConfig.ENDPOINT 就會被賦值爲 http://example.com 就能夠供 Java 代碼調用了。
buildConfigField "String", "ENDPOINT", "\"http://example.com\""
}
}複製代碼
修改 res value 的方式,好比修改 strings.xml 文件中的 AppName 的值。在gradle文件 buildTypes 或者 productFlavors 下面,如:
buildTypes{
release{
//將release的包中名爲 AppName 的 string value 值改成 app1
resValue "string", "AppName", "app1"
}
}複製代碼
咱們除了能夠經過設置buildtypes來進行分類打包以外,還能夠根據屏幕大小、cpu架構適配類型來進行分類打包,經過使用splits咱們能夠達成這個目的,例如
splits {
density {
enable true
reset()
include "mdpi", "hdpi"
}
abi {
enable true
reset()
include "x86", "mips"
}
}複製代碼
更多的使用狀況以及使用說明請參考android的官方文檔:Configure APK Splits
Android設定的方法數是65536個(DEX 64K problem),超過這個方法數,致使dex沒法生成,就沒法生成APK.處理這個問題,除了儘量的進行apk瘦身,減小整個apk的方法數以外,能夠進行兩種設置進行解決。
1. 使用multiDex。開啓分包模式
defaultConfig {
multiDexEnabled=true
}
2. 忽略方法數的檢查。2.3版本及如下的手機沒法正常安裝
android {
dexOptions {
jumboMode = true
}複製代碼
dependencies {
compile fileTree(include: '*.jar', dir: 'libs')
compile project(':pullrefresh')
prodCompile files('src/prod/libs/bankcard-encrypt.jar')
debugCompile files('src/qa/libs/bugrpt.jar')
}複製代碼
compile配置將被用於編譯main application。它裏面的全部東西都被會被添加到編譯的classpath中,同時也會被打包進最終的APK。 如下是添加依賴時可能用到的其它一些配置選項:
compile main application(主module)。
androidTestCompile test application(測試module)
debugCompile debug Build Type(debug類型的編譯)
prodCompile prod productFlavors(prod渠道的編譯)複製代碼
由於沒有可能去構建一個沒有關聯任何BuildType(構建類型)的APK,APK默認配置了兩個或兩個以上的編譯配置:compile和< buildTypes >Compile. 建立一個新的buildTypes或者productFlavors將會自動建立一個基於它名字的新配置
FindBugs是一個Java靜態分析工具,用來檢查類或者jar文件,用來發現可能的問題。檢測完成以後會生成一份詳細的報告,藉助這份報告能夠找到潛在的bug,好比NullPointException,特定的資源沒有關閉,查詢數據庫沒有調用Cursor.close()等;
Java的靜態分析工具固然能夠無難度的在Android上面運行,經過這種FindBugs的檢查可讓App的運行更加的穩定。
FindBugs Gradle插件使用實例以下:
apply plugin: "findbugs"
//定義一個task任務,這個任務的類型是FindBugs
task findbugs(type: FindBugs) {
//有警告錯誤的時候也是容許構建
ignoreFailures= true
effort= "default"
//報告的級別,Low,Medium,High
reportLevel= "high"
println( "$project.buildDir")
//classes和source分別是對應的.classe文件夾地址,和源代碼文件地址。
classes = files("$project.buildDir/intermediates/classes")
source= fileTree("src/main/java/")
classpath= files()
//指定報告類型,有兩種方式xml和html,只容許一種輸出格式
reports{
xml.enabled=false
html.enabled=true
xml {
destination "$project.buildDir/findbugs.xml"
}
html{
destination "$project.buildDir/findbugs.html"
}
}
}複製代碼