目录
[1 manifests子目录](#1 manifests子目录)
[2 java子目录](#2 java子目录)
[3 res子目录](#3 res子目录)
[Gradle Scripts下的目录](#Gradle Scripts下的目录)
[1 Gradle Scripts简介](#1 Gradle Scripts简介)
[2 什么是Gradle](#2 什么是Gradle)
[3 App下的 build.gradle 文件示例](#3 App下的 build.gradle 文件示例)
[1 常见属性](#1 常见属性)
[2 清单文件示例](#2 清单文件示例)
安卓小米便签工程结构分析
①App工程分为两个层次,第一个层次是项目 ,另外一个层次是模块;
②模块依附于项目,每一个项目至少有一个模块,也可以拥有多个模块;
③一般我们说的"编译运行App",指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。
App下的子目录
1 manifests子目录
下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文件;
2 java子目录
存放当前模块的Java源代码
3 res子目录
存放当前模块的资源文件
在Android开发中,这些文件类型和目录主要用于组织和管理应用的资源和布局,它们各自有特定的功能和用途:
color :这个目录用于存放颜色资源文件。颜色资源可以被应用中的不同部分(如布局、样式、主题等)引用,以保持应用视觉风格的一致性和易于维护性。颜色资源文件通常以
.xml
格式存储,其中可以定义多个颜色值,如背景色、文字色等。drawable :这个目录用于存放应用的图形资源文件,如图片、图标、按钮的形状 等。这些资源可以被应用的布局文件引用,用于显示在界面上。图形资源文件同样以
.xml
格式存储,可以包含多个尺寸的图片、不同状态下的图标等,以适应不同设备的屏幕密度和用户交互需求。layout :这个目录用于存放布局文件,即定义应用界面结构的XML文件。布局文件可以包含各种控件(如按钮、文本框、图像视图等),并定义它们的排列方式、大小、位置等。通过使用布局文件,开发者可以创建可重用的界面组件,提高代码的可维护性和可重用性。
menu :这个目录用于存放菜单资源文件,即定义应用的上下文菜单、工具栏菜单等的XML文件。菜单资源可以被应用的不同部分引用,用于提供用户交互的选项。通过使用菜单资源,开发者可以创建可自定义的菜单界面,以满足不同的用户需求。
raw :这个目录用于存放原始资源文件,如音频、视频、图片等原始数据文件。这些文件通常不经过Android系统解析,直接作为原始数据提供给应用使用,适用于存储不可解析的二进制数据。
values :这个目录用于存放应用的资源值文件,如字符串、整数、布尔值 等。资源值文件通常以
.xml
格式存储,文件中定义了一系列资源值,这些值可以被应用中的不同部分引用。通过使用资源值文件,开发者可以创建可重用的、易于维护的资源集合,避免在代码中硬编码资源值。xml :这是一个通用的文件扩展名,用于表示XML格式的文件。在Android开发中,除了上述特定目录下的
.xml
文件,还有其他类型的.xml
文件,如配置文件、资源描述文件等,用于定义应用的特定配置或描述资源信息。这些文件类型和目录共同构成了Android应用的资源系统,使得开发者能够创建功能丰富、界面美观、易于维护和扩展的应用程序。
Gradle Scripts下的目录
1 Gradle Scripts简介
Gradle Scripts下面主要是工程的编译配置文件,主要有:
① build.gradle:App工程的编译配置文件,该文件分为项目级别与模块级别两种,用于描述App工程的编译规则;
(工程级别是全局的配置,模块的配置就只影响App的模块)
② proguard-rules.pro:该文件用于Java代码的混淆规则;
(因为APK可以解压,通过反编译可以看到源码,故需要混淆)
③ gradle.properties:该文件用于配置编译工程的命令行参数,一般无需改动;
④ settings.gradle:该文件配置了需要编译哪些模块。初始内容为include ':app',表示只编译app模块;
⑤ local.properties:本地项目的配置文件,它在工程编译时自动生成,用于描述开发者电脑的环境配置,包括SDK的本地路径、NDK的本地路径等。
这些文件都是与Gradle构建工具相关的配置文件,用于定义和管理项目的构建过程。以下是这些文件的详细解释:
build.gradle (Project: Notes): 这是一个项目级别的构建脚本,用于定义整个项目的构建规则、依赖、任务等。在这个文件中,你可以配置项目的名称、版本、依赖库、构建类型(如debug或release)以及自定义的任务。
build.gradle (Module :app): 这是一个模块级别的构建脚本,通常用于定义应用的特定构建规则。与项目级别的build.gradle相比,这个文件只对应用模块有效,可以在这里定义模块的依赖、配置特定的任务等。
gradle.properties (Project Properties): 这个文件用于存储项目级别的属性,这些属性可以被多个构建脚本引用。例如,你可以在里面设置项目的默认JDK版本、Gradle的默认配置等。
gradle-wrapper.properties (Gradle Version): 这个文件用于存储Gradle的版本信息和配置。Gradle Wrapper是一个用于简化Gradle安装和版本管理的工具,通过这个文件,Gradle可以自动下载并使用正确的版本进行构建。
local.properties (SDk Location): 这个文件用于存储本地的SDK路径。在Android开发中,SDK包含了开发和调试所需的工具和库,通过这个文件,你可以指定SDK的存放位置,从而避免在构建过程中重复查找SDK路径。
settings.gradle (Project Settings): 这是一个项目级别的配置文件,用于定义项目中所有模块的构建规则和依赖关系。在这个文件中,你可以配置模块的依赖、全局的构建规则、默认的构建类型等。通过这个文件,你可以统一管理项目的构建设置,而不需要在每个模块的build.gradle文件中重复配置。
这些文件共同作用,使得Gradle能够高效、灵活地构建和管理复杂的项目结构。
2 什么是Gradle
Gradle 是一个项目自动化构建工具,帮助我们做依赖、打包、部署、发布、各种渠道的差异管理等工作。
我们要把整个拥有这么多代码的工程发布运行,最终是要打包为APK文件才能发布,那么多代码要APK打包,以及源代码的编译,这一系列的过程全由Gradle来完成。(类似Java Web编程中的 Maven )
注意:
① Gradle工具的版本配置在gradle\wrapper\gradle-wrapper.properties;
(也可以在File->Project Structure -> Project,在设置界面中修改Gradle Version)
② 不同版本的Android Studio都有对应版本的Gradle版本,当两者版本匹配时,才可运行成功。
3 App下的 build.gradle 文件示例
**plugins:**引入插件
**android:**包含了配置 Android 构建的所有信息,比如编译 SDK 版本、应用 ID、版本号、签名配置等。
**dependencies:**用于声明该模块所依赖的其他库和模块。可以包括编译时依赖、运行时依赖、测试依赖等。
javascript
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// 顶级构建文件,在这里可以添加适用于所有子项目/模块的通用配置选项。
buildscript {
// 定义构建脚本依赖项的仓库
repositories {
google() // 添加 Google 仓库,用于获取 Android 构建工具
jcenter() // 添加 JCenter 仓库,用于获取其他依赖项
}
// 添加 Gradle 插件的依赖项
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2' // 指定使用 Android 构建工具的版本
}
}
// 定义扩展属性
ext {
// 设置默认的目标 SDK 版本
defaultTargetSdkVersion = 21
}
// 应用到所有子项目
allprojects {
// 定义所有子项目共用的仓库
repositories {
google() // 添加 Google 仓库
jcenter() // 添加 JCenter 仓库
}
}
清单文件(AndroidManifest.xml)
每个应用的根目录都必须包含一个AndroidManifest.xml,并且文件名必须固定这样 ,不可修改。这个文件包含了App的配置信息,系统需要工具里面的内容运行App的代码,显示界面。
1 常见属性
① android:allowBackup : 是否允许备份;
② android:icon :指定App在手机屏幕上显示的图片;
③ android:label :指定App在手机屏幕上显示的名称;
④ android:roundIcon :指定App的圆角图标;
⑤ android:supportsRtl :是否支持阿拉伯语 / 波斯语这种从右到左的文字排列顺序;
⑥ android:theme :指定App的显示风格。
application 后面部分还有 activity 节点,这是活动页面的注册声明。只有在AndroidManifest.xml 中正确配置activity节点,才可在运行时访问对应的活动页面。初始配置的 MainActivity 是App的默认主页,因为其 activity 节点内部配置了如下过滤信息。
java
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
action 节点中设置的 android.intent.action.MAIN 表示该页面是App的入口页面,启动App时会先打开该页面。category 节点设置的 android.intent.category.LAUNCHER 决定了是否在手机屏幕上显示App图标。
2 清单文件示例
XML
<?xml version="1.0" encoding="utf-8"?><!-- 版权声明:该文件属于MiCode开源社区(www.micode.net) -->
<!-- 许可协议:Apache 2.0,详情参见http://www.apache.org/licenses/LICENSE-2.0 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="net.micode.notes"
android:versionCode="1"
android:versionName="0.1">
<!-- 使用的SDK版本 -->
<uses-sdk android:minSdkVersion="14" />
<!-- 应用需要的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 应用程序定义 -->
<application
android:icon="@drawable/icon_app"
android:label="@string/app_name">
<!-- 主Activity,启动器 -->
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 编辑笔记的Activity -->
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/NoteTheme">
<!-- 处理外部HTTP链接和编辑意图 -->
<intent-filter
android:scheme="http"
tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<!-- 处理插入或编辑意图 -->
<intent-filter>
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<!-- 处理搜索意图 -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- 搜索配置 -->
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<!-- 提供者:用于管理笔记数据 -->
<provider
android:name="net.micode.notes.data.NotesProvider"
android:authorities="micode_notes"
android:multiprocess="true" />
<!-- 小部件提供者:2x2尺寸 -->
<receiver
android:name=".widget.NoteWidgetProvider_2x"
android:label="@string/app_widget2x2">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_2x_info" />
</receiver>
<!-- 小部件提供者:4x4尺寸 -->
<receiver
android:name=".widget.NoteWidgetProvider_4x"
android:label="@string/app_widget4x4">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<!-- 启动完成时初始化闹钟 -->
<receiver android:name=".ui.AlarmInitReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- 闹钟接收器:运行在远程进程中 -->
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
android:process=":remote"></receiver>
<!-- 闹钟提醒Activity -->
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar"></activity>
<!-- 设置Activity -->
<activity
android:name="net.micode.notes.ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Holo.Light"></activity>
<!-- 任务同步服务 -->
<service
android:name="net.micode.notes.gtask.remote.GTaskSyncService"
android:exported="false"></service>
<!-- 默认搜索设置 -->
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
</application>
</manifest>
Activity
Activity 是一个应用程序的组件,提供一个屏幕,可以用来与用户交互,完成某项任务。(即包含可执行操作的界面。)
结语
下一篇开始解读JAVA代码