Android开发修炼之路——(一)Android App开发基础-2

本专栏文章
上一篇
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图标
。以上的两种节点规则可能一开始不太好理解,读者只需记住默认主页必须同时配置这两种过滤规则即可。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BabylonJS 6.0文档 Deep Dive 摄像机(六):遮罩层和多相机纹理

1. 使用遮罩层来处理多个摄影机和多网格物体 LayerMask是分配给每个网格&#xff08;Mesh&#xff09;和摄像机&#xff08;Camera&#xff09;的一个数。它用于位&#xff08;bit&#xff09;级别用来指示灯光和摄影机是否应照射或显示网格物体。默认值为0x0FFFFFFF&#xff…

SpringBoot使用druid

SpringBoot使用druid 一、前言二、配置1、pom依赖2、配置文件yml3、配置类 一、前言 Java程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C…

【wink】草稿损坏如何恢复?

为节省储存空间&#xff0c;我们不会缓存您的原始视频。 原视频被删除或上传云盘后&#xff0c;可能会由于读取不到原视频而提示草稿损坏。 草稿损坏后&#xff0c;您可以尝试以下方法进行恢复&#xff1a; 从相册「最近删除」中恢复原视频&#xff1b;从云盘中下载原视频&…

单元测试——题目十二

目录 题目要求: 定义类 测试类 题目要求: 根据下列流程图编写程序实现相应处理,执行j=10*x-y返回文字“j1=:”和计算值,执行j=(x-y)*(10⁵%7)返回文字“j2=:”和计算值,执行j=y*log(x+10)返回文字“j3=:”和计算值。 编写程序代码,使用JUnit框架编写测试类对编写的…

力扣646. 最长数对链

动态规划 思路&#xff1a; 思路与 力扣354. 俄罗斯套娃信封问题 类似将序列进行排序&#xff0c;然后假设 dp[i] 为第 i 个元素的最长数对链个数&#xff1b;则其状态转移方程&#xff1a; 第 i 个元素之前的某一个元素&#xff08;假设是下标是 j&#xff09;&#xff0c;如…

残留扭矩测量方法有哪些——SunTorque智能扭矩系统

残留扭矩是指在设备或机器的转动部分停机后仍然存在的扭矩&#xff0c;通常是由于摩擦力、粘性阻力等因素引起的。残留扭矩测量是设备维护和故障诊断的重要环节&#xff0c;SunTorque智能扭矩系统一起和大家学习了解几种常见的残留扭矩测量方法。 suntoruqe智能扭矩系统 静态扭…

C++技术要点总结, 面试必备, 收藏起来慢慢看

目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题&#xff1f; 2.6. 内存对齐 2.7. 什么是内存泄露 …

Tomcat运维

目录 一、Tomcat简介 二、系统环境说明 1、关闭防火墙&#xff0c;selinux 2、安装JDK 3、安装Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍&#xff08;conf&#xff09; 4、Tomcat的管理 四、Tomcat 配置管理页面(了解) …

【Linux】从新认识Linux 服务(Service)

文章目录 Linux中service的概念Linux中常见的service常见的服务管理方式Linux中列出serviceLinux中service的特点推荐阅读 Linux中service的概念 在Linux操作系统中&#xff0c;服务&#xff08;Service&#xff09;是一个基本概念&#xff0c;它通常指的是运行在后台的、持续…

Vue自定义成功弹窗H5实现类似于小程序的效果

效果图: <div class="father"><div class="success-box" v-if="isSuccess"><img src="../../assets/insure/success-logo.png" alt=""><span>{{ successTitle }}</span></div> </d…

Go、容器以及Linux调度器

在容器中运行Go应用程序时&#xff0c;需要设置合理的GOMAXPROCS&#xff0c;从而避免调度中因为资源不足而造成STW。原文: Go, Containers, and the Linux Scheduler Go开发的应用程序通常部署在容器中。在容器中运行时&#xff0c;重要的一点是要设置CPU限制以确保容器不会耗…

Linux基础指令【下篇】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.时间指令----date1…

【EI会议征稿】第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024)

第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024) The 3rd International Conference on Bigdata Blockchain and Economy Management 第三届大数据、区块链与经济管理国际学术会议(ICBBEM 2024)&#xff0c;将于2024年3月22-24日在中国南昌召开。大会由江西科技师…

SpringBoot01

一、SpringBoot项目中常见的依赖 1.1、spring-boot-starter-parent 这个是SpringBoot项目必须导入的依赖,这个父模块内部定义了springboot整合各个技术的依赖版本,降低版本的冲突。 <parent><artifactId>spring-boot-starter-parent</artifactId><group…

[git] windows系统安装git教程和配置

一、何为Git Git(读音为/gɪt/)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 二、git安装包 有2种版本&#xff0c;Git for Windows Setup和Git for Windows Portable(便携版)两个版本都可以。 三、Git for Windows Por…

数据结构——图的存储结构

一、邻接矩阵 图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息&#xff0c;一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。 设图G 有n 个顶点&#xff0c;则邻接矩阵A 是一个n ∗ n 的方阵&#xff0c;定义为: 下图是一个…

MSB20M-ASEMI小功率家电专用MSB20M

编辑&#xff1a;ll MSB20M-ASEMI小功率家电专用MSB20M 型号&#xff1a;MSB20M 品牌&#xff1a;ASEMI 封装&#xff1a;UMSB-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;2A 功率(Pd)&#xff1a;50W 芯片个数&#xff1a;4 引…

HarmonyOS使用Canvas绘制自定义图形

Entry Component struct CanvasSimple {//用来配置CanvasRenderingContext2D对象的参数&#xff0c;包括是否开启抗锯齿&#xff0c;true表明开启抗锯齿。private settings: RenderingContextSettings new RenderingContextSettings(true)//用来创建CanvasRenderingContext2D对…

重生奇迹MU中pk要掌握好哪些点

在重生奇迹MU中&#xff0c;PK是一个非常重要的游戏环节&#xff0c;需要玩家掌握一定的技巧和策略才能取得胜利。以下是一些掌握好的点&#xff0c;帮助玩家在PK中取得优势。 技能的选择和使用&#xff1a; 在重生奇迹MUPK中&#xff0c;选择正确的技能并熟练使用它们非常关…

如何在Odoo14中生成二维码

QR 码是一种快速响应代码&#xff0c;看起来类似于条形码。日常经常使用它来跟踪信息。它由许多黑色方块组成&#xff0c;排列在白色背景的方形网格中&#xff0c;我们可以在其中嵌入成像设备可读的数据。 在odoo中&#xff0c;二维码在报告、数据分析等方面发挥着至关重要的作…