首页 > 代码库 > Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)
Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)
大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢
转载请标明出处(http://blog.csdn.net/kifile),再次感谢
Android Gradle编译学习日记(基于 Android Studio 1.0):
Android Gradle编译学习日记之一(搭建 Gradle 环境以及编译 Android 应用)
在上一篇文章中,我简单介绍了一个 Gradle 环境变量的搭建,以及如何使用 Gradle 编译 Android 项目,但是对于国内的大部分开发人员来说,我们通常都是使用 Eclipse进行 Android 开发,对于大部分人而言从一个平台迁移到另一个平台所花费的成本太高。因此本文就将介绍如何通过 Gradle 编译 Eclipse 代码结构下的Android 项目,以及将 Eclipse 下的 Andorid 项目迁移到 Android Studio 下,让大家更加轻松的转移项目代码。
一、在 Eclipse 下创建一个 Android 项目
相信大家都不希望我再这里演示如何在 Eclipse 下创建一个 Android 项目,因此我也不再花费时间在这上面,先上传一张创建后的项目结构图:
再来一张 Gradle 的默认目录结构图:
通过对比两个目录结构图,我们可以发现,Eclipse 默认的代码目录结构和 Gradle 支持的代码目录结构是不同的,因此,如果我们使用上一篇文章中的方法直接进行 Android 项目编译,会发现无法进行正常编译,原因就是没有找到对应的 Android 配置文件。
二、配置 Gradle 的资源路径
为了让 Gradle 能够找到响应的源文件和资源文件,我们先看一下Gradle 的目录结构,从第二张图中我们能够发现 Gradle 的默认编译结构中将程序源码分为了几个不同的部分:java、jni、rs、aidl,而 Eclipse 的目录中java 和 aidl 是放置在同一个目录下的,所以我们需要在 build.gradle 文件根据项目结构定义好对应的路径。
定义路径位置的代码如下:
android { sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest.setRoot('tests') } }
其实 Gradle 默认的源码路径设置位置应该是在最外层,但是由于Andorid 插件拥有自己的代码设置,因此我们将 sourceSets 放置到 android 域内。
之后执行
gradle check
三、引入项目依赖包
What?你出错了,不可能吧?
当然其实这是可能的,注意查看第一张图,里面除了 TestGradle 目录以外,还有一个 appcompat_v7,这是项目的依赖包,如果你不进行配置,那么 Android 编译时无法找到他,自然会报错。
现在我们来看看如何将依赖包引入 Android,让他能够正常编译
(1)使用 maven
之前我就说过,Gradle 能够使用 Maven 的几乎所有特性,因此当我们需要使用依赖包的时候,而且该依赖包在 maven 中央库中存在的时候,我们不妨直接在配置文件中配置,配置方法也十分简单地说,以 appcompat_v7包为例,在 build.gradle 的最外层加入以下信息:
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' }
compile 代表着你希望在编译的时候将某个 maven 包打入程序中,而后面的信息则是对应 maven 包的相关信息,方便从 maven 中央仓库中进行获取。
然后你再执行一下:
gradle check
现在是不是提示你程序能够正常打包了呢。
(2)引入 jar 包
有时候我们在 libs 目录下有存放 jar 包类型或者 so 链接库类型的依赖资源,但是当你进行编译时,你会发现找不到这些资源,原因只有一个: Gradle 不知道你需要编译的资源对象在哪里,因此我们需要手动在 build.gradle 进行路径配置,大致方法与上面的类似,我就简单叙述一下就好了。
打开你的 build.gradle,在 dependencise 域,没错,就是刚才我们添加 appcompa_v7包的那个域,在域中我们加入一下代码:
compile fileTree(dir: 'libs', include: ['*.jar'])
该代码就将所有在 libs 目录下的 jar 包引入了,如果要引入 so 库,再加一句
compile fileTree(dir: 'libs', include: ['*/*.so'])
(3)引入依赖项目
如果你实在找不到对应的 maven 项目或者不能单纯使用 jar 包进行引入,实在需要使用一个依赖工程,那我们就得考虑通过将依赖项目先转换为 Gradle 类型的 Android Library,然后再进行项目关联。
面对这种情况,我们可以像 Eclipse 一样将应用项目和依赖工程放在同一目录下,方便关联。
我们先将 TestGradle 中 build.gradle 中关于 appcompat 依赖包得引用去掉
在顶层目录中,我们建立一个 build.gradle 和 setting.gradle 文件分别存放项目依赖。
build.gradle 用于存放通用的配置信息,例如通用依赖:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }
setting.gradle 用于存放项目信息,例如这里,我们可以像这样命名:
include ':TestGradle',':appcompat_v7'
TestGradle 和 appcompat_v7分别为应用项目和依赖工程的名称,如果你的工程是在某个子目录下,那么你可以使用类似于‘:libraries:lib1‘这种形式标明在 libraries 文件夹下的 lib1文件夹也是一个 Gradle 项目
之后我们进入 appcomp_v7目录,建立对应的 build.gradle 配置文件,由于我们在上层目录中已经创建了一个 build.gradle 并且配置了通用的依赖信息,因此在这个配置文件中我们可以不必写入 buildscript 的相关属性。
apply plugin: 'com.android.library' android { compileSdkVersion 21 buildToolsVersion "21.1.2" }
这里需要留意的是,这里的插件类型是‘ com.android.library‘ 标明他是一个依赖包。另外如果你的项目配置是 Eclipse 目录类型,请根据上文,配置对应的源码位置。
如此一来,你已经配置好了相关的依赖工程,接下来我们需要将这个依赖工程配置到主工程中。
方法为在主工程 build.gradle 中加入
dependencies { compile project(':appcompat_v7') }
之后你再使用 Gradle 命令行就能够针对本地的依赖库进行编译。
四、使用 Android Studio 引入工程
这里简单说说如何通过 Android Studio 使用 Eclipse 的项目目录结构进行开发。
其实方法并不复杂,通过上面的步骤我们已经成功的配置好了一个 Gradle 工程的相关环境,因此我们只需要通过点击 File->ImportProject,选中 appcompat_v7和 TestGradle 所在的父目录即可,然后一路 Next,之后,你能看到你的项目被引入到了 Android Studio 中
除了代码结构以外,与 Android Studio 建的一模一样有没有!!!
本篇博文就到这里,主要介绍了如何通过建立 Gradle配置文件将 Eclipse 项目彻底导入 Android Studio。希望大家喜欢,看到这里的点个赞可好。
Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)