更改项目结构

很多开发者不愿意使用Android Studio的一个很大的原因,可能是由于老项目都是使用Eclipse进行开发的,而Android Studio的项目结构与Eclipse的项目结构又有所不同,两者在迁移时很难兼容,这就导致了很大的项目风险,使很多开发者望而生畏。但实际上,这种害怕心理还是由于对Gradle不熟悉造成的,Gradle的灵活性完全可以非常方便地自定义项目结构。因此只要在Gradle脚本中配置一下,就可以做到在Android Studio中兼容Eclipse的项目结构。

当创建一个默认的Android Studio项目时,其项目结构如图4.6所示。

更改项目结构 - 图1 图4.6 Android Studio项目结构

项目的根目录下有一个app module的文件夹,src文件夹下面有项目的源码main文件夹,main文件夹下面是java文件夹(代码)、res文件夹(资源)和AndroidMainifest文件。而一个默认的Eclipse项目,其结构如图4.7所示。

更改项目结构 - 图2 图4.7 Eclipse项目结构

根目录下直接是src文件夹(代码)、res文件夹(资源)和AndroidManifest文件,与Android Studio的项目结构差别很大。

其实,如果把Android Studio项目的目录结构做一下调整,Android Studio同样是不能编译的。这就说明,Android Studio对默认的项目结构是有一定约束的,这个约束就是Gradle的默认项目结构设置。Gradle的基本项目结构开始于src/main目录(忽略test目录),也就是Android Studio创建的默认的结构。如果你的项目是基于这样一个结构放置Android的相关代码、资源,那么你就不用做任何调整了。但是旧的Eclipse项目可能已经非常复杂了,这种调整可能非常烦琐。虽然Eclipse可以将项目导出为Gradle结构,但是在项目比较大、比较复杂的时候,这种导出经常会出问题。因此,自己配置整个项目结构,才是从Eclipse项目迁移到Android Studio项目的最好办法。Gradle提供了自定义目录结构的方法,在前面讲到的android领域中,可以配置Android项目相关的配置。那么,Android项目的项目结构,自然是要在android领域中进行配置,如下所示。

  1. sourceSets {
  2. main {
  3. java.srcDirs = ['src']
  4. res.srcDirs = ['res']
  5. assets.srcDirs = ['assets']
  6. jni.srcDirs = ['jni']
  7. jniLibs.srcDirs = ['libs']
  8. manifest.srcFile 'AndroidManifest.xml'
  9. }
  10. }

基本不用做太多的解释,相信大家都能看懂,只需要指定具体的Android所必需文件夹的具体路径,就等于告诉Gradle需要使用自定义的项目结构,而不是默认的项目结构。想要更加完整,你还可以做以下设置。

  1. renderscript.srcDirs = ['src']
  2. aidl.srcDirs = ['src']

通过以上设置,在保留原有Eclipse配置的基础上,既可以兼容Eclipse开发,又可以兼容Android Studio开发,在项目的迁移过程中是非常有用的。当然,最好的办法还是将代码分别进行copy转换。这是最简单暴力的做法,而且也是最不容易出错的方法。

通过sourceSets更改项目结构,除了可以兼容Eclipse项目之外,它最大的用处实际上在于可以完全自定义代码的目录结构便于代码的整理,例如下面这个脚本。

  1. sourceSets {
  2. main {
  3. java.srcDirs = ['src']
  4. res.srcDirs = ['res']
  5. assets.srcDirs = ['assets']
  6. jni.srcDirs = ['jni']
  7. jniLibs.srcDirs = ['libs']
  8. manifest.srcFile 'AndroidManifest.xml'
  9. }
  10. }

在这个脚本中,笔者更改了默认的sourceSets。在原有src/main/res资源目录的基础上,增加了两个新的目录,即src/main/res/layout/activity和src/main/res/layout/fragment。在新建的activity和fragment目录中,笔者分别放置了Activity的布局文件和Fragment的布局文件,编译后新的目录,如图4.8所示。

更改项目结构 - 图3 图4.8 自定义的项目结构

可以发现,新增的activity和fragment两个文件夹已经被识别为资源目录了。这样在代码中依然可以直接使用,但对于项目的管理上它们已经被分开了,整个结构一目了然。另外除了资源之外,其他的代码结构同样可以通过这种方式进行管理。

更改项目结构 - 图4虽然本文讲解了如何兼容Android Studio和Eclipse项目的方法,但笔者坚决反对继续使用Eclipse进行Android App开发。读者可以看看2015 Google IO大会上的功能演示,Android Studio已经拉开Eclipse几个天文单位了,不使用工具革新生产力,永远无法掌握核心竞争力。

关于更加详细的自定义项目结构的文档,可以查看Gradle官网的相关内容,地址为https://docs.gradle.org/current/userguide/java_plugin.html。

更改项目结构 - 图5笔者在文中反复提到Gradle的各种官方文档,可见其在学习Gradle中的重要性。毕竟对于大部分的Android开发者来说,Gradle是一个全新的东西,要了解它的最佳途径就是多看文档。笔者建议开发者在阅读本章时,尽量对照官方文档进行配合阅读,加深印象。