gradle構建android
① gradle是什麼呢
Gradle是一個構建工具。它是用來幫助我們構建app的,構建包括編譯、打包等過程。我們可以為Gradle指定構建規則,然後它就會根據我們的命令自動為我們構建app。AndroidStudio中默認就使用Gradle來完成應用的構建。有些同學可能會有疑問:」我用AS不記得給Gradle指定過什麼構建規則呀,最後不還是能搞出來個apk。
gradle構建工具多項目管理
實際使用中,往往需要管理的都不是單單一個項目,maven使用依賴,繼承,組成的概念,在父模塊指定自己的子模塊,並且准備一些各個子模塊公用的資源,配置信息等等。將打包的模塊與實現具體功能的模塊分開的做法來管理多個項目。Gradle在這一方面做得更加清楚。
② 如何使用Gradle構建不同版本的app
對於多種類型的apk包構建,通常有以下需求:
各版本有不同的代碼、資源
上述代碼中各版本有不同的依賴
各版本有不同的Manifest中元素需求
各版本有不同的proGuard
Android
Studio中使用Gradle編譯多種apk包需要靠proctFlavors或者buildTypes實現,如果有兩種proct
flavor和兩種build
type,則他們可以生成2*2=4種不同類型的apk包。下文主要使用proctFlavors自定義apk內容,而buildTypes使用默認
配置用於處理debug版本和release版本。
以下依次來看這4點怎樣實現
一、不同的代碼和資源
要實現build時使用不同的代碼和資源:
在build文件中定義proctFlavors
為每個Flavor創建對應的文件夾
將每個Flavor特有的文件放入文件夾
1.在build文件中定義proctFlavors...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
proctFlavors {
demo {
applicationId "com.buildsystemexample.app.demo"
versionName "1.0-demo"
}
full {
applicationId "com.buildsystemexample.app.full"
versionName "1.0-full"
}
}
}
...
其中defaultConfig{}中為默認值,proctFlavors{}會復寫所有可以復寫的值。
2.為每個Flavor創建對應的文件夾
在上面兩個Flavor的基礎上,假設你想在每個Flavor使用不同的SecondActivity文件,按照下面的步驟:
展開app目錄
右擊src目錄,選擇New>Directory
輸入Flavor的名字,也就是demo,新建
在demo中創建以下文件夾 app/src/demo/java app/src/demo/res app/src/demo/res/layout app/src/demo/res/values 如下圖:
PS:上述過程就是將默認的main下的目錄結構復制過來,想添加其他資源也是同樣的操作
3. 將每個Flavor特有的文件放入文件夾
向上一步新建的目錄中,先在java目錄下建立對應的package,向其中放入SecondActivity.java和其layout文件,並在res目錄下添加本Flavor的AndroidManifest.xml文件。Manifest的merge規則見下文。
另外一種方法是右擊app目錄,選擇添加Activity,在引導界面中最後一項Target Source Set選擇你想添加到的Flavor,Android Studio就會自動為你生成對應的AndroidManifest,不過需要稍加修改。
在添加demo所需文件後,為了添加full所需文件和包,需要在Android Studio中將build variants切換為fullDebug,否則Android Studio不會將full下的java目錄識別為源文件目錄,導致不能添加package。
對於demo和full中對應的相同的文件,注意要保證包名的相同,否則main中代碼對於不同部分的引用,會因為有不同包名而失敗。
二、不同的依賴
在build.gradle中,使用Flavor名+Compile來規定特定Flavor所需依賴:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
demoCompile 'com.android.support:design:22.2.0'
fullCompile 'com.jakewharton:butterknife:6.1.0'
}
三、不同的Manifest需求
Manifest可以通過Merge的方式合並多個Manifest源。通常來說,有三種類型manifest文件需要被merge到最終的結果apk,下面是按照優先權排序:
proctFlavors和buildTypes中所指定的manifest文件
應用主manifest文件
庫manifest文件
簡單來說,manifest的merge會將每個元素及其子元素的節點和屬性進行合並。
例如:
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme1」/>
和
<activity
android:name=」com.foo.bar.ActivityOne」
android:screenOrientation=」landscape/>
合並會成為
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme1」
android:screenOrientation=」landscape/>
不過
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme1」/>
和
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme2」
android:screenOrientation=」landscape/>
合並會產生一個沖突,因為都有theme,而theme的屬性不同。
要了解manifest合並的更高級應用,查看Manifest Merger
四、不同ProGuard需求android {
buildTypes {
release {
minifyEnabled true
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
proctFlavors {
flavor1 {
}
flavor2 {
proguardFile 'some-other-rules.txt'
}
}
}
Android Studio將使用所有的定義在相應buildTypes和相應proctFlavors中的規則文件。
有兩個默認的規則文件:
proguard-android.txt
proguard-android-optimize.txt 存放在SDK中。可以使用getDefaultProguardFile()來獲得文件的完整路徑,他們除了優化的開啟是否不同之外都相同。
③ 如何使用Gradle構建不同版本的app
對於多種類型的apk包構建,通常有以下需求:
各版本有不同的代碼、資源
上述代碼中各版本有不同的依賴
各版本有不同的Manifest中元素需求
各版本有不同的proGuard
Android
Studio中使用Gradle編譯多種apk包需要靠proctFlavors或者buildTypes實現,如果有兩種proct
flavor和兩種build
type,則他們可以生成2*2=4種不同類型的apk包。下文主要使用proctFlavors自定義apk內容,而buildTypes使用默認
配置用於處理debug版本和release版本。
以下依次來看這4點怎樣實現
一、不同的代碼和資源
要實現build時使用不同的代碼和資源:
在build文件中定義proctFlavors
為每個Flavor創建對應的文件夾
將每個Flavor特有的文件放入文件夾
1.在build文件中定義proctFlavors...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
proctFlavors {
demo {
applicationId "com.buildsystemexample.app.demo"
versionName "1.0-demo"
}
full {
applicationId "com.buildsystemexample.app.full"
versionName "1.0-full"
}
}
}
...
其中defaultConfig{}中為默認值,proctFlavors{}會復寫所有可以復寫的值。
2.為每個Flavor創建對應的文件夾
在上面兩個Flavor的基礎上,假設你想在每個Flavor使用不同的SecondActivity文件,按照下面的步驟:
展開app目錄
右擊src目錄,選擇New>Directory
輸入Flavor的名字,也就是demo,新建
在demo中創建以下文件夾 app/src/demo/java app/src/demo/res app/src/demo/res/layout app/src/demo/res/values 如下圖:
PS:上述過程就是將默認的main下的目錄結構復制過來,想添加其他資源也是同樣的操作
3. 將每個Flavor特有的文件放入文件夾
向上一步新建的目錄中,先在java目錄下建立對應的package,向其中放入SecondActivity.java和其layout文件,並在res目錄下添加本Flavor的AndroidManifest.xml文件。Manifest的merge規則見下文。
另外一種方法是右擊app目錄,選擇添加Activity,在引導界面中最後一項Target Source Set選擇你想添加到的Flavor,Android Studio就會自動為你生成對應的AndroidManifest,不過需要稍加修改。
在添加demo所需文件後,為了添加full所需文件和包,需要在Android Studio中將build variants切換為fullDebug,否則Android Studio不會將full下的java目錄識別為源文件目錄,導致不能添加package。
對於demo和full中對應的相同的文件,注意要保證包名的相同,否則main中代碼對於不同部分的引用,會因為有不同包名而失敗。
二、不同的依賴
在build.gradle中,使用Flavor名+Compile來規定特定Flavor所需依賴:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
demoCompile 'com.android.support:design:22.2.0'
fullCompile 'com.jakewharton:butterknife:6.1.0'
}
三、不同的Manifest需求
Manifest可以通過Merge的方式合並多個Manifest源。通常來說,有三種類型manifest文件需要被merge到最終的結果apk,下面是按照優先權排序:
proctFlavors和buildTypes中所指定的manifest文件
應用主manifest文件
庫manifest文件
簡單來說,manifest的merge會將每個元素及其子元素的節點和屬性進行合並。
例如:
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme1」/>
和
<activity
android:name=」com.foo.bar.ActivityOne」
android:screenOrientation=」landscape/>
合並會成為
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme1」
android:screenOrientation=」landscape/>
不過
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme1」/>
和
<activity
android:name=」com.foo.bar.ActivityOne」
android:theme=」@theme2」
android:screenOrientation=」landscape/>
合並會產生一個沖突,因為都有theme,而theme的屬性不同。
要了解manifest合並的更高級應用,查看Manifest Merger
四、不同ProGuard需求android {
buildTypes {
release {
minifyEnabled true
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
proctFlavors {
flavor1 {
}
flavor2 {
proguardFile 'some-other-rules.txt'
}
}
}
Android Studio將使用所有的定義在相應buildTypes和相應proctFlavors中的規則文件。
有兩個默認的規則文件:
proguard-android.txt
proguard-android-optimize.txt 存放在SDK中。可以使用getDefaultProguardFile()來獲得文件的完整路徑,他們除了優化的開啟是否不同之外都相同。
④ 如何為Android NDK的gradle構建文件中指定NDK
我一直在嘗試過解決這個問題。但在通過編寫自定義任務,使Android工作室在Eclipse中使用Application.mk和Android.mk就像結束了。
我的build.gradle看起來像這樣
應用插件:'com.android.application「安卓{ buildTypes {
發布 {
runProguard假
proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro「
}
} compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
} compileSdkVersion 20
buildToolsVersion「20.0.0」 defaultConfig {
15的minSdkVersion
targetSdkVersion 20
版本code 1
} packagingOptions {
排除「META-INF /相關內容」
排除「META-INF / LICENSE」
排除「META-INF /注意事項」
} sourceSets.main {
jniLibs.srcDir'的src / main /庫「
jni.srcDirs = [] //禁用自動NDK的構建通話
}
}任務buildNative(類型:執行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(「鋼骨混凝土/主/ JNI」);
高清hasNdk = FALSE;
如果(System.getenv(「NDK_BUILD_CMD」)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(「NDK_BUILD_CMD」))
} 命令行ndkBuild,「--directory」,ndkBuildingDir doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(「NDK構建失敗!」)
logger.error('原因:NDK_BUILD_CMD未設置。')
logger.error('##################')
}
斷言hasNdk:「NDK_BUILD_CMD未設置。」
}
}
tasks.withType(JavaCompile){compileTask - &GT; compileTask.dependsOn buildNative}任務cleanNative(類型:執行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(「鋼骨混凝土/主/ JNI」);
高清hasNdk = FALSE; 如果(System.getenv(「NDK_BUILD_CMD」)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(「NDK_BUILD_CMD」))
} 命令行ndkBuild,「--directory」,ndkBuildingDir,「干凈」 doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(「NDK構建失敗!」)
logger.error('原因:NDK_BUILD_CMD未設置。')
logger.error('##################')
}
斷言hasNdk:「NDK_BUILD_CMD未設置。」
}
}
clean.dependsOn「cleanNative」
對於這個工作,你需要設置一個環境變數NDK_BUILD_CMD要設置的確切NDK建造可執行文件。
在Windows上,你可以設置環境變數NDK_BUILD_CMD點到你的NDK-build.exe
在Mac上,你在你的.bash_profile設置路徑變數不在GUI應用程序訪問(因此Android的Studio將無法讀取它們)。
所以,編輯你的.bash_profile是像
GRADLE_HOME = {} path_to_gradle
ANDROID_SDK_ROOT = {} path_to_sdk_dir
ANDROID_HOME = $ ANDROID_SDK_ROOT /平台的工具
ANDROID_NDK_HOME = {} path_to_ndk
NDK_BUILD_CMD = $ ANDROID_NDK_HOME / NDK的構建出口PATH=$GRADLE_HOME/bin:$ANDROID_HOME:$ANDROID_SDK_ROOT/tools:$ANDROID_NDK_HOME:/opt/local/bin:/opt/local/sbin:$PATHlaunchctl SETENV GRADLE_HOME $ GRADLE_HOME
launchctl SETENV ANDROID_HOME $ ANDROID_HOME
launchctl SETENV ANDROID_NDK_HOME $ ANDROID_NDK_HOME
launchctl SETENV NDK_BUILD_CMD $ NDK_BUILD_CMD
該launchctl線將使您的環境變數的Android Studio中可見。
PS:本.bash_profile中運行每次打開終端的時間。因此,對於這個正確與Android工作室工作,你需要啟動一次終端,然後運行Android的工作室。否則,構建就會失敗說NDK_BUILD_CMD未設置。我還沒有發現任何方式的Mac啟動時設置的值。如果有人能找到一個辦法,請隨時提出。
⑤ 如何為Android NDK的gradle構建文件中指定NDK
一個新的項目中就包含這些文件,build 是兩個,一個項目一個是 APP Model 的。另外在 APP 中可以看見有一個 manifest 文件夾,這意味著著可以有多 AndroidManifest 文件。
另外值得一說的是 gradle.properties 文件也是含有兩個,但是卻是一個是全局,一個是項目的;這與上面的 Build 文件有何區別?區別在於全局文件存在於 C:Users用戶名.gradle文件夾中,該文件有可能沒有,需要自己創建,創建後所有項目都將具有訪問許可權,在該文件中一般保存的是項目的一些變數等,如果是無關緊要的變數可以保存在項目文件中,如果是用戶名密碼等變數則需要保存在全局文件中。
至於項目的配置文件一般是空的。
local.properties
?
1
2
3
4
5
6
7
8
9
10
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=D:ToolKitsAndroidsdk
其中包含了你的 sdk 配置,當然你還可以配置 ndk 路徑;格式與 sdk 一樣。
settings.gradle
?
1
include ':app'
該文件中就僅僅只包含了一句話,在你的項目中如果有多個 Model 存在的時候,就可以選擇包含哪些進行編譯。
⑥ 如何建立與 Android studio和 gradle android 庫
Project Root
+-- src
| +-- main (your project)
| | +-- java (where your java code goes)
| | +-- res (where your res go)
| | +-- assets (where your assets go)
| | \-- AndroidManifest.xml
| \-- instrumentTest (test project)
| \-- java (where your java code goes)
+-- build.gradle
\-- settings.gradle
如果你僅有的一個項目,不是需要的 settings.gradle 文件。但是你想要添加更多的項目,所以需要它。
現在讓看一看那個 build.gradle 文件。你會需要這個在它 (要添加的 android 工具)
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.3'
}
}
現在需要告訴 Gradle 一些 android 系統部件。它是相當簡單的。一個基本的那個 (在大多數情況下的工作方式) 如下所示。我在此塊中有一個注釋,它將允許指定的版本名稱和代碼生成 APK 時。
build.gradle
apply plugin: "android"
android {
compileSdkVersion 17
/*
defaultConfig {
versionCode = 1
versionName = "0.0.0"
}
*/
}
東西要想要添加,然而,就沒見過的 Gradle 光的人幫助他們使用該項目,而不安裝它的方式。
build.gradle
task wrapper(type: org.gradle.api.tasks.wrapper.Wrapper) {
gradleVersion = '1.4'
}
所以現在有一個要生成的項目。現在要添加其他人。把它們放在一個目錄中,或許稱之為指標或子項目。這是無關緊要的但你需要知道你把它放哪。要告訴 Gradle 項目在哪裡你都需要將它們添加到 settings.gradle。
目錄結構:
Project Root
+-- src (see above)
+-- subProjects (where projects are held)
| +-- reallyCoolProject1 (your first included project)
| \-- See project structure for a normal app
| \-- reallyCoolProject2 (your second included project)
| \-- See project structure for a normal app
+-- build.gradle
\-- settings.gradle
settings.gradle:
include ':subProjects:reallyCoolProject1'
include ':subProjects:reallyCoolProject2'
您應該確保的最後一件事是subProjects/reallyCoolProject1/build.gradle apply plugin: "android-library" 而不是 apply plugin: "android" 。
像每個 Gradle 項目 (和 Maven) 現在需要告訴關於它的依賴性的根項目。這還可以包含任何你想要的正常 Java 依賴。
build.gradle
dependencies{
compile 'com.fasterxml.jackson.core:jackson-core:2.1.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.1.4'
compile project(":subProjects:reallyCoolProject1")
compile project(':subProjects:reallyCoolProject2')
}
這看起來像很多步驟,但他們是很容易的一旦你這樣做一次或兩次。這種方式也將允許您可以假設你有沒有安裝了 Android SDK 的 CI 伺服器上生成。
NDK 側註: 如果您要使用 NDK 你需要的東西喜歡下面。可以在這里找到 build.gradle 文件的示例:https://gist.github.com/khernyo/4226923
build.gradle
task NativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: '**/*.so' ) into 'build/native-libs'
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn NativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniDir new File('build/native-libs')
}
⑦ 如何為Android NDK的gradle構建文件中指定NDK
applyplugin:'com.android.model.application'model{android{compileSdkVersion=22buildToolsVersion="23.0.1"defaultConfig.with{applicationId="com.kltz88.car.jnidemo"minSdkVersion.apiLevel=14targetSdkVersion.apiLevel=22versionCode=1versionName="1.0"}tasks.withType(JavaCompile){//指定編譯JDK版本sourceCompatibility=JavaVersion.VERSION_1_7targetCompatibility=JavaVersion.VERSION_1_7}}android.ndk{moleName="test"ldLibs+="log"abiFilters+="armeabi"abiFilters+="armeabi-v7a"abiFilters+="x86"}android.buildTypes{release{minifyEnabled=falseproguardFiles+=file('proguard-rules.pro')}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])compile'com.android.support:appcompat-v7:22.2.1'}
⑧ 如何配置android eclipse gradle環境
方法/步驟
1
首先當然是到官網gradle.org下載最新的gradle版本了,這里我下的是1.1版本,最新是2.0,不過沒影響我們使用
2
下載完成後,放到任意的位置,我的是在D:/gradle-1.1,然後需要放到換進配置,步驟是右鍵「計算機」-「屬性」,進入「高級配置」,選擇「環境變數」,點擊」新建「,配置」GRADLE_HOME「
3
繼續在此處選擇「path」,進行修改,加入「;%GRADLE_HOME%\bin」,注意此處沒有引號,記得前面要加分號,這樣就配置好gradle的環境變數了
4
在命令窗口輸入」gradle -version「,進行驗證,出現以下提示則表示成功
5
接下來是構建一個java項目,可以隨便建一個文件夾,如:D:\javapro1,按照gradle的規約新建相應的文件目錄,類似於maven的一樣,如下
6
最主要的是在該目錄下新建一個gradle文件,build.gradle,文件內容只要一句話即可:
apply plugin:'java'
7
在命令窗口中,進入項目對應文件夾,輸入gradle build,即可完成構建,然後可以在項目文件夾中發現多了一些構建完的文件,這時就完成了一個最簡單的項目構建
8
後面的一些基本命令就是clean、check、assemble等待,具體也可以直接查看官網文檔
http://jingyan..com/article/9225544684a97c851648f486.html
⑨ 如何為Android NDK的gradle構建文件中指定NDK
apply plugin: 'com.android.model.application'
model{
android {
compileSdkVersion = 22
buildToolsVersion = "23.0.1"
defaultConfig.with {
applicationId = "com.kltz88.car.jnidemo"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 22
versionCode = 1
versionName = "1.0"
}
tasks.withType(JavaCompile) {
//指定編譯JDK版本
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
}
android.ndk {
moleName = "test"
ldLibs +="log"
abiFilters +="armeabi"
abiFilters +="armeabi-v7a"
abiFilters +="x86"
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file( 'proguard-rules.pro')
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
}