问题:

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

解决方案:

在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,但是会重写项目结构。

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.4——自定义代码集合的更多相关文章

  1. Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)

    如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 注:以下以Windows平台为标准,AS以目前最新 ...

  2. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  3. 配置cordova的android开发环境(无android studio)

    原文:配置cordova的android开发环境(无android studio) 趁元旦放假想试一下cordova,不想安装庞大的android studio,所以想最小化安装,居然花了一整天的时间 ...

  4. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  5. Eclipse搭建Android开发环境并运行Android项目

    Eclipse搭建Android开发环境并运行Android项目 (详细) 安装环境: window 10 64位 安装工具: JDK.Eclipse.SDK.ADT 安装步骤: 1.JAVA JDK ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

    问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

    问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记1.2

    在android开发中会需要配置使用app的android SDK的最低版本和目标版本,这个是bulidl.gradle的android模块设置.默认有以下几个设置: applicationId,这个 ...

随机推荐

  1. Https与Http,SSL,DevOps, 静态代码分析工具,RFID, SSH, 非对称加密算法(使用最广泛的一种是RSA), 数字签名, 数字证书

    在URL前加https://前缀表明是用SSL加密的. 你的电脑与服务器之间收发的信息传输将更加安全. Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定. http和h ...

  2. 随机验证码模块(random)

    1. 生成一个6位数字+字母的验证码 (面试题) import random l = []for i in range(6): alpha = chr(random.randint(65,90)) a ...

  3. java基础讲解01-----简单了解一下java

    2017-4-12(晚)  闲来无事,静静把自己了解的java,好好回忆一次.如果能帮助别人也好.会不断补充 java有关的书籍真的很多,我也不过多的介绍了. 1.什么是java 2.java的语言特 ...

  4. PayPal 对接

    时间:2019-1-29 15:39:39 文章相应链接: 官方SDK:https://developer.paypal.com/docs/api/rest-sdks/ 官方API:https://d ...

  5. [转]android – 多屏幕适配相关

    1.基本概念 屏幕大小(screen size) – 屏幕的实际大小,用屏幕对角线长度来衡量(比如3.4寸,3.8寸).android把屏幕分为以下4种:small,normal,large,extr ...

  6. jquery 在ul中取得第一级的li

    在ul中取得第一级的li <div id='demo1'> <ul> <li id='1'>1<li> <li id='2'>2<li ...

  7. myeclipse中配置schemaLocation路径,实现xml文件自动提示

    在开发中,XML的xsi:schemaLocation路径都是指向网络,但是这个网络地址有时候很不给力导致工程检验XML格式缓慢.所以有必要再myeclipse中配置本地xsd文件路径,以免每次校验都 ...

  8. MSBuild入门(续)

    MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充.主要有一下几方面 ...

  9. 多线程-join()方法

    在很多情况下,主进程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束.这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据 ...

  10. DDR 复位

    将FPGA代码和实际的数字电路对应起来. always @ (negedge clk_ref_200)     begin     if(ddr3_init_done)    'b10)   'b10 ...