Android App开发基础(2)—— App的工程结构

本专栏文章
上一篇
Android开发修炼之路——(一)Android App开发基础-1

2 App的工程结构

本节介绍App工程的基本结构及其常用配置,首先描述项目和模块的区别,以及工程内部各目录与配置文件的用途说明;其次阐述两种级别的编译配置文件build.gradle,以及它们内部的配置信息说明;再次讲述运行配置文件AndroidManifest.xml的节点信息及其属性说明。

2.1 App工程目录结构

App工程分为两个层次,第一个层次是项目,依次选择菜单File→New→New Project即可创建新项目。另一个层次是模块,模块依附于项目,每个项目至少有一个模块,也能拥有多个模块,依次选择菜单File→New→New Module即可在当前项目创建新模块。
一般所言的“编译运行App”,指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。单击Android Studio左上角竖排的Project标签,可见App工程的项目结构如图所示。
在这里插入图片描述
从图中看到,该项目下面有两个分类:一个是app(代表app模块);另一个是Gradle Scripts。其
中,app下面又有3个子目录,其功能说明如下:
(1)manifests子目录,下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文
件。
(2)java子目录,下面有3个com.example.myapp包,其中第一个包存放当前模块的Java源代码,后面两个包存放测试用的Java代码。
(3)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的本地路径等。

2.2 编译配置文件build.gradle

新创建的App项目默认有两个build.gradle,一个是Project项目级别的build.gradle;另一个是Module模块级别的build.gradle。
项目级别的build.gradle指定了当前项目的总体编译规则,打开该文件在buildscript下面找到
repositories和dependencies两个节点,其中repositories节点用于设置Android Studio插件的网络仓库地址,而dependencies节点用于设置gradle插件的版本号
。由于官方的谷歌仓库位于国外,下载速度相对较慢,因此可在repositories节点添加阿里云的仓库地址,方便国内开发者下载相关插件。修改之后的buildscript节点内容如下所示

buildscript {repositories {// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'https://maven.aliyun.com/repository/google'}maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}maven { url 'https://maven.aliyun.com/repository/public'}google()jcenter()}dependencies {// 配置gradle插件版本,下面的版本号就是Android Studio的版本号classpath 'com.android.tools.build:gradle:4.1.0'}
}

模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则。下面给模块的build.gradle补充文字注释,方便读者更好地理解每个参数的用途。

plugins {id("com.android.application")
}android {namespace = "com.example.myapplication"  // 设置Android命名空间compileSdk = 34  // 设置编译使用的SDK版本defaultConfig {applicationId = "com.example.myapplication"  // 设置应用的包名minSdk = 24  // 设置应用的最低支持版本targetSdk = 34  // 设置应用的目标支持版本versionCode = 1  // 设置应用的版本号(用于标识版本)versionName = "1.0"  // 设置应用的版本名称testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"  // 设置测试用例的运行器}buildTypes {release {isMinifyEnabled = false  // 禁用混淆proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")  // 配置混淆规则}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8  // 指定源代码兼容的Java版本targetCompatibility = JavaVersion.VERSION_1_8  // 指定目标代码兼容的Java版本}
}dependencies {implementation("androidx.appcompat:appcompat:1.6.1")  // 依赖AppCompatActivity和主题implementation("com.google.android.material:material:1.9.0")  // 依赖Material Design组件implementation("androidx.constraintlayout:constraintlayout:2.1.4")  // 依赖ConstraintLayout布局组件testImplementation("junit:junit:4.13.2")  // 用于单元测试,依赖JUnit框架androidTestImplementation("androidx.test.ext:junit:1.1.5")  // 用于Android单元测试,依赖JUnit扩展库androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")  // 用于Android单元测试,依赖Espresso测试框架
}

为啥这两种编译配置文件的扩展名都是Gradle呢?这是因为它们采用了Gradle工具完成编译构建操作。Gradle工具的版本配置在gradle\wrapper\gradle-wrapper.properties,也可以依次选择菜单
File→Project Structure→Project,在弹出的设置页面中修改Gradle Version。注意每个版本的Android Studio都有对应的Gradle版本,只有二者的版本正确对应,App工程才能成功编译。比如Android Studio 4.1对应的Gradle版本为6.5,更多的版本对应关系见https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin。

2.3 运行配置文件AndroidManifest.xml

AndroidManifest.xml指定了App的运行配置信息,它是一个XML描述文件,初始内容如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个AndroidManifest.xml文件,用于描述应用程序的基本属性和配置信息 --><manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><!-- 应用程序元素,用于定义应用程序的基本属性 --><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"tools:targetApi="31"><!-- Activity元素,用于定义应用程序中的一个Activity组件 --><activityandroid:name=".MainActivity"android:exported="true"><!-- Intent过滤器元素,用于定义Activity能够响应的Intent过滤条件 --><intent-filter><action android:name="android.intent.action.MAIN" /><!-- 类别元素,用于指定Intent的类别 --><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

可见AndroidManifest.xml的根节点为manifest,它的package属性指定了该App的包名。manifest下面有个application节点,它的各属性说明如下:

  • android:allowBackup,是否允许应用备份。允许用户备份系统应用和第三方应用的apk安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复。为true表示允许,为false则表示不允许。
  • android:icon,指定App在手机屏幕上显示的图标。
  • android:label,指定App在手机屏幕上显示的名称。 android:roundIcon,指定App的圆角图标。
  • android:supportsRtl,是否支持阿拉伯语/波斯语这种从右往左的文字排列顺序。为true表示支持,为false则表示不支持。 android:theme,指定App的显示风格。

注意到application下面还有个activity节点,它是活动页面的注册声明,只有在AndroidManifest.xml中正确配置了activity节点,才能在运行时访问对应的活动页面。初始配置的MainActivity正是App的默认主页,之所以说该页面是App主页,是因为它的activity节点内部还配置了以下的过滤信息:

<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图标如果同时有两个activity节点内部都设置了
android.intent.category.LAUNCHER,那么桌面就会显示两个App图标
。以上的两种节点规则可能一开始不太好理解,读者只需记住默认主页必须同时配置这两种过滤规则即可。

本笔记参考于[B站动脑学院],仅作学习用途,方便随时查看。 参考资料:2022 最新 Android 基础教程,从开发入门到项目实战,看它就够了,更新中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

THM学习笔记——OSI模型和TCP/IP模型

全是文字 比较枯燥 建议视频 OSI模型由七个层次组成&#xff1a; 第7层 -- 应用层&#xff1a; OSI模型的应用层主要为在计算机上运行的程序提供网络选项。它几乎专门与应用程序一起工作&#xff0c;为它们提供一个界面以用于传输数据。当数据传递到应用层时&#xff0c;它…

【医学图像隐私保护】联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习&#xff1a;密码学 机器学习 分布式 提出背景&#xff1a;数据不出本地&#xff0c;又能合力干大事联邦学习的问题 分布式机器学习&#xff1a;解决大数据量处理的问题横向联邦学习&#xff1a;解决跨多个数据源学习的问题纵向联邦学习&#xff1a;解决数据分散在多…

【grafana】使用教程

【grafana】使用教程 一、简介二、下载及安装及配置三、基本概念3.1 数据源&#xff08;Data Source&#xff09;3.2 仪表盘&#xff08;Dashboard&#xff09;3.3 Panel&#xff08;面板&#xff09;3.4 ROW&#xff08;行&#xff09;3.5 共享及自定义 四、常用可视化示例4.1…

湿法蚀刻酸洗槽—— 应用半导体新能源光伏光电行业

PFA清洗槽又被称为防腐蚀槽、酸洗槽、溢流槽、纯水槽、浸泡槽、水箱、滴流槽&#xff0c;是四氟清洗桶后的升级款&#xff0c;是为半导体光伏光电等行业设计&#xff0c;一体成型&#xff0c;无需担心漏液。主要用于浸泡、清洗带芯片硅片电池片的花篮。 由于PFA的特点它能耐受…

【linux-虚拟化】 SR-IOV技术

文章目录 参考1. 什么是 SR-IOV?1.2. 将 SR-IOV 网络设备附加到虚拟机1.3. SR-IOV 分配支持的设备 参考 管理 SR-IOV 设备 1. 什么是 SR-IOV? 单根 I/O 虚拟化(SR-IOV)是一种规范&#xff0c;它允许单个 PCI Express(PCIe)设备向主机系统呈现多个独立的 PCI 设备&#xff…

QT获取本机网络信息

QT获取本机网络信息 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void getinform…

视频智能分析:冶炼/冶金工厂视频智能监管方案的设计和应用

一、背景与需求 随着工业4.0的推进&#xff0c;冶金行业正面临着转型升级的压力。为了提高生产效率、降低能耗、保障安全&#xff0c;冶金智能工厂视频监管方案应运而生。该方案通过高清摄像头、智能分析技术、大数据处理等手段&#xff0c;对工厂进行全方位、实时监控&#x…

k8s的安全机制

k8s的安全机制。分布式集群管理工具&#xff0c;就是容器编排 安全机制的核心&#xff1a;APIserver作为整个内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕API server来进行设计 请求API资源&#xff1a; 1、认证 2、鉴权 3、准入机制 …

如何使用WinSCP公网远程访问本地CentOS服务器编辑上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

大创项目推荐 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

Mediasoup Demo-v3笔记(五)——Mediasoup 的启动

Mediasoup是由两部分组成的&#xff0c;一部分是js的控制模块&#xff0c;一部分是c的传输模块&#xff0c;在这里我们用mediasoup demo的代码开始&#xff0c;分析整个进程的启动过程 1、在mediasoup-demo-3的server.js中&#xff0c;调用启动方法 mediasoup-demo-3是一个dem…

Zoomit 安装与使用

Zoomit 安装与使用 1&#xff09;工具介绍 ZoomIt 是一款非常实用的投影演示辅助软件 ZoomIt 是一种在所有 Windows 设备上运行的工作的注释和缩放工具 2&#xff09;下载地址 地址&#xff1a;https://zoomit.en.softonic.com/ 3&#xff09;安装教程 第一步 第二步 …

国外服务器全攻略,国外服务器的特点和优势是什么?

随着互联网的快速发展&#xff0c;越来越多的企业和个人选择将网站、应用程序等部署在国外服务器上。那么&#xff0c;国外服务器有哪些特点和优势呢&#xff1f;本文将对这一问题进行详细探讨。 一、国外服务器的特点 1.全球化的网络连接&#xff1a;国外服务器通常拥有全球化…

ThreeJS官方示例

1 月球绕地球旋转 材质贴图的颜色显示可能和原图看起来不一致&#xff0c;需要设置色彩空间&#xff1a; 线性色彩空间&#xff08;LinearSRGBColorSpace&#xff09;&#xff1a;根据光照强度均匀分布sRGB色彩空间&#xff08;SRGBColorSpace&#xff09;&#xff1a;根据人…

svn和git的本质区别是什么

参考&#xff1a; https://blog.csdn.net/feiying0canglang/article/details/126550676 上边图中&#xff0c;跨越了区的箭头&#xff0c;它中间的区数据都会同步。例如&#xff1a;git checkout &#xff0c;它是将本地仓库数据更新到暂存区和工作区的。\ 理解 gitlab和svn都…

计算机网络的体系结构的各层在整个过程中起到什么作用?

ps&#xff1a;本文章的图片内容来源都是来自于湖科大教书匠的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1.6 计算机网络体系结构&#xff08;4&#xff09;—专用术语_哔哩哔哩_bilibili 目录 &#x…

Springboot项目启动报错:Command line is too long问题解决

启动项目报错:Error running ‘xxxxxxxx’: Command line is too long. Shorten command line for ‘xxxxxxxx’ or also for Application default configuration 方法一 点击提示中的&#xff1a;default&#xff1a;然后在弹出窗口中选择&#xff1a;JAR xxxx xxx&#xff0…

DataKit迁移MySQL到openGauss

前言 本文将分享DataKit迁移MySQL到openGauss的项目实战&#xff0c;供广大openGauss爱好者参考。 1. 下载操作系统 https://www.openeuler.org/zh/download https://support.huawei.com/enterprise/zh/doc/EDOC1100332931/1a643956 https://support.huawei.com/enterprise…

JOSEF约瑟 静态中间继电器 RZY-600D 110VDC 六常开 导轨安装

RZ-D系列中间继电器 系列型号&#xff1a; RZY-004D中间继电器 RZL-004D中间继电器 RZY-022D中间继电器 RZL-022D中间继电器 RZY-112D中间继电器 RZL-112D中间继电器 RZY-202D中间继电器 RZL-202D中间继电器 RZY-002D中间继电器 RZL-002D中间继电器 RZY-060D中间继电器 RZL-060…

从CNN ,LSTM 到Transformer的综述

前情提要&#xff1a;文本大量参照了以下的博客&#xff0c;本文创作的初衷是为了分享博主自己的学习和理解。对于刚开始接触NLP的同学来说&#xff0c;可以结合唐宇迪老师的B站视频【【NLP精华版教程】强推&#xff01;不愧是的最完整的NLP教程和学习路线图从原理构成开始学&a…