Android 项目结构

Android 项目结构

  • .gradle 和 .idea 目录:AS 自动生成的一些文件,无须关心。
  • app 目录:存放项目中的代码和资源等,开发工作的主要目录。
  • build 目录:主要包含了一些在编译时自动生成的文件,也不必过多关心。
  • gradle 目录:包含了 gradle wrapper 的配置文件,使用 gradle wrapper 的方式不需要提前将 gradle 下载好,而是会根据本地的缓存情况决定是否需要联网下载 gradle。AS 默认是启动 gradle wrapper 方式的,如果需要更改成离线模式,可以点击 AS 导航栏 -> File -> Settings -> Build,Execution,Deployment -> Gradle,进行配置更改。
  • .gitignore 文件:用来将指定的目录或文件排除在版本控制之外的。
  • build.gradle 文件:项目全局的 gradle 构建脚本。
  • gradle.properties 文件:全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的 gradle 编译脚本。
  • gradlew 和 gradlew.bat 文件:用来在命令行界面中执行 gradle 命令的,前者是在 Linux 或 Mac 系统中使用的,或者是在 Windows 系统中使用的。
  • 项目名称.iml 文件:.iml 文件是所有 IntelliJ IDEA 项目都会自动生成的一个文件(AS 是基于 IntelliJ IDEA 开发的),用于标识这是一个 IntelliJ IDEA 项目。不需要修改它的任何内容。
  • local.properties 文件:用于指定本机中的 Android SDK 路径。
  • settings.gradle 文件:用于指定项目中所有引入的模块。

app 目录结构

  • build 目录:包含了一些在编译时自动生成的文件。
  • libs 目录:存放项目中使用到的第三方 jar 包,并会自动添加到项目的构建路径里。
  • androidTest 目录:用于编写 Android Test 测试用例的,可对项目进行一些自动化测试。
  • java 目录:用于存放代码,包括 Java 和 Kotlin。
  • res 目录:存放各种资源。两种方式引用它们:代码中 R.string.name,XML 中 @string/name。其中 string 可替换为相应资源。
  • drawable 目录:目前最主流设备分辨率是 drawable-xxhdpi 目录,图片放这就行。
  • mipmap 目录:存放应用图标。
  • layout 目录:存放布局文件。
  • values 目录:存放字符串、样式、颜色等配置的。
  • AndroidManifest.xml 文件:整个 Android 项目的配置文件。
  • test 目录:用来编写 Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。
  • .gitignore 文件:用于将 app 模块内指定的目录或文件排除在版本控制之外。
  • app.iml 文件:IntelliJ IDEA 项目自动生成的文件,无须理会。
  • build.gradle 文件:这是 app 模块的 gradle 构建脚本,这个文件中会指定很多项目构建相关的配置。
  • proguard-rules.pro 文件:用于指定项目代码的混淆规则。

build.gradle 文件

AS 采用 Gradle 来构建项目。Gradle 是一个非常先进的项目构建工具,它使用了一种基于 Groovy 的领域特定语言(DSL)来进行项目设置,摒弃了传统基于 XML (如 Ant 和 Maven)的各种烦琐配置。

最外层目录下的 build.gradle 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

buildscript {
ext.kotlin_version = '1.3.50'
repositories {
// 分别对应了一个代码仓库
google() // 包含的主要是 Google 自家的扩展依赖库
jcenter() // 包含的大多是一些第三方的开源库

}
dependencies {
// 此闭包中声明了两个插件,一个 Gradle 插件和一个 Kotlin 插件。
// 声明前者是因为 Gradle 并不是专门为构建 Android 项目开发的,并且版本号一般要和 AS 版本对应。
// 声明后者是因为此项目使用 Kotlin 开发,如果是使用 Java,则不需要声明此插件。
classpath 'com.android.tools.build:gradle:3.5.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
// 分别对应了一个代码仓库
google() // 包含的主要是 Google 自家的扩展依赖库
jcenter() // 包含的大多是一些第三方的开源库

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

app 目录下的 build.gradle 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 此插件表示这是一个应用模块(library 则表示库模块。应用模块可直接运行,库模块需依附于别的应用模块来运行)
apply plugin: 'com.android.application'
// 使用 Kotlin 开发必须应用的插件
apply plugin: 'kotlin-android'
// 实现了一些非常好用的 Kotlin 扩展功能
apply plugin: 'kotlin-android-extensions'
// 此闭包中可配置项目构建的各种属性
android {
// 用于指定项目的编译版本,这里表示使用 Android 10.0 系统的 SDK 编译。
compileSdkVersion 29
// 用于指定项目构建工具的版本
buildToolsVersion "29.0.2"
defaultConfig {
// 应用的唯一标识符
applicationId "com.example.myapplication"
// 用于指定项目最低兼容的 Android 系统版本
minSdkVersion 21
// 指定的值表示在该目标版本上已经做过了充分的测试,系统将会为应用程序启用一些最新的功能和特性。比如 Android 6.0 系统的运行时权限。
targetSdkVersion 29
// 项目的版本号
versionCode 1
// 项目的版本名
versionName "1.0"
// 用于在当前项目中启用 JUnit 测试,可以为当前项目编写测试用例,以保证功能的正确性和稳定性。
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// 此闭包用于指定生成安装文件的相关配置,通常只会有两个子闭包:debug 和 release。前者用于指定生成测试版安装文件的配置,可忽略不写,后者用于指定生成正式版安装文件的配置。
// 注意,通过 AS 直接运行生成的都是测试版安装文件。
buildTypes {
release {
// 对项目代码是否进行混淆
minifyEnabled false
// 指定混淆时使用的规则文件,这里指定了两个文件:第一个是在<Android SDK>/tools/proguard 目录下的,里面是所有项目通用的混淆规则,第二个是在项目的根目录下的,里面可以编写当前项目的特有的混淆规则。
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
// 指定当前项目的所有的依赖关系
// 通常 AS 项目一共有三种依赖方式:本地依赖、库依赖的远程依赖。
// 本地依赖可以对本地的 jar 包或目录添加依赖关系 (implementation fileTree)
// 库依赖可以对项目中的库模块添加依赖关系 (implementation project)
// 远程依赖可以对 jcenter 仓库上的开源项目添加依赖关系。(implementation)
dependencies {
// 本地依赖声明,表示将 libs 目录下所有 .jar 后缀的文件都添加到项目的构建路径中。
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// implementation 则是远程依赖声明
// androidx.appcompat:域名部分,用于和其他公司的库做区分。
// appcompat:工程名部分,用于和同一公司中不同的库工程做区分。
// 1.1.3:版本号,用于和同一个库不同的版本做区分。
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
// testImplementation 和 androidTestImplementation 都是用于声明测试用例库的
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// 库依赖:比如一个库模块名字是 helper。
// implementation project(':helper')
}

链接

参考资料:
第一行代码(第3版)