问题:

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

解决方案:

在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. CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

    树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且代码量和常数较小 首先定义一个数组 int c[N]; 并清空 memset(c, 0, sizeof c) ...

  2. C# 重载和默认参数(那种情况下使用更好)

    当你提供函数,外部因为要传入不同参数个数,重载会导致 外部if增加,  默认参数可以消除外部的if.当外部调用函数需要判断调用那个函数,根据调用次数增多 if跟着调用持续增多两种不同的调用 //重载 ...

  3. 关于ThreadLocal变量的一个坑

    每个线程都有一个ThreadLocalMap对象,ThreadLocalMap是Thread的一个内部类,可以把ThreadLocalMap理解成一个Map,这个Map里存放这一个Thread的所有线 ...

  4. LR11.50 通过Mobile Application 录制手机操作

    LR11.50 通过Mobile Application 录制手机操作 步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个 ...

  5. MAC OS X 10.8 操作远程SSH服务器 + 无密码输入使用SSH服务器

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://www.osssme.org/ 使用命令行连接连接远程SSH服务器,root为我使用的远程服务器用户名,@后为I ...

  6. No suitable driver found for jdbc:mysql://localhost:3306/hibernate_basic

    Struts Problem Report Struts has detected an unhandled exception: Messages: No suitable driver found ...

  7. hibernate的配置, 增删改查

    路径:查找路径 实际上都是查找编译后的对应的路径,在bin文件夹中总 增删改必须开启事务才行 hibernate加载文件的两种方式 configure 1.引包 antlr-2.7.6.jar bac ...

  8. emqtt-benchmark发送指令

  9. ubuntu环境变量及其配置

    Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量.所以管理环境变量的文件也分为系统级和用户级的. ...

  10. MongoDB GridFS最佳应用概述

    <MongoDB GridFS最佳应用概述> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs GridFS是MongoDB数据库之上的一个简单 ...