Android基础(二)了解Android项目

一、项目结构

  了解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 false
    alias(libs.plugins.kotlin.android) apply false
    alias(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 false
    alias(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 = 36

    defaultConfig {
        applicationId = "com.example.helloworld"
        minSdk = 24
        targetSdk = 36
        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_11
        targetCompatibility = 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 36

    defaultConfig {
        applicationId "com.example.helloworldbase"
        minSdk 24
        targetSdk 36
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = '11'
    }
}

dependencies {

    implementation libs.androidx.core.ktx
    implementation libs.androidx.appcompat
    implementation libs.material
    implementation libs.androidx.activity
    implementation libs.androidx.constraintlayout
    testImplementation libs.junit
    androidTestImplementation libs.androidx.junit
    androidTestImplementation 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写一个,常规项目写一个,让读者自行去做取舍,你觉得哪个更适合自己就用那个,后会有期!明天又是美好的一天呀~

Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌握 Android内核的接口使用: 1、Android团队提供的示例项目   如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。   2、 Remote Droid   RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触摸屏手指运动等很好的样例。   3、 TorProxy和Shadow   TorProxy应用实现了Android手机无线电电传通讯(TOR),和Shadow应用一起使用,可以使用手机匿名上网。从该项目源代码中,可以掌握socket连接、管理cookie等方法。      4、 Android SMSPopup   SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。   5、 Standup Timer   Standup Timer应用用于控制站立会议时间,类似秒表倒计时,可以提醒每个人的讲话时间已到,从而保证每个会者使用时间一样。从该项目的代码中,可以学会如何使用时间函数。另外,这个项目的代码是采用视图view、模型model严格分离的设计思路。      6、 Foursquare   是Foursquare.com的一个客户端应用,该应用主要分为两个模块:API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中,可以学会如何同步、多线程、HTTP连接等技术。   7、 Pedometer   Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准,但是从这个项目中,可以学习几个不同的技术:加速器交互、语音更新、后台运行服务等。   8、 OpenSudoku-android   OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据,以及如何和一个网站交互等技术。   9、 ConnectBot   ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中,可以学习到很多Android安全方面的内容,这些是你在开发应用时经常需要考虑的安全问题。   10、WordPress的Android应用   当然在最后不能不提WordPress的Android应用了,这是WordPress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调用(当然还有更多的优秀内容)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初学者-Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值