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

目录

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

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代码

相关推荐
众拾达人3 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌3 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
_Shirley5 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
hedalei6 小时前
RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题
android·android14·rk3576
锋风Fengfeng7 小时前
安卓多渠道apk配置不同签名
android
枫_feng7 小时前
AOSP开发环境配置
android·安卓
叶羽西7 小时前
Android Studio打开一个外部的Android app程序
android·ide·android studio
qq_171538859 小时前
利用Spring Cloud Gateway Predicate优化微服务路由策略
android·javascript·微服务
Vincent(朱志强)10 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
mmsx11 小时前
android 登录界面编写
android·登录界面