谜团:Android Studio的项目结构和构建系统
我不知道这是否是由于Gradle Build System(我敢打赌)造成的,但是我将告诉您到目前为止我所了解的内容。
更新4: 2014/09/11为添加了备忘单,BuildTypes
(Flavors
并且Variants
我终于有信心写这个:D)
更新3: 2014/09/11更新了比较工作区和项目,使其更加精确
更新2: 2014/04/17为AS项目结构添加了更多详细信息
更新1: 2013/07/29添加了IntelliJ项目结构
IntelliJ的Project结构(如最后所示)适用于带有android插件的IntelliJ。但是,Android Studio的项目结构如下所示:
结构:项目和模块
模块在Android的工作室就像一个项目在Eclipse中
项目在Android Studio中就像是一个工作空间中的Eclipse(准确地,具有相互依存的项目工作区)
从文档(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
这是gradle构建系统的jar包装器,即该jar是AS与Windows中安装的gradle(本例中为OS)进行通信的方式。
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.库
这是标准的libs文件夹,你在看日食的土地太
3. src
在这里,您仅看到java
和res
文件夹,它们与Eclipse Land中的src
文件夹和res
文件夹相对应。恕我直言,这是非常受欢迎的简化方法。
关于模块的注意事项:
模块就像Eclipse Land项目。这里的想法是,您拥有一个应用程序项目依赖的应用程序项目(上面列表中的模块3)和几个库项目(作为全局项目文件夹下的单独模块(上面列表中的#1))。这些库项目如何在其他应用程序中重复使用,我仍然没有发现。
[ 旁注:整个重组有一些好处,如简化src文件夹,但带来许多麻烦。造成这种复杂情况的原因主要是关于这种新项目布局的非常非常薄的文档。]
新的构建系统
新构建系统的用户指南
风味和buildTypes等的解释-hullabaloo是关于什么的?
CheatSheet用于风味和buildTypes
BuildType: debug
并且默认情况下在所有项目上release
都buildTypes
可用。它们用于构建/编译相同代码以生成不同的APK。例如上release
的APK,你会想,运行优化(通过proguard的或其他工具可能)运行的ProGuard(用于混淆),你的密钥进行签名(如针对调试键),使用略有不同packageNames
(我们使用com.company.product
了release
和com.company.product.debug
为debug
)等等。我们还使用调试标志(BuildConfig.DEBUG
)关闭release
构建时的logcat日志记录(因为这会使应用程序变慢)。这样可以debug
在开发过程中加快构建速度,同时也可以优化优化的release
构建方式,以便投入使用。
产品风味:没有可用的默认风味(确切地说,默认风味为空白/无名)。Flavors
可以是具有不同代码的免费版本或付费版本。它们共享相同的代码,但几个源代码文件或资源的版本不同(或没有版本)。Main
BuildVariant: A buildVariant
是生成的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文件。当前,该文件夹包含带有String资源定义的strings.xml文件。从添加颜色部分中可以看到,布局文件夹也可以包含例如颜色的描述符。
可绘制文件夹(7)包含图像。
gen(8)文件夹包含R.java(9)文件,该文件链接可视资源和Java源代码。从下面的部分中您将看到,IntelliJ IDEA支持静态资源和R.java之间的紧密集成。一旦添加或删除了任何资源,R.java中的相应类和类字段就会相应地自动生成或删除。R.java文件也属于com.example软件包。