心静志远 | 技术会被淘汰,但思想会一直永存(多思考,多总结,多分享)
Gradle的简介,这里就不罗嗦了,Google上一大堆,这里就说说它的基本使用吧(可以简单的理解为它是Maven的高级版本,没那么神秘)。
基本使用流程:
1. 下载 Gradle 到本地,并配置环境变量。
2. 在项目中创建 build.gradle文件
3. 编写 build.grade 脚本
4. 执行grade 命令快捷使用方法:
下载Android Studio,让它帮我们搞定一切。
指定依赖:
1. 依赖仓库中的jar
1
compile
'group:name:version'
2. 依赖本地jar文件夹
1
compile fileTree(
dir
,
'libs'
,include :
'*.jar'
)
3. 依赖本地单个jar文件
1
compile
file
(
'libs/xxx'
)
3. 依赖工程
1
compile 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 库:
方法一:添加自定义任务:
01
task nativeLibsToJar(type: Zip, description:
'create a jar archive of the native libs'
) {
02
destinationDir file(
"$buildDir/native-libs"
)
03
baseName
'native-libs'
04
extension
'jar'
05
from fileTree(dir:
'libs'
, include:
'**/*.so'
)
06
into
'lib/'
07
}
08
09
tasks.withType(Compile) {
10
compileTask -> 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包:
1
dependencies {
2
compile fileTree(dir:
'libs'
, include: [
'*.jar'
])
3
compile 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 ->
def
name = variant.buildType.name
def
task = 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文件。