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