轉 Gradle 詳細步驟
之前寫過轉 gradle 的方法,不過那篇太隨便。再寫一篇詳細一點。
1. 加入 build.gradle
加入空白檔案,將其命名為 build.gradle
2. 加入基本內容
在 build.gradle
加入以下內容
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 18
buildToolsVersion "18.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>;
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>;/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
}
}
3. 3rd party libraries 在 gradle 下的安裝方法
使用 gradle 後,3rd party 的 android libraries 不能使用以往的方法 include 進去 (若普通的 jar 則無問題),而要交由 gradle 管理。
找出 project 需要用到的 library,然後尋找對應的 gradle 安裝方法。例如會用到 Android Design Support Library 的話,可以在 dependencies 中加上相關 library:
dependencies{
compile fileTree(include: '*.jar', dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:support-v4:23.0.1'
}
4. 不支援 gradle 的 android libraries 的處理方法
但有些 libraries 不支援 gradle 要怎麼辦呢?這個要慢慢 google 了。以 ViewPagerIndicator
為例。如果在 maven 又是 AAR 檔案的話,
因為它有放在 maven 上,但又不是以 AAR 格式存放,所以要使用以下方式載入:
dependencies{
compile fileTree(include: '*.jar', dir: 'libs')
repositories {
maven{ url "http://dl.bintray.com/populov/maven"}
mavenCentral()
}
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:support-v4:18.0.+'
compile 'com.viewpagerindicator:library:2.4.1@aar'
}
不支援 gradle 的現在應該很少,而不支援的話應該很久沒有更新,應該要放棄使用。很可惜,現實有時不容許我們選擇。
如遇到此情況,可用以下方法加入:
-
在 project 底建立一個資料夾,如叫
libraries
,這個資料夾跟build.gradle
為同一 level。 -
建立一個
settings.gradle
檔案,放在build.gradle
的同一 level 。 -
將所有不支援 gradle 的 android libraries 放在此資料夾內。
-
在每個 libraries 的資料夾底下建立一個
build.gradle
,並貼上以下內容apply plugin: 'com.android.library' dependencies { } android { compileSdkVersion 22 buildToolsVersion '22.0.1' defaultConfig { minSdkVersion 3 targetSdkVersion 18 } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } // Move the tests to tests/java, tests/res, etc... instrumentTest.setRoot('tests') // Move the build types to build-types/<type> // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // This moves them out of them default location under src/<type>/... which would // conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied // by a similar customization. debug.setRoot('build-types/debug') release.setRoot('build-types/release') } }
如 library 有其他 dependency ,便要加入適當的 dependency 語句。要將 library 當成一個 gradle project。
-
在
settings.gradle
中加入所需 libraries 資料,如你libraries
底下有lib1
和lib2
,那麼便加入:include ':libraries:lib1', ':libraries:lib2'
-
到 build.gradle 加入 compile library project 語句:
dependencies{ compile project(':library:lib1') compile project(':library:lib2') }
-
Sync gradle setting。完成。
5. Sync
用 Android Studio / IntelliJ Idea 開啟 project,會自動執行 gradle build
。
踩雷:Application ID
上面的 build.gradle
是最基本的設定。不過建議大家一定要設定 application ID。
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig{
applicationId "com.example.your_super_app"
}
.......
}
為什麼呢?因為有些某些 library 會使用 application id 來設定它的某些元件運作。如 Google Play Service 會用來做內部 ContentProvider
的 Id。若你有多於一個 app 沒設定 application id ,那麼它們便會相衝,做成問題。如你遇到 INSTALL_FAILED_CONFLICTING_PROVIDER
,而不思不得其解,可能便是漏了設定 application id。