Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.4——自定义代码集合
问题:
你想要在项目中使用非标准的代码目录。
解决方案:
在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,但是会重写项目结构。
最新文章
- 使用holder进行内存管理
- SPSS数据分析—生存分析
- 软件测试第二次作业——Fault,Failure,Error辨析与设计测试用例
- null值与空值比较
- javaweb学习总结(二十五)——jsp简单标签开发(一)
- 将helps.php或者functions.php直接进行了加载
- FZU 2082 过路费
- cocos2dx 屏幕适配策略
- platform
- SQL SERVER 中identity用法
- [设计模式]<;<;设计模式之禅>;>;关于单例模式
- 跟着PHP100第一季学写一个CMS(1-10)
- maven 添加Sqlserver的jdbc jar包
- C++中,引用作为函数参数
- 关于sublime3的使用
- 一行代码实现FMDB的CURD操作
- 【BZOJ5119】【CTT2017】生成树计数 DP 分治FFT 斯特林数
- Django目录结构分析
- Centos7 yum安装tomcat
- keepalived主备节点都配置vip,vip切换异常案例分析
热门文章
- Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.7
- java分页功能代码
- xpath的基础实例
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
- 基于委托的C#异步编程的一个小例子 带有回调函数的例子
- WebKit(Blink分支)各组件的创建与逻辑关系
- yum安装Apache,Mysql,PHP
- Unity3D_NGUI_性能优化实践_CPU卡顿
- 使用 Bolt 实现 GridView 表格控件
- linux vi/vim文本编辑