轉 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 的現在應該很少,而不支援的話應該很久沒有更新,應該要放棄使用。很可惜,現實有時不容許我們選擇。

如遇到此情況,可用以下方法加入:

  1. 在 project 底建立一個資料夾,如叫 libraries,這個資料夾跟 build.gradle 為同一 level。

  2. 建立一個 settings.gradle 檔案,放在 build.gradle 的同一 level 。

  3. 將所有不支援 gradle 的 android libraries 放在此資料夾內。

  4. 在每個 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/&lt;type&gt;
             // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
             // This moves them out of them default location under src/&lt;type&gt;/... 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。

  5. settings.gradle 中加入所需 libraries 資料,如你 libraries 底下有 lib1lib2,那麼便加入:

     include ':libraries:lib1', ':libraries:lib2'
    
  6. 到 build.gradle 加入 compile library project 語句:

     dependencies{
         compile project(':library:lib1')
         compile project(':library:lib2')
     }
    
  7. 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。

相關連結

  1. 將 Android Project 轉為 Gradle based
  2. Using ViewPagerIndicator library with Android Studio and Gradle
  3. 【踩雷】INSTALL_FAILED_CONFLICTING_PROVIDER / ContentProvider