心靜志遠 | 技術會被淘汰,但思想會一直永存(多思考,多總結,多分享)
Gradle的簡介,這里就不羅嗦了,Google上一大堆,這里就說說它的基本使用吧(可以簡單的理解為它是Maven的高級版本,沒那么神秘)。
基本使用流程:
1. 下載 Gradle 到本地,並配置環境變量。
2. 在項目中創建 build.gradle文件
3. 編寫 build.grade 腳本
4. 執行grade 命令快捷使用方法:
下載Android Studio,讓它幫我們搞定一切。
指定依賴:
1. 依賴倉庫中的jar
1compile'group:name:version'2. 依賴本地jar文件夾
1compile fileTree(dir,'libs',include :'*.jar')3. 依賴本地單個jar文件
1compilefile('libs/xxx')3. 依賴工程
1compile project(:xx:xx)4. Android library依賴
需要把庫的build.gradle文件中apply plugin: ‘android’ 改為 apply plugin: ‘android-library’ ,否則會報以下錯誤:Gradle Error – Duplicate Files copied in APK AndroidManifest.xml
倉庫配置:
1. 從中央倉庫下載:mavenCentral()
2. 使用本地Maven倉庫:maven { url “file://F:/githubrepo/releases” }
3. 指定遠程倉庫:maven{url “https://xxx”}多項目管理
1. 加入我們的項目結構如下:
MyProject/
+ app/
+ libraries/
+ lib1/
+ lib2/2. 外層根配置setting.gradle ,引入各個項目
include ‘:app’, ’:libraries:lib1′, ’:libraries:lib2′
3. 每個項目會包含一個build.gradle文件聲明該項目的編譯過程
MyProject/
| settings.gradle
+ app/
| build.gradle
+ libraries/
+ lib1/
| build.gradle
+ lib2/
| build.gradle4. 隨后我們需要在:app這個項目中指名所依賴的項目
dependencies {
compile project(‘:libraries:lib1′)
compile project(‘:libraries:lib2′)
}Android 項目的Gradle編譯:
我們通常會在build.gradle中配置 依賴的gradle的版本、android編譯版本、android構建工具版本,這三者配置的跟本地存在的有不一致就會導致gradle build失敗。
1. gradle版本依賴配置如下:classpath ‘com.android.tools.build:gradle:0.12.+’
我們需要查看我們本地安裝的gradle的版本是否大於等於此版本號。(Android Studio推薦使用0.12+,所以推薦使用Android Studio,它會幫助我們下載響應版本的Android Studio)
2. android編譯版本compileSdkVersion 19
確保本地SDK中已近下載了相應版本的SDK API
3. android構建工具版本buildToolsVersion “19.1.0″
對於android編譯版本,同樣推薦使用Android Studio,我們通過Gradle編譯,如果版本不匹配,它會提示無此版本工具,並提示下載,當然你也可以到SDK中手工下載(不推薦)。
Android studio 中 使用 gradle 加載本地 .so 庫:
方法一:添加自定義任務:
01task nativeLibsToJar(type: Zip, description:'create a jar archive of the native libs') {
02destinationDir file("$buildDir/native-libs")
03baseName'native-libs'
04extension'jar'
05from fileTree(dir:'libs', include:'**/*.so')
06into'lib/'
07}
08
09tasks.withType(Compile) {
10compileTask -> compileTask.dependsOn(nativeLibsToJar)
11}上面的意思是,在編譯的過程中加入nativeLibsToJar任務,這個任務先在構建目錄中新建了一個native-libs的文件夾,然后進行重命名為native-libs.jar,將so文件都加入到jar文件中。
方法二:手動生成.Jar文件后自動解包到apk文件
這個方式需要自己手動進行.SO文件壓縮,具體步驟為:將所有需要使用的.so文件壓縮為.zip文件(zip中的文件目錄結構為: lib/armeabi/*.so)然后把zip文件后綴改為.Jar然后放到libs生成apk就ok
方法三:Gradle官方在新版已經自動實現了打包.SO文件
在sourceSets -> main 中加入一下代碼:
jniLibs.srcDirs = ['libs']這樣就不需要手動拷貝了。我的項目是多工程依賴,android-library工程中含有so文件,采用方法一,打出的App包中無法加載so文件,哭呀,由於項目才用了黑匣子,這個問題排查了好幾天,shite,所以推薦Android項目加載so文件都使用jni的方式。
參考:http://blog.csdn.net/qiujuer/article/details/24209457
在dependencies 中加入編譯后的jar包:
1dependencies {
2compile fileTree(dir:'libs', include: ['*.jar'])
3compile fileTree(dir:"$buildDir/native-libs", include:'native-libs.jar')
4}參考:http://stackoverflow.com/questions/16683775/include-so-library-in-apk-in-android-studio
使用Gradle 對android lib進行打包,打出可依賴的jar:
android.libraryVariants.all { variant ->
defname = variant.buildType.name
deftask = project.tasks.create"jar${name.capitalize()}", Jar
task.dependsOn variant.javaCompile
task.from variant.javaCompile.destinationDir
task.from configurations.compile.findAll{
it.getName() !='android.jar'&& !it.getName().startsWith('junit') && !it.getName().startsWith('hamcrest')
}.collect{
it.isDirectory() ? it : zipTree(it)
}
artifacts.add('archives', task);
}備注:
生成的lib文件夾有時候可能在Android Studio中看不到,所以建議采用打問文件目錄的方式產看生成的jar文件。
