AndroidStudio——安卓项目结构与文件介绍
一、AndroidStudio界面
一个安卓项目界面主要由以下几部分组成:
1.菜单栏:位于顶部,基本的各项菜单操作
2.项目结构:通常位于左侧,展示当前项目的目录结构
3.编辑窗口:通常位于中间,可以用于编辑项目中的各种文件,也是我们平时使用最为频繁的窗口
4.状态窗口:通常位于底部,包括logcat、terminal、build等。用于展示编译、运行时的各种信息
此外,主界面的右侧有时还会展示虚拟设备、gradle配置等信息,这些一般由开发人员自定义。
二、安卓项目目录解析
1.app文件夹
一些较为重要的文件夹和文件包括: app目录:安卓应用程序的主要目录,包含了应用程序的代码、资源和配置文件
app/src/main/java/:主要的Kotlin代码文件,包括Activity、Fragment、Adapter等,以及其它自定义的类
app/src/main/res/:各种资源文件,如layout目录存放布局文件、values目录存放字符串、颜色值等资源文件
app/src/main/AndroidManifest.xml:定义了应用程序的组件和权限等信息
2.AndroidManifest.xml:
一些较为重要的xml节点包括:
android:label="@string/app_name":指定应用程序的显示名称,引用了资源中的字符串
android:roundIcon=“@mipmap/ic_launcher_round”:指定应用程序的图标
<activity>:描述了应用程序中的一个活动(Activity),即与用户交互的界面
android:name=“.MainActivity”:该Activity的名称,对应src下的文件
android:exported="true":指示这个活动是否可以被其他应用程序调用。
<intent-filter>:指定了与这个活动相关的意图过滤器,即哪些意图会触发这个活动的启动。
<action android:name="android.intent.action.MAIN" />:指定了这个活动是应用程序的主入口点。
<category android:name="android.intent.category.LAUNCHER" />:指定了这个活动是启动器类别,即应用程序的启动图标会指向这个活动。
上述内容确定了安卓的源代码、静态资源等内容。如果希望将这些“代码”变成可以在安卓系统中编译的“程序”,则还需要编译。与JAVA应用编译使用javac不同,编译安卓程序需要自动构建工具 – Gradle。 在使用Gradle进行编译之前需要进行配置,下面介绍和项目编译与构建相关的文件。
3.settings.gradle
该文件为gradle的配置文件。主要说明了本项目的名称,所包含的子项目,以及本项目仓库的位置等。如下述默认的配置文件规定了仓库位置是google和mavenCentral等,以及项目名称是“My Application”,包含一个子项目为app
4.build.gradle
在新建的安卓工程中,一般会有两个build.gradle。在主目录/根目录下的build.gradle也是gradle的配置文件,主要说明了本项目所需的依赖包、Kotlin/SDK的版本等信息。该配置为全局共享的配置选项,应用于所有模块。
5.app/build.gradle
在新建的安卓工程中,一般会有两个build.gradle。在app目录下的build.gradle定义了本模块的配置选项,如相应依赖包只适用于本模块。该配置文件的通常结构如下所示。
android 部分包含了 Android 构建的配置,其中常见的配置项包括:
(1)compileSdkVersion 和 buildToolsVersion:编译 SDK 版本和构建工具版本。
(2)defaultConfig:默认配置,包括应用程序的一些基本信息,如应用 ID、最小 SDK 版本、目标 SDK 版本、版本号等。
(3)buildTypes:构建类型,通常包括 debug 和 release 两种。
dependencies 部分包含了应用程序的依赖项,通常使用 implementation 关键字来声明依赖关系。其中,常见的依赖项包括:
(1)AndroidX 库:包括了 Jetpack 组件,如 appcompat, constraintlayout, lifecycle 等
(2)第三方库:例如 Google Material Design 组件等。
6.build.gradle 与 app/build.gradle 的区别:
(1)build.gradle 是顶层构建文件,配置了整个项目的通用构建选项和依赖项,而不是特定于某个模块。
(2)app/build.gradle 是一个模块级别的构建文件,主要配置了该模块特定的构建选项和依赖项。
通过将构建逻辑拆分到不同的文件中,可以使项目的构建脚本更加清晰、易读和易于维护。这种模块化的构建配置方式允许开发者更灵活地管理项目的不同部分。
总的来说,settings.gradle 文件是 Gradle 构建的入口点,用于定义项目结构;接着是根项目的 build.gradle 文件,用于定义全局的构建配置;最后是每个模块的 build.gradle 文件,用于配置该模块的构建行为和设置。Gradle 在执行构建过程时会按照这个顺序逐步加载和执行这些文件,以完成整个项目的构建任务。
在多模块项目中,模块之间可能存在依赖关系,其中某些模块依赖于其他模块的输出。因此,必须确保依赖模块在被依赖模块之前被构建。正确的编译顺序可以确保所有依赖关系都被满足,并且每个模块都能够使用它所依赖的内容。
三、Android开发相关概念
1.Gradle
简单来说,Gradle是运行于JVM中的一个用于自动构建项目的程序,目前安卓将其作为官方的构建程序,且Springboot也逐渐支持Gradle。Gradle根据脚本中的内容逐步构建项目。在安卓项目中,这个脚本一般为build.gradle
为什么要使用项目构建工具?
2.JDK
Kotlin运行于JAVA虚拟机JVM中,因此需要确保本机已安装JDK,且告知AS正确的JDK路径。可以在终端中查看目前注册在环境变量中的JDK版本。
若希望查看所有可用的JDK版本,或修改本项目对应的JDK版本,可以进入file – project structure,修改对应的选项。
此外,还可以在app的build.gradle配置中确定JDK的版本。
即在android 元素中添加:
3.SDK
JDK提供了Java语言的基本工具和库,而Android SDK则提供了专门用于Android平台开发的工具和资源。在Android开发中,通常需要同时使用JDK和Android SDK来完整地进行应用程序开发:
(1)Android SDK是专门为Android平台开发的工具包,包含了用于构建Android应用程序的一系列库。
(2)Android SDK还提供了开发Android应用程序所需的所有资源,包括Android虚拟设备模拟器(Android Emulator)、调试工具、构建工具、Android API库等。它还包括与Android设备通信的工具,以及用于处理资源文件、图形等的工具。
在AS的tools中选择SDK manager,可以查看目前已经安装的SDK。比如勾选Android 9.0,然后点击apply,AS即会自动下载SDK。
4.NDK和CMake
配置好JDK和SDK就可以进行大部分安卓开发了。但是有时候我们可能需要和底层硬件交互,或者调用C/C++库。此时就需要NDK (Native Development Kit) 与 Cmake的支持。我们可以在SDK tools添加所需要的版本。
四、安卓页面布局
1.基本概念
在安卓应用(以及大部分的前端)中,向用户展示的界面是由“布局”和“控件”组成的。可以认为,控件相当于建筑中的砖瓦,布局相当于建筑整体框架。
2.View视图
从安卓中的类的角度来看,控件就是view类的对象,布局就是viewgroup类的对象。如下所示,viewgroup中可以包含view,也可以包含viewgroup。
3.页面布局编写方式
在app的res/layout文件夹中放置了类型为XML的布局文件。这么做的目的是为了将安卓应用的前后端开发分离。
此外,XML的全称是可扩展标记语言(eXtensible Markup Language),与超文本标记语言(HyperText Markup Language)类似,都是一种标记语言。标记语言结构清晰,易于阅读和维护。通过XML文件,开发者可以清晰地看到界面的结构和组件的属性设置,从而更容易理解和修改界面布局。
一个hello world的默认布局如下:
其中的ConstraintLayout是ViewGroup类的对象。TextView是View的对象。
也可以通过Kotlin代码编写布局,实现一些动态修改布局的效果。但是这种方法使用的较少,因为无法剥离前后端代码。
4.常见的页面布局:
布局的通用属性:
(1)android:id 该布局的唯一标识。可在build/intermediates/runtime_symbol_list/debug/R.txt中找到id对应的int值
(2)android:layout_width
(3)android:layout_height
(4)android:background
(5)android:layout_margin
(6)android:padding
5.LinearLayout线性布局
在layout文件夹中创建新的layout资源文件:
6.RelativeLayout相对布局
相对布局中,每个控件会“相对于”另一个控件摆放。
7.Grid Layout网格布局
网格布局中,控件被放置在一个二维网格中。适用于展示“键盘”效果
(1)网格布局中,使用 android:columnCount 和 android:rowCount 属性来指定网格布局的列数和行数;
(2)子控件中,使用 android:layout_row 和 android:layout_column 属性为子视图指定行和列。(如果不指定这两个属性,就按照顺序排列)
(3)子控件中,使用 layout_columnWeight 和 layout_rowWeight 属性来确定每个控件所占的比重。例如如果一个2*2的网格布局中,所有控件的比重都为1,则将均分父控件。
(4)子控件中,使用 layout_columnSpan 和 layout_rowSpan 属性来确定每个控件所占的比重。
8.Frame Layout 帧布局
帧布局中,界面中放置单个子视图或多个子视图,并且可以通过堆叠的方式来显示它们。在帧布局中,后添加的视图会覆盖在先添加的视图之上。
帧布局的属性:
android:foreground
android:foregroundGravity
9.Constraint Layout 约束布局
约束布局使用约束(constraints)来定义视图之间的位置关系,而不依赖于视图的相对位置或者固定位置。这种方式使得布局更加灵活,可以适应不同屏幕尺寸和方向的变化