谜底:Android Studio 的项目结构和构建系统
我不知道这是否是因为 Gradle 构建系统(我敢打赌),但我会告诉你到目前为止我所理解的。
更新 4: 2014/09/11 为 BuildTypes、Flavors 和 Variants 添加了备忘单(我终于有信心写这篇文章了:D )
更新 3: 2014/09/11 更新了比较工作区和项目以更准确
更新 2: 2014/04/17 添加了更多详细信息AS 项目结构
更新 1: 2013/07/29 添加了 IntelliJ 项目结构
IntelliJ 的项目结构(显示在末尾)适用于带有 android 插件的 IntelliJ。然而,Android Studio 的项目结构是这样划分的:
结构:项目和模块
Android Studio 中的
module 类似于 Eclipse
中的
项目
Android Studio 中的
project 就像 Eclipse 中的 workspace(准确地说,是一个相互依赖的工作区项目)
来自the documentation(Android Studio 基于 Intellij IDEA):
无论您在 IntelliJ IDEA 中做什么,都是在
项目。项目是一个组织单位,代表一个
完整的软件解决方案。
你的成品可能会分解成一系列离散的,
孤立的模块,但它是一个项目定义带来它们
将它们联系在一起,形成一个更大的整体。
对于 Android,这意味着每个应用一个项目,每个库和每个测试应用一个模块。
如果您尝试在同一个项目中构建多个应用程序,则会出现多个问题。这是可能的,但如果你尝试(像我一样),你会发现几乎所有的东西都是为每个项目使用一个应用程序而设计的。
例如,有一个“重建项目”的选项,这对多个应用程序没有意义,许多其他项目设置将无用,并且当您有多个存储库时,内置的 VCS 系统不是很好。
结构:文件夹结构
顶级文件夹
1。主要项目
这将是整个项目上下文(Eclipse Land:类似于您的工作区,但仅限于与您的项目相关的内容)。例如:HelloWorldProject 如果您提供的应用程序名称是 HelloWorld
2。 .idea
Android Studio (AS) 存储项目特定元数据的位置。 (Eclipse Land: project.properties 文件)
3。项目模块
这是实际项目。例如:HelloWorld 如果您提供的应用程序名称是 HelloWorld
4。分级
这是 gradle 构建系统的 jar 包装器,即这个 jar 是 AS 与安装在 Windows(在我的情况下是操作系统)中的 gradle 通信的方式。
5。外部库
这实际上不是一个文件夹,而是一个显示引用库(Eclipse Land: 引用库)的地方。这是显示目标平台的位置等。
[旁注:这就是我们在 Eclipse Land 中的许多人用来删除引用的库并修复项目属性来修复引用错误的地方,还记得吗?]
项目文件夹详情
这是上面列表中的第 3 号。有以下子目录
1。构建
这包含make 进程的所有完整输出,即classes.dex、编译的类和资源等。
在 Android Studio GUI 中,只显示了几个文件夹。重要的部分是 您的 R.java 可以在此处找到在 build/source/<flavor>/r/<build type(optional)>/<package>/R.java
下
2。库
这也是您在 eclipse land 中看到的标准 libs 文件夹
3。源代码
在这里,您只能看到与 Eclipse Land 中的src 文件夹和res 文件夹对应的java 和res 文件夹。这是非常受欢迎的简化恕我直言。
模块注意事项:
模块类似于 Eclipse Land 项目。这里的想法是你有一个应用程序项目(上面列表中的模块#3)和几个库项目(作为全局项目文件夹下的单独模块(上面列表中的#1)),应用程序项目依赖于它们。这些库项目如何在其他应用程序中重用,我还没有弄清楚。
[旁注:整个重组有一些好处,比如简化了 src 文件夹,但也有很多复杂性。复杂性主要是由于这个新项目布局的非常非常文档太薄。]
新的构建系统
User Guide for the new Build System
flavors 和 buildTypes 等的解释 - hullabaloo 是关于什么的?
风味和构建类型的备忘单
BuildType: debug 和 release 是 buildTypes 在所有项目中默认可用。它们用于构建/编译 SAME CODE 以生成不同的 APK。例如,在release APKs 上,您需要运行 proguard(用于混淆),用您的密钥签名(相对于调试密钥),运行优化(可能通过 proguard 或其他工具),使用略有不同的 packageNames(我们使用com.company.product 表示release 和com.company.product.debug 表示debug)等。我们还使用调试标志(BuildConfig.DEBUG)在release 构建上关闭对logcat 的日志记录(因为它会使应用程序变慢) .这使得开发过程中的debug 构建速度更快,同时也优化了release 构建以放入游戏商店。
产品风味:没有可用的默认风味(或者准确地说,默认风味是空白/无名)。 Flavors 可以是免费版或付费版,它们有不同的代码。它们共享相同的Main 代码,但一些源代码文件或资源的版本不同(或没有版本)。
BuildVariant:buildVariant 是生成的 APK 实际对应的内容。它们的名称如下(按顺序)Product Flavor + Build Type = Build Variant。
示例 1: 如果您有 free 和 @987654360 @作为两种口味。您将获得的构建变体是:
免费 - 调试
免费 - 发布
付费 - 调试
付费 - 发布
这就是 4 种可能的 APK 配置。一些配置在特定项目中可能没有意义,但它们是可用的。
示例 2:(对于新项目/无风格)您有 2 个buildVariants 或可用的 APK,因为默认风格是无名/空白:
调试
释放
.idea (1) 文件夹包含许多子文件夹,主要包含内部 IntelliJ IDEA 信息。
src (2) 文件夹包含实现应用程序功能的 MyActivity.java (3) 文件源代码。该文件属于 com.example 包。
res (4) 文件夹包含各种视觉资源。
layout/main.xml 文件(5)定义了由各种类型的资源构成的应用程序的外观。
values 文件夹 (6) 用于存储描述各种类型资源的 .xml 文件。目前,该文件夹包含一个带有字符串资源定义的 strings.xml 文件。正如您将在“添加颜色”部分看到的那样,布局文件夹还可以包含例如颜色描述符。
可绘制文件夹 (7) 包含图像。
gen (8) 文件夹 包含链接视觉资源和 Java 源代码的 R.java (9) 文件。正如您将在下面的部分中看到的,IntelliJ IDEA 支持静态资源和 R.java 之间的紧密集成。只要添加或删除任何资源,R.java 中相应的类和类字段就会相应地自动生成或删除。 R.java 文件也属于 com.example 包。