问题:

你想要在项目中使用非标准的代码目录。

解决方案:

在gradle的build配置里面使用sourceSets属性。

讨论:

Android分发的samples里面使用多个代码目录,使得通用的文件从主代码里面分离。

考虑一个武断的API23,叫做Basic Gesture Detect的例子,在input/BasicGestureDetext目录下找到。应用本身的细节不重要,可以看到Gradle build演示了代码集合的修改。

下面显示应用子目录的Gradle 配置文件,注意samples礼貌经常使用Application来代替app作为主要的子项目。

// The sample build uses multiple directories to // keep boilerplate and common code separate from // the main sample code.
List<String> dirs = [
  'main', // main sample code; look here for the interesting stuff.
  'common', // components that are reused by multiple samples
  'template'] // boilerplate code that is generated by the sample template process
android {
   // ... code omitted ...
sourceSets {
main {
dirs.each { dir ->
java.srcDirs "src/${dir}/java"
res.srcDirs "src/${dir}/res"
       }
     }
   androidTest.setRoot('tests')
androidTest.java.srcDirs = ['tests/src']
  }
}

配置文件定义了一个叫做dirs的List<String>来表示代码目录。Groovy支持一个原生的lists语法,使用方括号里面包含用逗号分隔的值。上面显示的值是main,common,template。

在android块下面,sourcesSets属性用来在classpath里面增加相关的代码目录。注意main块里面,Groovy的each提供给list里面每个入口一个闭包,如下:

dirs.each { dir ->
java.srcDirs "src/${dir}/java"
res.srcDirs "src/${dir}/res"
}

each方法来自于Groovy。它遍历collection的每个元素,将他们传递给闭包参数。这里的闭包给所有元素都贴上dir的标签,并且将它转化为Groovy的字符串。

标准的项目结构定义了一个默认的代码树src/main/java和一个资源树src/main/res。在这样的情况下,使用srcDirs属性将额外的目录添加到这些集合中。这样的结果就是目录src/main/java,src/common/java,src/template/java都被添加到编译的classpath里,src/main/res,src/common/res,src/template/res被认为是资源目录。

讽刺的是,这个sample里面没有任何额外的目录。所有java代码都在src/main/java下面,所有资源都在src/main/res下面。实际上,没有一个sample实际使用了定义的结构。他们都将java代码和资源文件限制到标准的目录下面。定义这样的结构是为了一些未来计划的事情,或者一些事情的延期,或者只是证明Google的android开发者的幽默。

有一部分sourceSets属性被使用。代替将所有的测试都放在事先定义好的src/androidTest/java目录下面,Gradle配置改变了位置,如下:

测试的根目录现在是tests文件夹,tests本身放在tests/srcs文件夹下面。每个sample项目在Application下面都有两个文件夹,src和tests。ActivityInstrumentation的基础项目布局包含了一个应用目录,如下:

就像你看到的,java代码在src/main/java下面,资源文件在src/main/res下面,测试在tests/src下面。

哪里可以使用sourceSet属性。在Android apps没有转到Gradle项目之前的项目使用了不同的项目结构。Android Studio可以导入那些app,但是会重写项目结构。

最新文章

  1. 使用holder进行内存管理
  2. SPSS数据分析—生存分析
  3. 软件测试第二次作业——Fault,Failure,Error辨析与设计测试用例
  4. null值与空值比较
  5. javaweb学习总结(二十五)——jsp简单标签开发(一)
  6. 将helps.php或者functions.php直接进行了加载
  7. FZU 2082 过路费
  8. cocos2dx 屏幕适配策略
  9. platform
  10. SQL SERVER 中identity用法
  11. [设计模式]&lt;&lt;设计模式之禅&gt;&gt;关于单例模式
  12. 跟着PHP100第一季学写一个CMS(1-10)
  13. maven 添加Sqlserver的jdbc jar包
  14. C++中,引用作为函数参数
  15. 关于sublime3的使用
  16. 一行代码实现FMDB的CURD操作
  17. 【BZOJ5119】【CTT2017】生成树计数 DP 分治FFT 斯特林数
  18. Django目录结构分析
  19. Centos7 yum安装tomcat
  20. keepalived主备节点都配置vip,vip切换异常案例分析

热门文章

  1. Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.7
  2. java分页功能代码
  3. xpath的基础实例
  4. Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
  5. 基于委托的C#异步编程的一个小例子 带有回调函数的例子
  6. WebKit(Blink分支)各组件的创建与逻辑关系
  7. yum安装Apache,Mysql,PHP
  8. Unity3D_NGUI_性能优化实践_CPU卡顿
  9. 使用 Bolt 实现 GridView 表格控件
  10. linux vi/vim文本编辑