flutter: android: 打渠道包

一,配置build.gradle.kts,使支持apk文件重命名

说明:build.gradle.kts 是 Kotlin Build Scripts 的文件扩展名,
它使用 Kotlin 语言来编写 Gradle 构建脚本,而不是传统的 Groovy。
Kotlin 被引入 Gradle 主流是因为它拥有更简洁、安全的语法以及与 Java 高度兼容的特点,使得构建脚本编写更加直观和易于维护。

import java.util.Properties
import java.io.FileInputStream
import java.text.SimpleDateFormat
import java.util.Date
import com.android.build.gradle.internal.api.BaseVariantOutputImpl
import java.util.Base64

plugins {
    id("com.android.application")
    id("kotlin-android")
    id("dev.flutter.flutter-gradle-plugin")
}

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

var GlobalMyEnv = "product"
var GlobalMyChannel = "normal"
var GlobalMyVersion = "0"
var GlobalMyTime = "0"

if (project.hasProperty("dart-defines")) {
    //println("有参数")
    val dartlist = project.property("dart-defines")
    //println(dartlist);
    val parts = dartlist.toString().split(",")
    //println(parts);


    for (one in parts) {
        //println(one)
        val one2 = Base64.getDecoder().decode(one)
        //println(one2)
        val one3 = String(one2, Charsets.UTF_8)
        //println(one3)

        val pair = one3.split("=")
        if (pair[0] == "MYENV") {
            GlobalMyEnv = pair[1]
        }
        if (pair[0] == "MYCHANNEL") {
            GlobalMyChannel = pair[1]
        }
        if (pair[0] == "MYVERSION") {
            GlobalMyVersion = pair[1]
        }
        if (pair[0] == "MYTIME") {
            GlobalMyTime = pair[1]
        }
    }

} else {
    println("无参数")
}

println("GlobalMyEnv:"+GlobalMyEnv)
println("GlobalMyChannel:"+GlobalMyChannel)


android {
    namespace = "com.example.demo3"
    compileSdk = flutter.compileSdkVersion
    ndkVersion = flutter.ndkVersion
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_11.toString()
    }

    defaultConfig {
        // minSdkVersion = 24
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId = "com.example.demo3"
        // You can update the following values to match your application needs.
        // For more information, see: https://flutter.dev/to/review-gradle-config.
        minSdk = flutter.minSdkVersion
        targetSdk = flutter.targetSdkVersion
        versionCode = flutter.versionCode
        versionName = flutter.versionName
    }

    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = keystoreProperties["storeFile"]?.let { file(it) }
            storePassword = keystoreProperties["storePassword"] as String
        }
    }

    buildTypes {
        getByName("release") {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig = signingConfigs.getByName("release")
            //signingConfig = signingConfigs.release

            // 可配置apk生成文件名
            android.applicationVariants.all {
                outputs.all {
                    val output: BaseVariantOutputImpl = this as BaseVariantOutputImpl
                    output.outputFileName = "demo31-${GlobalMyEnv}-${GlobalMyChannel}-${GlobalMyVersion}-${GlobalMyTime}.apk"
                    println(output.outputFileName)
                }
            }
        }
    }


}

flutter {
    source = "../.."
}

注意,重命名后的apk保存在 build/app/outputs/apk/release  这个目录下,

不是: build/app/outputs/flutter-apk/ 这个目录

二,测试效果:

% flutter build apk --dart-define=MYENV=devel --dart-define=MYCHANNEL=huawei --dart-define=MYVERSION=1.3.5 --dart-define=MYTIME=20250328172800

有参数
TVlFTlY9ZGV2ZWw=,TVlDSEFOTkVMPWh1YXdlaQ==,TVlWRVJTSU9OPTEuMy41,TVlUSU1FPTIwMjUwMzI4MTcyODAw
[TVlFTlY9ZGV2ZWw=, TVlDSEFOTkVMPWh1YXdlaQ==, TVlWRVJTSU9OPTEuMy41, TVlUSU1FPTIwMjUwMzI4MTcyODAw]
TVlFTlY9ZGV2ZWw=
[B@149e4a89
MYENV=devel
TVlDSEFOTkVMPWh1YXdlaQ==
[B@433e56fa
MYCHANNEL=huawei
TVlWRVJTSU9OPTEuMy41
[B@139bb300
MYVERSION=1.3.5
TVlUSU1FPTIwMjUwMzI4MTcyODAw
[B@38da9df2
MYTIME=20250328172800
GlobalMyEnv:devel
GlobalMyChannel:huawei
demo31-devel-huawei-1.3.5-20250328172800.apk
demo31-devel-huawei-1.3.5-20250328172800.apk
demo31-devel-huawei-1.3.5-20250328172800.apk
Font asset "MaterialIcons-Regular.otf" was tree-shaken, reducing it from 1645184 to 1672 bytes (99.9% reduction). Tree-shaking can be disabled by providing the --no-tree-shake-icons flag when building your app.
Running Gradle task 'assembleRelease'...                           41.6s
✓ Built build/app/outputs/flutter-apk/app-release.apk (49.4MB)
liuhongdi@liuhongdideMBP demo3 % open build/app/outputs/apk/release

打好的包:

posted @ 2025-04-04 13:17  刘宏缔的架构森林  阅读(218)  评论(0)    收藏  举报