1. 程式人生 > >Gradle自動化編譯Android專案總結

Gradle自動化編譯Android專案總結

            相對於ant和maven,java工程用gradle進行自動化編譯真是簡單太多了。最近在用gradle對公司的專案進行自動化打包,發現gradle的教程還是很少,網上的資源有價值的更是很少,基本都是一篇文章轉來轉去。希望自己遇到的問題可以為後來學習的人提供些思路。

            1.gradle打包會對工程res目錄下的資源做校驗,如果有些資源不合法會編譯錯誤。這是我遇到的一個.9圖片的問題,如下:

            這個問題很好解決,重新做圖。其實這也是好事,gradle幫我們做了檢查,可以發現一些潛在危險。

         2.eclipse中更新最新的adt(版本22)可以匯出一個工程的build.gradle檔案,但是大部分情況下不能直接使用。

             匯出的方法是:選擇工程-->export-->android-->Generate Gradle build files.

             主要會出問題的地方是工程依賴者塊,我匯出的原始工程中是這樣的:    

    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
        compile project(':D::開發環境:工作workspace程式碼:androidKu')
    }
            其中中文路徑肯定是不可行的,這個需要更改;另外如果你工程import的jar包不一定實在libs目錄下,比如我的是在lib目錄下(libs/目錄放的是so庫)。

          3.編碼問題。gradle預設編碼會用你電腦編碼,比如你是中文版的windows,那麼採用的編碼是gbk的。這種方式可以設定編碼:

    tasks.withType(Compile) {  
        options.encoding = "UTF-8"  
    }
         4.so庫的編譯,很多專案為了安全都使用了一些so庫。對於so庫的編譯參考了這個部落格:http://blog.csdn.net/ilittleone/article/details/9222425。更具體的結果可以去stackoverflow搜尋。

         5.庫專案的編譯。庫專案的編譯也稍微糾結了一下,不過參考一些資料很快就搞定了。

            我是採用這種方式實現,假如主專案和庫專案都是在D:\workspace目錄下,專案名稱分別是main和lib。那麼需要在D:\workspace目錄下新建build.gradle和settings.gradle。另外主專案和庫專案目錄下也分別需要build.gradle檔案。完整程式碼如下所示。

            (1)D:\workspace目錄下build.gradle檔案

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}
            (2)D:\workspace目錄下settings.gradle檔案
include ':Main'
include ':Lib'
              (3)D:\workspace\Main目錄下build.gradle檔案
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
    tasks.withType(Compile) {  
        options.encoding = "UTF-8"  
    }
}
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'lib', include: '*.jar')
    compile project(':Lib')
}

android {
    compileSdkVersion 10
    buildToolsVersion "17.0.0"
	
	defaultConfig {
        minSdkVersion 8
        targetSdkVersion 17
    }
	signingConfigs {
    	myConfig{
    		storeFile file("xxx.keystore")
    		storePassword "xxx"
    		keyAlias "xxx"
    		keyPassword "xxx"
    	}
    }
	
	buildTypes{
    	release {
    		signingConfig  signingConfigs.myConfig
    	}
    }
	
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
        task copyNativeLibs(type: Copy) {
   		 from fileTree(dir: 'libs', include: '**/*.so' )  into  'build/libs'
	}
	tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
 
	clean.dependsOn 'cleanCopyNativeLibs'
 
	tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    	    pkgTask.jniDir file('build/libs')
	}
}
      需要注意的是:編碼,so庫的引入根據需要選擇;這個是將目標籤名檔案放在主專案目錄下的做法,如果在別的路徑下,請自行設定。

      (4)D:\workspace\Lib目錄下build.gradle檔案

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android-library'

android {
    compileSdkVersion 7
    buildToolsVersion "17.0.0"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

    }
}

                    http://blog.csdn.net/ilittleone/article/details/9222425