Android 打卡 Day2 - 项目结构


SDK Version

有些文章看的云里雾里,概念性的内容还是看官方👉:

官方 - SDK 平台版本说明
官方 - API 级别说明

Android Studio 项目目录结构

在 Android Studio 中,新建一个工程、进入 Project 标签页。Project 标签页会显示项目的文件和文件夹,如下左图。官方说 如有必要,请从 Project 标签页的下拉菜单中选择 Android,如下右图:

这就是您使用的标准文件视图和组织方式,在编写项目代码时会非常有用,因为您可以轻松访问将在应用中使用的各个文件。不过,如果您是通过文件浏览器(如 Finder 或 Windows 资源管理器)浏览文件,则文件层次结构的组织方式会明显不同。

确实,Project 比 Android 目录看着闹心多了,我说怎么第一次看公司 Android 的代码乱七八糟的呢,他们几个也不告诉我,坏人,啊哈哈哈~🤡🤡🤡🤡🤡

截图是以上次的 Tip Time Demo 为例:

目录文件 用途
.gradle gradle 项目产生的文件夹(自动编译工具产生的文件)
.idea IDEA 项目文件夹(开发工具产生的文件)
app module 模块
build 构建时生成文件的地方
gradle gradle 环境支持文件夹
.gitignore git 源码管理文件
build.gradle gradle 项目自动编译的配置文件
gradlew 自动完成 gradle 环境的 linux mac 脚本,配合 gradle 文件夹使用
gradlew.bat 自动完成 gradle 环境的 windows 脚本,配合 gradle 文件夹使用
local.properties Android SDK NDK 环境路径配置
setting.gradle gradle 项目的子项目包含文件

.gradle

.gradle 是AS自动生成的目录,一般情况不做修改。

.idea

idea 是AS自动生成的目录,一般情况不做修改。

app

应用的主目录、模块目录。

目录文件 用途
build 编译时生成
libs 存放第三方的 jar 包
src app 模块的源码
.gitignore git 源码管理文件
build.gradle app 模块的 gradle 构建脚本
proguard-rules.pro 指定代码混淆

1️⃣ build 目录

和外层的 build 类似主要包含编译时自动生成的内容, 其中在 outputs 文件夹下存放打包好的 apk 文件(debug 和 release)。

2️⃣ libs 目录

如果项目中是用了第三方的 jar 包,就需要把 jar 包放到 libs 目录下,然后 jar 包会被自动添加到构建路径(如集成百度地图 sdk,把 jar 包放到 libs 目录。可以在 build.gradle(app)文件中查看当前项目依赖)。

3️⃣ src 目录

module 源码所在目录。

  • AndroidTest - 用来编写 Android test 测试用例的,可以对项目进行一些自动化测试。
  • Java - 放 Java 代码的地方。
  • res - 存放各种资源文件的地方,有图片、字符串,动画、音频等,还有各种形式的 XML 文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
🤓  res [main] 🔥 tree -L 1
.
├── drawable
├── drawable-v24
├── layout
├── mipmap-anydpi-v26
├── mipmap-hdpi
├── mipmap-mdpi
├── mipmap-xhdpi
├── mipmap-xxhdpi
├── mipmap-xxxhdpi
├── values
├── values-night
├── values-zh-rCN
└── xml
  • AndroidManifest.xml - 整个项目的配置文件,四大组件都需要在这里注册才能正常的运行。
  • test - 用来编写 Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。

4️⃣ src->res 资源介绍

以下内容转载自

💯 图片资源

drawable:存放各种位图文件,(.png/.jpg/.9png/.gif 等) 除此之外可能是一些其他的 drawable 类型的 XML 文件;
mipmap-hdpi:高分辨率,一般把图片放这里;
mipmap-mdpi:中等分辨率,很少,除非兼容的的手机很旧;
mipmap-xhdpi:超高分辨率,手机屏幕材质越来越好,以后估计会慢慢往这里过渡;
mipmap-xxhdpi:超超高分辨率,这个在高端机上有所体现;

💯 布局资源

layout:该目录下存放的就是我们的布局文件,另外在一些特定的机型上,我们做屏幕适配,比如 480*320 这样的手机,我们会另外创建一套布局,就像:layout-480x320 这样的文件夹。

💯 values 目录

emens.xml:定义尺寸资源;
string.xml:定义字符串资源;
styles.xml:定义样式资源;
colors.xml:定义颜色资源;
arrays.xml:定义数组资源;
attrs.xml:自定义控件时用的较多,自定义控件的属性;
theme 主题文件:和 styles 很相似,但是会对整个应用中的 Actvitiy 或指定 Activity 起作用,一般是改变窗口外观的,可在 Java 代码中通过 setTheme 使用,或者在 Androidmanifest.xml 中为 <application…> 添加 theme 的属性。

PS: 你可能看到过这样的 values 目录:values-w820dp,values-v11 等,前者 w 代表平板设备,820dp 代表屏幕宽度;而 v11 这样代表在 API(11),即 android 3.0 后才会用到的。

💯 raw 目录

用于存放各种原生资源 (音频,视频,一些 XML 文件等),我们可以通过 openRawResource(int id) 来获得资源的二进制流。其实和 Assets 差不多,不过这里面的资源会在 R 文件那里生成一个资源 id 而已。

💯 动画资源

animator:存放属性动画的 XML 文件;
anim:存放补间动画的 XML 文件;

💯 如何使用资源

我们所有的资源文件都会在 R.java 文件下生成一个资源 id,我们可以通过这个资源 id 来完成资源的访问,使用情况有两种:Java 代码中使用和 XML 代码中使用。

  • Java 代码中使用:

文字:

1
txtName.setText(getResources().getText(R.string.name)); 

图片:

1
imgIcon.setBackgroundDrawableResource(R.drawable.icon); 

颜色:

1
txtName.setTextColor(getResouces().getColor(R.color.red)); 

布局:

1
setContentView(R.layout.main);

控件:

1
txtName = (TextView)findViewById(R.id.txt_name);
  • XML 代码中使用:

通过 @xxx 即可得到,比如这里获取文本和图片:

1
<TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background = "@drawable/img_back"/>

该说不说,这个资源的分布和引用方式,真的比 iOS 方便很多…🚰

Gradle

官方文档

Android Studio 使用高级构建工具包 Gradle 来自动执行和管理构建流程,同时也允许您自行指定灵活的 build 配置。每项 build 配置均可定义各自的一组代码和资源,同时重复利用所有应用版本共用的部分。Android Gradle 插件与该构建工具包搭配使用,提供专用于构建和测试 Android 应用的流程和可配置设置。

Gradle 和 Android Gradle 插件独立于 Android Studio 运行。这意味着,您可以在 Android Studio 内、计算机上的命令行或未安装 Android Studio 的计算机(如持续集成服务器)上构建 Android 应用。

对于我这种初学者来说,知道 Gradle 是一个自动化构建工具(管理项目中的依赖、打包、编译)、基于 Groovy 的 DSL等就可以了,不急,后面慢慢来理解。好吧,主要是有些内容我没看懂🤓,但是不急,先用起来。

选中下拉菜单 -> Android,可以看到 Gradle Scripts 包含以下文件:

1
2
3
4
5
6
7
8
build.gradle(Project:Tip_Time)
build.gradle(Module :app)
proguard-rules.pro(ProGuard Rules for ":app")
gradle.properties(Project Properties)
gradle.properties(Global Properties)
gradle-wrapper.properties(Gradle Version)
local.properties(SDK Location)
settings.gradle(Project Settings)

PS: Tip Time 工程太简单,复杂的项目应该不止这些文件。

1️⃣ settings.gradle

(Project Settings)位于项目的根目录下,此设置文件会定义项目级仓库设置,并告知 Gradle 在构建应用时应将哪些模块包含在内。多模块项目需要指定应包含在最终 build 中的每个模块。可能包含一下这几部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "Tip Time" //应用名称
include ':app' //所包含的模块

✅pluginManagement

pluginManagement {repositions {...}} 块用来配置 Gradle 用于搜索或下载 Gradle 插件及其可传递依赖项的存储库。Gradle 预先配置了对远程存储库(如 JCenter、Maven Central 和 Ivy)的支持。还可以使用本地存储库或定义自己的远程存储库。上面的代码定义了 Gradle 插件门户、谷歌的 Maven 存储库和 Maven 中央存储库,作为 Gradle 应该用来查找其依赖关系的存储库。

✅dependencyResolutionManagement

dependencyResolutionManagement {repositions {...}} 用于配置项目中所有模块使用的存储库和依赖项,例如用于创建应用程序的库。但是,应该在每个模块级 build.gradle 文件中配置特定于模块的依赖项。对于新项目,Android Studio 默认情况下包括谷歌的 Maven 存储库和 Maven 中央存储库,但它不配置任何依赖项(除非我们选择需要一些依赖项的模板)。

2️⃣ build.gradle(Project:Tip_Time)

Project 的构建文件。**// Top-level build file where you can add configuration options common to all sub-projects/modules.** 从这句注释大概能看出它的地位了。顶层 build.gradle 文件位于项目的根目录下。它用于定义适用于项目中所有模块的依赖项。默认情况下,顶层 build 文件使用 plugins 代码块定义项目中所有模块共用的 Gradle 依赖项。此外,顶层 build 文件还包含用于清理 build 目录的代码。

1
2
3
4
5
6
7
8
9
10
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.2.2' apply false
id 'com.android.library' version '7.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}

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

3️⃣ build.gradle(Module :app)

模块级 build.gradle 文件位于每个 project/module/ 目录中,用于为其所在的特定模块配置 build 设置。可以通过配置这些 build 设置提供自定义打包选项(如额外的 build 类型和产品变种),以及替换 main/ 应用清单或者顶层 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
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}

android {
compileSdk 33 //设置编译时用的Android版本

buildFeatures {
viewBinding = true
}

defaultConfig {
applicationId "com.example.tiptime" //项目的包名
minSdk 28 //项目最低兼容的版本
targetSdk 33 //项目的目标版本
versionCode 1 //版本号
versionName "1.0" //版本名称

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //表明要使用AndroidJUnitRunner进行单元测试
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies { //该模块的依赖关系

implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

✅plugins

指定 android {} 块使用的构建选项。

  • com.android.application - 表示该模块为应用程序模块,可以直接运行,打包得到的是.apk 文件;
  • com.android.library - 表示该模块为库模块,只能作为代码库依附于别的应用程序模块来运行,打包得到的是.aar文件;
  • org.jetbrains.kotlin.android - 表示该模块使用 kotlin 开发。

✅android

指定该模块的各种构建属性。

✅dependencies

指定仅构建该模块本身所需的依赖项。

4️⃣ Properties

Gradle 的属性文件,项目全局的配置(如 AndroidX 等)、构建的全局配置(例如网络代理等)、本地环境的配置(如 SDK 的路径等)。

gradle.properties(Project Properties)
gradle.properties(Global Properties)
local.properties(SDK Location)

看到一篇比较细致的文章,不过有些配置项比较老了🔽

Demo

仅用于记录学习过程,不具备指导性。🤓

Demo-Github


下一日目标:膜拜一下四大组件。