安卓小米便签工程结构分析

目录

安卓小米便签工程结构分析

App下的子目录

[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 文件示例)

清单文件(AndroidManifest.xml)

[1 常见属性](#1 常见属性)

[2 清单文件示例](#2 清单文件示例)

Activity

结语


安卓小米便签工程结构分析

①App工程分为两个层次,第一个层次是项目 ,另外一个层次是模块

②模块依附于项目,每一个项目至少有一个模块,也可以拥有多个模块;

③一般我们说的"编译运行App",指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。

App下的子目录

1 manifests子目录

下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文件;

2 java子目录

存放当前模块的Java源代码

3 res子目录

存放当前模块的资源文件

在Android开发中,这些文件类型和目录主要用于组织和管理应用的资源和布局,它们各自有特定的功能和用途:

  1. color :这个目录用于存放颜色资源文件。颜色资源可以被应用中的不同部分(如布局、样式、主题等)引用,以保持应用视觉风格的一致性和易于维护性。颜色资源文件通常以.xml格式存储,其中可以定义多个颜色值,如背景色、文字色等。

  2. drawable :这个目录用于存放应用的图形资源文件,如图片、图标、按钮的形状 等。这些资源可以被应用的布局文件引用,用于显示在界面上。图形资源文件同样以.xml格式存储,可以包含多个尺寸的图片、不同状态下的图标等,以适应不同设备的屏幕密度和用户交互需求。

  3. layout :这个目录用于存放布局文件,即定义应用界面结构的XML文件。布局文件可以包含各种控件(如按钮、文本框、图像视图等),并定义它们的排列方式、大小、位置等。通过使用布局文件,开发者可以创建可重用的界面组件,提高代码的可维护性和可重用性。

  4. menu :这个目录用于存放菜单资源文件,即定义应用的上下文菜单、工具栏菜单等的XML文件。菜单资源可以被应用的不同部分引用,用于提供用户交互的选项。通过使用菜单资源,开发者可以创建可自定义的菜单界面,以满足不同的用户需求。

  5. raw :这个目录用于存放原始资源文件,如音频、视频、图片等原始数据文件。这些文件通常不经过Android系统解析,直接作为原始数据提供给应用使用,适用于存储不可解析的二进制数据。

  6. values :这个目录用于存放应用的资源值文件,如字符串、整数、布尔值 等。资源值文件通常以.xml格式存储,文件中定义了一系列资源值,这些值可以被应用中的不同部分引用。通过使用资源值文件,开发者可以创建可重用的、易于维护的资源集合,避免在代码中硬编码资源值。

  7. 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构建工具相关的配置文件,用于定义和管理项目的构建过程。以下是这些文件的详细解释:

  1. build.gradle (Project: Notes): 这是一个项目级别的构建脚本,用于定义整个项目的构建规则、依赖、任务等。在这个文件中,你可以配置项目的名称、版本、依赖库、构建类型(如debug或release)以及自定义的任务。

  2. build.gradle (Module :app): 这是一个模块级别的构建脚本,通常用于定义应用的特定构建规则。与项目级别的build.gradle相比,这个文件只对应用模块有效,可以在这里定义模块的依赖、配置特定的任务等。

  3. gradle.properties (Project Properties): 这个文件用于存储项目级别的属性,这些属性可以被多个构建脚本引用。例如,你可以在里面设置项目的默认JDK版本、Gradle的默认配置等。

  4. gradle-wrapper.properties (Gradle Version): 这个文件用于存储Gradle的版本信息和配置。Gradle Wrapper是一个用于简化Gradle安装和版本管理的工具,通过这个文件,Gradle可以自动下载并使用正确的版本进行构建。

  5. local.properties (SDk Location): 这个文件用于存储本地的SDK路径。在Android开发中,SDK包含了开发和调试所需的工具和库,通过这个文件,你可以指定SDK的存放位置,从而避免在构建过程中重复查找SDK路径。

  6. 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 文件示例

  1. **plugins:**引入插件

  2. **android:**包含了配置 Android 构建的所有信息,比如编译 SDK 版本、应用 ID、版本号、签名配置等。

  3. **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代码

相关推荐
檀越剑指大厂2 小时前
容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
android
MiyamuraMiyako3 小时前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel3 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥6 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走6 小时前
创建自定义语音录制View
android·前端
用户2018792831676 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831676 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker8 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong8 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil9 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin