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

news2024/11/15 19:40:32

本专栏文章
上一篇
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">

    <!-- 应用程序元素,用于定义应用程序的基本属性 -->
    <application
        android: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组件 -->
        <activity
            android: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图标
。以上的两种节点规则可能一开始不太好理解,读者只需记住默认主页必须同时配置这两种过滤规则即可。

本章节其他文章
Android App开发基础(1)—— App的开发特点
Android App开发基础(2)—— App的工程结构
Android App开发基础(3)—— App的设计规范

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

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

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

相关文章

状态码400以及状态码415

首先检查前端传递的参数是放在header里边还是放在body里边。 此图前端传参post请求&#xff0c;定义为’Content-Type’&#xff1a;‘application/x-www-form-urlencoded’ 此刻他的参数在FormData中。看下图 后端接参数应为&#xff08;此刻参数前边什么都不加默认为requestP…

仅4步,彻底玩转如何在Word中插入页脚数字

Word中首页无需添加数字&#xff0c;从第二页开始添加数字。 Step 1&#xff1a;如下图&#xff0c;将内容设定为如下&#xff0c;“首页不同”一定要选中&#xff1b; Step 2&#xff1a;选择工具栏中的“页码”&#xff1b; Step 3&#xff1a;接下来选择“页码”下的“设置…

防火墙知识普及详解,使用TOR Router把TOR作为默认网关,增加隐私/匿名性

防火墙知识普及详解,使用TOR Router把TOR作为默认网关,增加隐私/匿名性。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使用该工具造成的损失,和本人及开发者…

2024 年, Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

数据分析-28-小红书消费情况分析(包含代码和数据)

文章目录 0. 代码数据下载1. 项目介绍2. 数据说明3. 分析目的1. 提出问题&#xff1a;哪些消费群体更庞大&#xff0c;平均购买力更强&#xff1f;已知自变量能否准确预测用户购买金额&#xff1f;a. 数据导入b. 去除重复数值和缺失数值c. 简化部分columns的命名&#xff0c; 方…

15EG使用vivado2021.1实现LWIP的网络传输

创建工程模板在hello_world中已经介绍过了&#xff0c;这里直接从配置完zynq ip核开始&#xff0c;由于使用vivado的版本不同&#xff0c;配置ZYNQ时需要用到的tcl文件我会放在工程文件夹下的file文件夹中 配置好IP核后&#xff0c;右键设计模块&#xff0c;点击Generate Outpu…

实际项目中的SpringAOP实现日志打印

目录 一、AOP实现日志 1.1 需求分析&#xff1a; 1.2 定义切面类和切点&#xff1a; 扩展&#xff1a;finally中的代码块一定会执行吗&#xff1f; 扩展 总结 1.3 定义环绕通知 1.4 handleBefore 的具体实现 1.4.1 获取url 1.4.2 获取接口描述信息 1.4.3 后续获取 1.5…

【美赛获奖必看】史上最强最全美赛论文模板,word+latex

大家好呀&#xff0c;现在是1.30日&#xff0c;距离2024美赛只有短短两天时间啦&#xff0c;众所周知&#xff0c;美赛对于论文排版是非常看重的&#xff0c;一个好的论文排版往往可以起到事半功倍的效果&#xff0c;而如果论文不美观&#xff0c;即便建模求解等都不错&#xf…

u盘文件防止拷贝的方法

在企业的日常运营中&#xff0c;U盘作为一种常用的移动存储设备&#xff0c;常常被用于数据的传输和备份。然而&#xff0c;U盘的不当使用也可能导致企业数据的泄露&#xff0c;给企业带来巨大的风险。 为了保护企业数据的安全&#xff0c;使用域智盾等软件工具进行U盘文件防拷…

【优选算法系列】【专题三二分查找】第二节.852. 山脉数组的峰顶索引和162. 寻找峰值

文章目录 前言一、山脉数组的峰顶索引 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、寻找峰值 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

【Coding】寒假每日一题Day.8. 超级胶水

题目来源 题目来自于AcWing平台&#xff1a;https://www.acwing.com/problem/content/2871/。 以blog的形式记录程序设计算法学习的过程&#xff0c;仅做学习记录之用。 题目描述 输入输出格式 范围 样例 思路 思路参考自闫总的视频题解。 与区间合并不同&#xff0c;此处…

为爱穿针 用冬日针爱温暖孩子——Home尧泰汉海慈善专项基金“益起暖冬”公益行动圆满结束

2024年1月15日&#xff0c;Home尧泰汉海四季有爱•益路向阳之“益起暖冬”公益行动圆满结束&#xff0c;本次公益活动由重庆市慈善总会、Home尧泰汉海慈善专项基金、重庆市渝中区红樱桃义工协会主办。 千丝万缕汇针爱 五湖四海显温情 用公益的针线编织爱的温暖 让孩子的冬日沐…

字符串转码-第11届蓝桥杯国赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第35讲。 字符串转码&#…

PawSQL更新 | 新增18个SQL性能审核重写规则

PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个&#xff0c;整体的规则数目达到了83个&#xff0c;覆盖了正确性&#xff0c;安全性、可维护性、性能四个方面的SQL质量问题&#xff0c;并提供了优化建议&#xff0c;已经形成比较完善的针对数据操作的SQL质量审查…

动态规划之买卖股票问题(篇三)(买卖股票的最佳时机)

本篇博客主要讲解309.最佳买卖股票时机含冷冻期和714.买卖股票的最佳时机含手续费&#xff0c;这也是股票系列的最后一篇讲解。 309.最佳买卖股票时机含冷冻期 题目&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算…

SpringBoot---创建项目

介绍 此项目SpringBoot使用的是2.6.1版本&#xff0c;由于这个项目使用的是maven聚合方式创建的&#xff0c;所以第二步是我在聚合方式下需要添加的依赖&#xff0c;完整的pom.xml内容放到了最下面。 第一步&#xff1a;创建Maven项目 这个里什么也不勾选&#xff0c;直接点…

<网络安全>《9 入侵防御系统IPS》

1 概念 IPS&#xff08; Intrusion Prevention System&#xff09;是电脑网络安全设施&#xff0c;是对防病毒软件&#xff08;Antivirus Programs&#xff09;和防火墙&#xff08;Packet Filter, Application Gateway&#xff09;的补充。 入侵预防系统&#xff08;Intrusio…

PMP成绩查询及电子版证书下载

PMP项目管理--学习专栏https://blog.csdn.net/xmws_it/category_10954848.html?spm1001.2014.3001.5482 2023年11月25日PMP考试成绩今日凌晨开始发布&#xff0c;按照往年的情况&#xff0c;成绩都是分批出的&#xff0c;如果暂时没查到成绩的同学请耐心等待&#xff0c;预计…

【webrtc】m98 : vs2019 直接构建webrtc及moduletest工程 2

字数有限制,我们继续 【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1modules_unittests 构建 Build started... 1>------ Build started: Project: modules_unittests, Configuration: GN Win32 ------ 1>ninja: Entering directory `G:\CDN\rtcCli\m98\src\o…

Git怎样用?(下载到本地,和在本地初始化)

全局设置&#xff1a; 点击第二个 输入&#xff1a; 例如&#xff1b;邮箱是随意地 git config --global user.name "名字" git config --global user.email "邮箱" 获取git仓库 本地初始化&#xff1a; 创建仓库 右键第二个 输入 git init 克隆&#…