Android如何通过Gradle完成打包?一文读懂构建全流程

435 阅读3分钟

一、Gradle构建的三大阶段

Gradle构建Android项目会经历三个核心阶段,每个阶段承担不同职责:

  1. 初始化阶段

    • 读取settings.gradle文件,确定项目包含哪些模块(如app模块、library模块)。
    • 加载所有子模块的build.gradle文件,构建项目模型。
  2. 配置阶段

    • 执行所有模块的build.gradle文件中的配置代码。
    • 解析依赖关系,构建任务依赖图(Task Graph)。例如,编译代码任务必须先于打包任务执行。
  3. 执行阶段

    • 根据任务依赖图,按顺序执行任务。例如,执行assembleDebug任务会触发编译、资源处理、APK生成等子任务。

二、Android插件的核心作用

com.android.application插件是构建Android应用的关键,它提供了以下核心能力:

  1. 构建类型(Build Types)

    • Debug:快速构建,不压缩代码,使用调试签名,方便开发调试。
    • Release:代码混淆、压缩,使用发布签名,生成最终APK。
  2. 产品风味(Product Flavors)

    • 支持多渠道打包,例如:

      groovy
      	android {
      
      	    productFlavors {
      
      	        free { applicationId "com.example.app.free" }
      
      	        paid { applicationId "com.example.app.paid" }
      
      	    }
      
      	}
      
  3. 变体(Variants)

    • 组合构建类型和产品风味,生成最终构建产物。例如,freeDebugpaidRelease

三、打包流程详解:从代码到APK

assembleDebug任务为例,Gradle会按以下步骤构建APK:

  1. 编译代码

    • 将Java/Kotlin代码编译为DEX文件(可执行字节码)。
    • 使用javackotlinc编译器,依赖compileSdkVersion指定的SDK版本。
  2. 处理资源

    • 合并清单文件(AndroidManifest.xml),处理依赖库的清单。
    • 压缩图片、布局等资源,生成资源索引表(resources.arsc)。
  3. 生成APK

    • 将DEX文件、资源、清单文件打包为未签名的APK。
    • 使用调试签名(debug.keystore)对APK签名,生成最终文件。
  4. 输出路径

    • 调试版APK:app/build/outputs/apk/debug/app-debug.apk
    • 发布版APK:app/build/outputs/apk/release/app-release.apk(需配置签名)

四、关键配置文件解析

  1. 项目级build.gradle

    • 定义全局依赖和插件版本:

      groovy
      	buildscript {
      
      	    repositories {
      
      	        google() // Google Maven仓库
      
      	        mavenCentral() // Maven中央仓库
      
      	    }
      
      	    dependencies {
      
      	        classpath 'com.android.tools.build:gradle:7.0.2' // AGP插件版本
      
      	    }
      
      	}
      
  2. 模块级build.gradle

    • 配置模块专属参数:

      groovy
      	android {
      
      	    compileSdkVersion 33 // 编译使用的SDK版本
      
      	    defaultConfig {
      
      	        applicationId "com.example.app" // 包名
      
      	        minSdkVersion 21 // 最低支持Android版本
      
      	        targetSdkVersion 33 // 目标版本
      
      	        versionCode 1 // 版本号(整数)
      
      	        versionName "1.0" // 版本名称(字符串)
      
      	    }
      
      	    buildTypes {
      
      	        release {
      
      	            minifyEnabled true // 启用代码压缩
      
      	            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      
      	        }
      
      	    }
      
      	}
      
      	dependencies {
      
      	    implementation 'androidx.appcompat:appcompat:1.4.1' // 依赖库
      
      	}
      

五、自定义构建流程

通过Gradle的API,可以扩展构建流程以满足特定需求:

  1. 自定义任务

    • 示例:生成版本信息类:

      groovy
      	task generateVersionClass {
      
      	    def outputDir = file("$buildDir/generated/source/version")
      
      	    outputs.dir outputDir
      
      	    doLast {
      
      	        def versionContent = "public class Version { public static final String CODE = ${versionCode}; }"
      
      	        file(outputDir, "Version.java").write(versionContent)
      
      	    }
      
      	}
      
      	// 将任务绑定到编译前
      
      	android.applicationVariants.all { variant ->
      
      	    variant.javaCompile.dependsOn(generateVersionClass)
      
      	}
      
  2. 配置签名

    • 发布版APK需配置签名:

      groovy
      	android {
      
      	    signingConfigs {
      
      	        release {
      
      	            storeFile file("keystore.jks")
      
      	            storePassword "store_password"
      
      	            keyAlias "key_alias"
      
      	            keyPassword "key_password"
      
      	        }
      
      	    }
      
      	    buildTypes {
      
      	        release {
      
      	            signingConfig signingConfigs.release
      
      	        }
      
      	    }
      
      	}
      

六、优化构建速度

  1. 启用构建缓存

    • gradle.properties中添加:

      properties
      	org.gradle.caching=true
      
  2. 并行执行

    • 添加参数:--parallel
  3. 使用国内镜像

    • 修改仓库地址为阿里云镜像,加速依赖下载:

      groovy
      	repositories {
      
      	maven { url 'https://maven.aliyun.com/repository/public' }
      
      	}
      

七、常见命令

  • ./gradlew assembleDebug:构建调试版APK。
  • ./gradlew assembleRelease:构建发布版APK(需配置签名)。
  • ./gradlew clean:清理构建缓存。
  • ./gradlew dependencies:查看依赖树。

通过以上流程,Gradle将源代码、资源、配置转化为可安装的APK文件,同时提供灵活的自定义能力,满足从开发到发布的完整需求。