Android 工程结构 (以 HelloWorld 工程为例)

工程结构

Android 工程分为两个层次, 第一个层次是项目, 另一个层次是模块. 模块依附于项目, 每个项目至少有一个模块, 也能拥有多个模块.

一般所言的 "编译运行 App", 指的是运行某个模块, 而非运行某个项目, 因为模块才对应实际的 App.

image

Android 视图

当工程目录在 Android 视图下时, 工程下面有两个目录: app (代表app模块) 、Gradle Scripts.

image

app 下面有 3 个子目录, Gradle Scripts 下面主要是工程的编译配置文件.

image

image

manifests 子目录, 下面只有一个 XML 文件, 即 AndroidManifest.xml, 它是 App 的运行配置文件, 也是一个清单文件.

java 子目录, 下面有 3 个 com.example.myapp 包, 其中第一个包存放当前模块的 Java 源代码, 后面两个包存放测试用的 Java 代码.

res 子目录, 存放当前模块的资源文件. res 下面又有 4 个子目录:

  • drawable 目录存放图形描述文件与图片文件.

  • layout 目录存放 App 页面的布局文件.

  • mipmap 目录存放 App 的启动图标.

  • values 目录存放一些常量定义文件, 例如字符串常量 strings.xml、像素常量 dimens.xml、颜色常量 colors.xml、样式风格定义 styles.xml 等.

Gradle Scripts 下面主要是工程的编译配置文件, 主要有:

(1) build.gradle, 该文件分为项目级与模块级两种, 用于描述 App 工程的编译规则.

(2) proguard-rules.pro, 该文件用于描述 Java 代码的混淆规则.

(3) gradle.properties, 该文件用于配置编译工程的命令行参数, 一般无须改动.

(4) settings.gradle, 该文件配置了需要编译哪些模块. 初始内容为 include ':app', 表示只编译 app 模块.

(5) local.properties, 项目的本地配置文件, 它在工程编译时自动生成, 用于描述开发者电脑的环境配置, 包括 SDK 的本地路径、NDK 的本地路径等.

Gradle 是一个项目自动化构建工具, 帮我们做了依赖、打包、部署、发布、各种渠道的差异管理等工作.

APK 文件可以解压得到 class 文件. class 文件可以反编译看到源码.

gradle 在打包的时候, 要下载这些插件和库, 下面指定了从哪里去下载插件:

下面指定了从哪里去下载依赖:

下面指定了 Android SDK 的位置:

有 NDK 的话, 也可以在此处配置.

Project 视图

任何一个新建的项目都会默认使用 Android 模式的项目结构, 但这并不是项目真实的目录结构, 而是被 Android Studio 转换过的. 这种项目结构简洁明了, 适合进行快速开发. 点击图中的 Android 区域可以切换项目结构模式.

image

将项目结构模式切换成 Project 就是项目真实的目录结构了.

image

.gradle 和 .idea

这两个目录下放置的都是 Android Studio 自动生成的一些文件, 我们无须关心, 也不要去手动编辑.

image

app

项目中的代码、资源等内容都是放置在这个目录下的, 主要的开发工作也基本是在这个目录下进行的.

image

gradle

这个目录下包含了 gradle wrapper 的配置文件, 使用 gradle wrapper 的方式不需要提前将 gradle 下载好, 而是会自动根据本地的缓存情况决定是否需要联网下载 gradle.

Android Studio 默认就是启用 gradle wrapper 方式的, 如果需要更改成离线模式, 可以点击 Android Studio 导航栏 → File → Settings → Build, Execution, Deployment → Gradle, 进行配置更改.

image

.gitignore

这个文件是用来将指定的目录或文件排除在版本控制之外的.

build.gradle

这是项目全局的 gradle 构建脚本, 通常这个文件中的内容是不需要修改的.

gradle.properties

这个文件是全局的 gradle 配置文件, 在这里配置的属性将会影响到项目中所有的 gradle 编译脚本.

gradlew 和 gradlew.bat

这两个文件是用来在命令行界面中执行 gradle 命令的, 其中 gradlew 是在 Linux 或 Mac 系统中使用的, gradlew.bat 是在 Windows 系统中使用的.

.iml 文件

.iml 文件是所有 IntelliJ IDEA 项目都会自动生成的一个文件 (Android Studio 是基于 IntelliJ IDEA开发的), 用于标识这是一个 IntelliJ IDEA项目, 不需要修改这个文件中的任何内容.

local.properties

这个文件用于指定本机中的 Android SDK 路径, 通常内容是自动生成的, 并不需要修改. 除非本机中的 Android SDK 位置发生了变化, 那么就将这个文件中的路径改成新的位置即可.

settings.gradle

这个文件用于指定项目中所有引入的模块. 通常情况下, 模块的引入是自动完成的, 需要手动修改这个文件的场景可能比较少.

整个项目的外层目录结构中, 除了 app 和 chapter03 这些表示项目的目录之外, 大多数的文件和目录是自动生成的, 并不需要进行修改. app 这种表示项目的目录下的内容才是以后的工作重点.

app 目录内的结构

build

这个目录包含了一些在编译时自动生成的文件.

image

libs

如果项目中使用到了第三方 jar 包, 就需要把这些 jar 包都放在 libs 目录下, 放在这个目录下的 jar 包会被自动添加到项目的构建路径里.

image

androidTest

此处是用来编写 Android Test 测试用例的, 可以对项目进行一些自动化测试.

image

java

java 目录是放置所有 Java 代码的地方 (Kotlin 代码也放在这里), 展开该目录, 将看到系统自动生成了一个 MainActivity 文件.

image

res

在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下. 这个目录下还有很多子目录, 图片放在 drawable 目录下, 布局放在 layout 目录下, 字符串放在 values 目录下, 所以不用担心会把整个 res 目录弄得乱糟糟的.

image

所有以 "drawable" 开头的目录都是用来放图片的, 所有以 "mipmap" 开头的目录都是用来放应用图标的, 所有以 "values" 开头的目录都是用来放字符串、样式、颜色等配置的, 所有以 "layout" 开头的目录都是用来放布局文件的.

之所以有这么多 "mipmap" 开头的目录, 其实主要是为了让程序能够更好地兼容各种设备. drawable 目录也是相同的道理, 虽然 Android Studio 没有帮我们自动生成, 但是我们应该自己创建 drawable-hdpi、drawable-xhdpi、drawable-xxhdpi 等目录. 在制作程序的时候, 最好能够给同一张图片提供几个不同分辨率的版本, 分别放在这些目录下, 然后程序运行的时候, 会自动根据当前运行设备分辨率的高低选择加载哪个目录下的图片. 当然这只是理想情况, 更多的时候美工只会提供给我们一份图片, 这时你把所有图片都放在 drawable-xxhdpi 目录下就好了, 因为这是最主流的设备分辨率目录.

res/values/strings.xml 提供了字符串常量值:

image

该文件的内容为:

<resources>
<string name="app_name">MyApplication1</string>
</resources>

可以看到, 这里定义了一个应用程序名的字符串, 我们有以下两种方式来引用它.

  • 在代码中通过 R.string.app_name 可以获得该字符串的引用.

  • 在 XML 中通过 @string/app_name 可以获得该字符串的引用.

基本的语法就是上面这两种方式, 其中 string 部分是可以替换的, 如果引用的是图片资源就可以替换成 drawable, 如果引用的是应用图标就可以替换成 mipmap, 如果引用的是布局文件就可以替换成 layout, 以此类推.

AndroidManifest.xml

这是整个 Android 项目的配置文件, 在程序中定义的所有四大组件都需要在这个文件里注册, 另外还可以在这个文件中给应用程序添加权限声明.

image

该文件的内容为:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication1">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

项目的应用图标就是通过 android:icon 属性指定的, 应用的名称则是通过 android:label 属性指定的. 如果想要修改应用的图标或者名称, 就在这里修改.

image

这段代码表示对 MainActivity 进行注册, 没有在 AndroidManifest.xml 里注册的 Activity 是不能使用的.

其中 intent-filter 里的两行代码非常重要, <action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER" /> 表示 MainActivity 是这个项目的主 Activity, 在手机上点击应用图标, 首先启动的就是这个 Activity.

MainActivity 代码:

package com.example.myapplication1;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

首先可以看到, MainActivity 是继承自 AppCompatActivity 的. AppCompatActivity 是 AndroidX 中提供的一种向下兼容的 Activity, 可以使 Activity 在不同系统版本中的功能保持一致性. 而 Activity 类是 Android 系统提供的一个基类, 我们项目中所有自定义的 Activity 都必须继承它或者它的子类才能拥有 Activity 的特性 (AppCompatActivity 是 Activity 的子类) . 然后可以看到 MainActivity 中有一个 onCreate() 方法, 这个方法是一个 Activity 被创建时必定要执行的方法, 其中只有两行代码, 并且没有 Hello World! 的字样.

Android 程序的设计讲究逻辑和视图分离, 因此是不推荐在 Activity 中直接编写界面的. 一种更加通用的做法是, 在布局文件中编写界面, 然后在 Activity 中引入进来. 可以看到, 在 onCreate() 方法的第二行调用了 setContentView() 方法, 就是这个方法给当前的 Activity 引入了一个 activity_main 布局, Hello World! 的字样就是在这里定义的.

利用 XML 标记描绘应用界面, 使用 Java 代码书写程序逻辑. 把 App 的界面设计与代码逻辑分开的好处:

  • 使用 XML 文件描述 APP 界面, 可以很方便地在 Android Studio 上预览界面效果.

  • 一个界面布局可以被多处代码复用, 反过来, 一个 Java 代码也可能适配多个界面布局.

打开这个布局文件:

test

此处是用来编写 Unit Test 测试用例的, 是对项目进行自动化测试的另一种方式.

image

.gitignore

这个文件用于将 app 模块内指定的目录或文件排除在版本控制之外, 作用和外层的 .gitignore 文件类似.

build.gradle

这是 app 模块的 gradle 构建脚本, 这个文件中会指定很多项目构建相关的配置.

proguard-rules.pro

这个文件用于指定项目代码的混淆规则, 当代码开发完成后打包成安装包文件, 如果不希望代码被别人破解, 通常会将代码进行混淆, 从而让破解者难以阅读.

posted @   有空  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示

目录导航