当前位置: 首页 > news >正文

Android基础(二)了解Android项目

了解Android项目

    • 一、项目结构
      • 1.1 Compose项目
        • 1.1.1 app模块(开发区域)
        • 1.1.2 gradle(配置区域)
          • 1.1.2.1 项目级 build.gradle
          • 1.1.2.2 模块级 build.gradle
          • 1.1.2.3 注意事项
      • 1.2 常规项目
    • 二、gradle文件对比
      • 2.1 项目级 build.gradle
      • 2.2 模块级 build.gradle
        • 2.2.1 语法差异对比
        • 2.2.2 配置说明
      • 2.3 settings.gradle
        • 2.3.1 `pluginManagement`(插件管理)
        • 2.3.2 `dependencyResolutionManagement`(依赖管理)
        • 2.3.3. 项目结构定义
        • 2.3.4. 文件关键特性总结
        • 2.3.5. 注意事项

一、项目结构

  了解Android项目,首先要清楚Android项目的结构,目前先从基础开始,Android目前主推的页面开发模式,是声明式UI,Kotlin Compose,也就是不用xml去做页面布局,通过代码去做,这个其实并不新鲜了,因为iOS早就已经是这样了,随后Flutter也是这么做的,随后是Android Compose,随后就是鸿蒙AskUI,下面我们先来看Compose项目的项目结构。

1.1 Compose项目

  首先我们看到之前创建的HelloWorld项目,这里我们把项目结构分为两部分,一部分是编码区域,一部分是配置区域,这里的配置区域就是我标注的部分:Gradle

在这里插入图片描述

1.1.1 app模块(开发区域)

在这里插入图片描述
这里我们从上往下就是manifests、kotlin+java、res、res(generated)。

  • manifests 表示配置文件,在Android项目中这个很重要、你的四大组件和这个文件都有关系,里面AndroidManifest.xml中,可以设置你的App名称、图标、网络配置、权限等。
  • kotlin+java 标识Compose代码区域,里面就是一个theme、和创建项目时的MainActivity.kt,theme用于设置App的主题,里面涉及到颜色、主题风格、文字样式等。如果你要做深色模式、浅色模式切换就需要使用到。关于怎么编写Compose代码,我们后面再说。
  • res 表示资源文件,例如图标、文字、颜色、配置文件等。
1.1.2 gradle(配置区域)

在这里插入图片描述

下面我们看配置区域,这里有多个文件,我们一一说明,这些都比较重要。

build.gradle.kts 这里我们看到有两个build.gradle.kts文件,但是作用是不一样的,因为名称是一样的,我们通过这个括号后面的描述来进行区分,,一个是Module,HelloWorld是我们的项目名称,app是模块的名称。

1.1.2.1 项目级 build.gradle

  build.gradle.kts(Project:HelloWorld)是项目级build.gradle,位于项目根目录,用于全局配置,定义所有模块共享的构建规则,如 Gradle 插件版本、远程仓库地址(如 Google、Maven Central)

1.1.2.2 模块级 build.gradle

  build.gradle.kts(Module:app)是模块级build.gradle,位于每个模块目录下,用于声明模块所需的库依赖(如第三方库、Android SDK 组件等),支持本地文件、远程仓库(如 Maven)或项目内其他模块,就是我们当前模块可以依赖另一个模块,

1.1.2.3 注意事项

  一个项目可以有多个模块,而我们发现build.gradle.kts,有一个kts的文件后缀,这是表示,这个文件使用Kotlin语言编写的,如果没有这个后缀就是Groovy语言编写的,如果你的文件是kts结尾的,你在里面添加Groovy的代码,就与编译报错,为什么会有这样的情况呢?就是因为AS现在创建项目默认是kts的,一般初学者没有注意到这个,然后创建项目之后,遇到问题之后,从网上去找方法,网上很多文章是之前写的,那时候还是使用Groovy,于是就出现了把Groovy代码复制到Kotlin编写的build.gradle中的情况了,那自然就会报错。

  那么我作为初学者,我不懂这个语法怎么办呢?比如我现在从网上抄了一个Groovy的配置,我想把它放进Kotlin的配置文件中,但是我两个语言都不懂呢?那么你就可以用一下免费的AI工具了,比如通灵义码、CodeBuddy等等,至于怎么提问你应该知道吧。

  • proguard-rules.pro 是 Android 项目中用于配置 ProGuard(或 R8)代码优化和混淆规则的配置文件,如果我们将代码进行混淆,对于我们的项目就能起到一定的保护作用,说起来简单,使用其他就没有那么简单了,有很多注意事项,我们后面再提。
  • gradle.properties 是 Gradle 构建系统的全局配置文件,用于定义项目级或系统级的属性和参数。在 Android 项目中,它通常位于项目根目录。
  • gradle-wrapper.properties 是 Gradle Wrapper 的配置文件,用于指定项目使用的 Gradle 版本 和 下载地址。它允许开发者在不预先安装 Gradle 的情况下,自动下载并使用正确的 Gradle 版本来构建项目,确保团队协作和持续集成(CI)环境中的构建一致性。如果我们要更改下载源就需要修改这个文件了,这个我在Android Studio安装配置一文中有提到,可以去看看。
  • libs.versions.toml 是 Android 项目中用于集中管理依赖库版本号的配置文件,采用 TOML(Tom’s Obvious Minimal Language)格式。它是 Android Gradle 插件(AGP)7.0+ 引入的新特性,旨在替代传统的 build.gradle 中分散定义的版本变量,提升依赖管理的可读性和维护性。这个文件后面我们找机会举例单独说一下。
  • local.properties 是 Android 项目中的配置文件,主要用于存储本地开发环境相关的敏感信息或路径配置。它通常不会被提交到版本控制系统(如 Git),以避免泄露开发者本地的私有数据。
  • settings.gradle.kts 也是 Kotlin 版本的 Gradle 项目配置文件,用于定义项目的模块结构和全局构建逻辑。它替代了传统的 Groovy 格式的 settings.gradle,可以管理我们的插件,你可能还不明白插件是什么,后面你就会知道了。

1.2 常规项目

下面我们再创建一个常规项目,去看看对比Compose项目有什么不同。

在这里插入图片描述

这里我们需要选择Empty Views Activity,Views表示的就是视图文件,也就是常规的XML布局方式,点击Next。

在这里插入图片描述

注意这里我的Build configuration language选择的是Groovy DSL,点击Finish完成创建,然后我们看看项目结构

在这里插入图片描述
可以看到常规的项目和Compose项目的区别在项目结构上不是很大,app模块中的代码中MainActivity里面就是常规的Activity,而且res目录下多了一个layout目录,里面就是activity_main.xml文件,配置区域的区别从表面上看就是build.gradle和settings.gradle没有.kts后缀,它里面就是Groovy语言编写。

二、gradle文件对比

2.1 项目级 build.gradle

我们先看build.gradle.kts文件代码:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {alias(libs.plugins.android.application) apply falsealias(libs.plugins.kotlin.android) apply falsealias(libs.plugins.kotlin.compose) apply false
}

再看build.gradle文件代码:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {alias(libs.plugins.android.application) apply falsealias(libs.plugins.kotlin.android) apply false
}

好像在这个文件中语法没有什么区别,就是Compose项目相比常规项目多了一个

alias(libs.plugins.kotlin.compose) apply false

其他的都一样,这里我们解释一下上面的配置代码是什么意思:

  • plugins { ... } 块用于声明和配置 Gradle 插件
alias(libs.plugins.android.application) apply false
  • alias(libs.plugins.android.application) 表示引用 libs.plugins.android.application 插件(通常是 Android 应用插件)
  • apply false 表示不在当前构建脚本中立即应用这个插件,而是在需要的地方(如模块级构建脚本)再应用

然后就是kotlin.Android插件和Compose插件,这就很好理解了吧。

2.2 模块级 build.gradle

build.gradle.kts文件代码:

plugins {alias(libs.plugins.android.application)alias(libs.plugins.kotlin.android)alias(libs.plugins.kotlin.compose)
}android {namespace = "com.example.helloworld"compileSdk = 36defaultConfig {applicationId = "com.example.helloworld"minSdk = 24targetSdk = 36versionCode = 1versionName = "1.0"testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_11targetCompatibility = JavaVersion.VERSION_11}kotlinOptions {jvmTarget = "11"}buildFeatures {compose = true}
}dependencies {implementation(libs.androidx.core.ktx)implementation(libs.androidx.lifecycle.runtime.ktx)implementation(libs.androidx.activity.compose)implementation(platform(libs.androidx.compose.bom))implementation(libs.androidx.ui)implementation(libs.androidx.ui.graphics)implementation(libs.androidx.ui.tooling.preview)implementation(libs.androidx.material3)testImplementation(libs.junit)androidTestImplementation(libs.androidx.junit)androidTestImplementation(libs.androidx.espresso.core)androidTestImplementation(platform(libs.androidx.compose.bom))androidTestImplementation(libs.androidx.ui.test.junit4)debugImplementation(libs.androidx.ui.tooling)debugImplementation(libs.androidx.ui.test.manifest)
}

build.gradle文件代码:

plugins {alias(libs.plugins.android.application)alias(libs.plugins.kotlin.android)
}android {namespace 'com.example.helloworldbase'compileSdk 36defaultConfig {applicationId "com.example.helloworldbase"minSdk 24targetSdk 36versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_11targetCompatibility JavaVersion.VERSION_11}kotlinOptions {jvmTarget = '11'}
}dependencies {implementation libs.androidx.core.ktximplementation libs.androidx.appcompatimplementation libs.materialimplementation libs.androidx.activityimplementation libs.androidx.constraintlayouttestImplementation libs.junitandroidTestImplementation libs.androidx.junitandroidTestImplementation libs.androidx.espresso.core
}

在这里插入图片描述

2.2.1 语法差异对比
特性GroovyKotlin
属性赋值直接使用 = 或省略(Groovy 动态特性)必须使用 Kotlin 属性访问语法(isMinifyEnabled)
方法调用可省略括号(Groovy 灵活语法)必须显式使用括号(Kotlin 严格语法)
字符串引号单引号 ’ 或双引号 " 均可双引号 " 是标准用法(支持字符串模板)
类型安全动态类型,无编译时检查静态类型,IDE 可提供自动补全和类型检查

推荐使用Kotlin,因为Kotlin 类型安全减少错误,Android Studio 提供智能补全和导航。旧项目迁移:可逐步将 build.gradle 重命名为 build.gradle.kts,并调整语法。

2.2.2 配置说明

这里我就用Kotlin语法的build.gradle进行说明了:

  1. 插件配置 (plugins)
plugins {alias(libs.plugins.android.application)  // Android 应用插件alias(libs.plugins.kotlin.android)      // Kotlin Android 插件alias(libs.plugins.kotlin.compose)      // Kotlin Compose 支持插件
}
  • 作用:声明项目所需的 Gradle 插件,通过 libs.versions.toml 统一管理版本。
  • 关键插件:
    • android.application:标记此模块为可运行的 Android 应用。
    • kotlin.android:启用 Kotlin 语言支持。
    • kotlin.compose:支持 Jetpack Compose(声明式 UI 框架)。
  1. 插件配置 (plugins)

基础参数

namespace = "com.example.helloworld"  // 应用的包名(覆盖 Manifest)
compileSdk = 36                       // 编译使用的 Android SDK 版本
  • compileSdk:必须与本地安装的 SDK 版本一致。

默认配置 (defaultConfig)

defaultConfig {applicationId = "com.example.helloworld"  // 应用唯一标识(发布后不可更改)minSdk = 24                              // 最低支持的 Android 版本targetSdk = 36                           // 目标适配版本(影响运行时行为)versionCode = 1                          // 内部版本号(整数,递增)versionName = "1.0"                      // 用户可见的版本名testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"  // 测试框架
}

构建类型 (buildTypes)

buildTypes {release {isMinifyEnabled = false  // 关闭代码混淆(R8/ProGuard)proguardFiles(           // 混淆规则文件getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")}
}
  • minifyEnabled:若为 true,会启用代码压缩、混淆和优化(需配置 proguard-rules.pro)。

编译选项

compileOptions {sourceCompatibility = JavaVersion.VERSION_11  // Java 源代码兼容性targetCompatibility = JavaVersion.VERSION_11 // 生成的字节码版本
}
kotlinOptions {jvmTarget = "11"  // Kotlin 编译目标 JVM 版本
}
  • 统一使用 Java 11 特性

功能开关 (buildFeatures)

buildFeatures {compose = true  // 启用 Jetpack Compose
}
  • 必须开启才能使用 Compose UI 组件,后面我们可能还会用到其他的配置,例如buildConfig、ViewBinding、DataBinding等等。

依赖库 (dependencies)

  • 核心依赖
implementation(libs.androidx.core.ktx)           // AndroidX 核心扩展
implementation(libs.androidx.lifecycle.runtime.ktx) // 生命周期管理
implementation(libs.androidx.activity.compose)    // Compose 与 Activity 集成
  • Jetpack Compose 依赖
implementation(platform(libs.androidx.compose.bom)) // Compose BOM(统一版本管理)
implementation(libs.androidx.ui)                  // Compose 基础 UI
implementation(libs.androidx.ui.graphics)        // Compose 图形绘制
implementation(libs.androidx.ui.tooling.preview)   // Compose 预览支持
implementation(libs.androidx.material3)           // Material Design 3 组件

BOM (Bill of Materials):通过 platform() 指定版本,子依赖无需显式写版本号。

  • 测试依赖
testImplementation(libs.junit)                     // 单元测试
androidTestImplementation(libs.androidx.junit)     // Android 单元测试
androidTestImplementation(libs.androidx.espresso.core) // UI 测试
androidTestImplementation(platform(libs.androidx.compose.bom)) 
androidTestImplementation(libs.androidx.ui.test.junit4) // Compose 测试
debugImplementation(libs.androidx.ui.tooling)      // 调试工具
debugImplementation(libs.androidx.ui.test.manifest) // 测试 Manifest
  • androidTest:仅针对 Android 设备/模拟器的测试。
  • debug:仅在调试模式下生效的依赖(如预览工具)。

2.3 settings.gradle

settings.gradle.kts文件代码:

pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}rootProject.name = "HelloWorld"
include(":app")

settings.gradle文件代码:

pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}rootProject.name = "HelloWorldBase"
include ':app'

语法我们就不用再对比了,直接进行文件配置说明settings.gradle.kts 文件是 Android 项目的核心配置文件,使用 Kotlin DSL 编写,主要定义了 Gradle 插件管理、依赖仓库策略和项目模块结构。


2.3.1 pluginManagement(插件管理)
pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")  // 包含所有 Android 官方插件includeGroupByRegex("com\\.google.*")   // 包含 Google 服务插件includeGroupByRegex("androidx.*")      // 包含 AndroidX 插件}}mavenCentral()          // Maven 中央仓库gradlePluginPortal()    // Gradle 官方插件门户}
}
  • 作用:指定 Gradle 插件的下载来源(与普通依赖库分离,提升安全性)。
  • 关键配置
    • google():优先从 Google 仓库下载插件,并通过 content 过滤只拉取 com.androidcom.googleandroidx 开头的插件。
    • includeGroupByRegex:使用正则表达式精确匹配插件组,避免下载无关内容。
    • mavenCentral()gradlePluginPortal():作为备用仓库。

2.3.2 dependencyResolutionManagement(依赖管理)
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()       // Google 的 Android 依赖库仓库mavenCentral() // Maven 中央仓库(如 Kotlin 标准库)}
}
  • 作用:统一管理项目依赖库的下载来源。
  • 关键配置
    • repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
      强制所有模块使用此处定义的仓库,禁止模块单独声明仓库(避免多仓库冲突)。
    • google():必须项,用于下载 AndroidX、Material Design 等官方库。
    • mavenCentral():必须项,用于下载 Kotlin、JetBrains 等第三方库。

2.3.3. 项目结构定义
rootProject.name = "HelloWorld"  // 设置根项目名称
include(":app")                 // 包含名为 `app` 的子模块
  • 作用:声明项目包含哪些模块。
  • 说明
    • :app 是默认的 Android 应用模块,对应工程中的 app 文件夹。
    • 如需添加库模块(如 :library),需同步创建目录并调用 include(":library")

2.3.4. 文件关键特性总结
配置项作用是否必须
pluginManagement控制 Gradle 插件的来源和权限,提升安全性。推荐
dependencyResolutionManagement统一依赖仓库,避免多模块配置混乱。必须
repositoriesMode.FAIL_ON_PROJECT_REPOS强制集中管理仓库,禁止模块自定义。可选
include(":app")声明参与构建的模块。必须

2.3.5. 注意事项
  1. 插件与依赖分离

    • 插件(如 com.android.application)通过 pluginManagement 下载。
    • 依赖库(如 androidx.core:core-ktx)通过 dependencyResolutionManagement 下载。
  2. 仓库优先级
    Gradle 会按声明顺序检查仓库,通常将 google() 放在首位(Android 官方库更新最快)。

  3. 多模块项目
    若添加新模块(如 :feature),需同步修改 include 列表:

    include(":app", ":feature", ":library")
    
  4. 兼容性
    此配置需 Android Gradle Plugin (AGP) 7.0+ 和 Gradle 7.0+ 支持。


  通过本篇文章的描述,相信你对于Android项目的了解更深了一些,但这些可能过目就忘了,后面我们将告别这些文字说明,进入实际开发环节,我将会对同一种功能进行两种项目结构的分别开发,也就是Compose写一个,常规项目写一个,让读者自行去做取舍,你觉得哪个更适合自己就用那个,后会有期!明天又是美好的一天呀~

http://www.lryc.cn/news/605004.html

相关文章:

  • 端侧大模型迎来“轻”革命!移远通信 × RWKV 打造“轻量AI大脑”
  • 单片机电路基础
  • 【NCS随笔】如何在hello_world添加蓝牙功能(一)
  • sqli-labs:Less-7关卡详细解析
  • 国内数据集成厂商有哪些?如何选择最适合的数据集成平台?
  • Qt 与物联网(IoT)开发
  • 【Linux】重生之从零开始学习运维之备份恢复
  • String模拟实现的补充说明
  • 第1课:向量与矩阵运算
  • QT中QTableView+Model+Delegate实现一个demo
  • 【ESP32设备通信】-LAN8720与ESP32集成
  • 如何设计一个站内消息系统:架构设计合集(八)
  • 订单识别技术原理及场景应用
  • 【音视频】WebRTC 开发环境搭建-Web端
  • MYSQL:视图
  • Qt 下载说明
  • uniApp实战六:Echart图表集成
  • 实现implements InitializingBean, DisposableBean 有什么用
  • 【MATLAB/Simulink】查看MATLAB以往版本的帮助文档
  • 牛顿-拉夫森法求解非线性方程组
  • 无人机惯性导航模块运行与技术难点!
  • 25年新算法!基于猛禽的优化算法(BPBO):一种元启发式优化算法,附完整免费MATLAB代码
  • 《数学模型》——最大流与最小费用流问题
  • Mediapipe 的某些模型,网络下载不来可以去gitee找找看
  • 双塔模型 + 自监督学习:解决长尾物品表征难题
  • Helm在Kubernetes中的应用部署指南与案例解析
  • FragmentManager 返回栈与 Activity 运行栈的关系(当按下Back键时屏幕会如何变化?)
  • 基于SpringBoot+MyBatis+MySQL+VUE实现的便利店信息管理系统(附源码+数据库+毕业论文+远程部署)
  • 如何不让android studio自动换行
  • AI服务器中,EEPROM有哪些部件使用,需要存储哪些信息?