uni-app Android 离线打包:多环境(prod/dev)配置

很多 uni-app 项目在离线打包阶段都会遇到一个问题:

线上包、测试包共用一套配置,导致包名冲突、应用名称不区分、推送参数混用,甚至 release 包还带着 debug 开关。

这篇文章基于一个真实项目,整理一套可落地的 Android 多环境配置方案,目标是:

  • prod 包名:com.example.app
  • dev 包名:com.example.app.dev
  • prod 应用名:示例应用
  • dev 应用名:示例应用开发版
  • prod/dev 使用不同 dcloud_appkey
  • release 自动关闭 dcloud_control.xml 里的 debug 配置

1. 在 app 模块启用 productFlavors

文件:simpleDemo/build.gradle

groovy 复制代码
android {
    defaultConfig {
        applicationId "com.example.app"
        manifestPlaceholders = [
                "GETUI_APPID"           : "YOUR_GETUI_APPID",
                "plus.unipush.appid"    : "YOUR_UNIPUSH_APPID",
                "plus.unipush.appkey"   : "YOUR_UNIPUSH_APPKEY",
                "plus.unipush.appsecret": "YOUR_UNIPUSH_APPSECRET",
                "apk.applicationId"     : "${applicationId}"
        ]
    }

    flavorDimensions "env"
    productFlavors {
        prod {
            dimension "env"
            manifestPlaceholders["DCLOUD_APPKEY"] = "YOUR_PROD_DCLOUD_APPKEY"
        }
        dev {
            dimension "env"
            applicationIdSuffix ".dev"
            manifestPlaceholders["DCLOUD_APPKEY"] = "YOUR_DEV_DCLOUD_APPKEY"
        }
    }
}

说明:

  • applicationIdSuffix ".dev" 会让 dev 最终包名变成 com.example.app.dev
  • apk.applicationId 写成 ${applicationId},避免 dev 包里仍然写死 prod 包名
  • DCLOUD_APPKEY 用 flavor 维度区分,避免测试和线上串环境

2. Manifest 中使用占位符注入 dcloud_appkey

文件:simpleDemo/src/main/AndroidManifest.xml

xml 复制代码
<meta-data
    android:name="dcloud_appkey"
    android:value="${DCLOUD_APPKEY}" />

说明:

不要把 dcloud_appkey 写死在 main,否则 prod/dev 无法自动切换。


3. 应用名称按环境覆盖

main 保持正式名称:

文件:simpleDemo/src/main/res/values/strings.xml

xml 复制代码
<resources>
    <string name="app_name">示例应用</string>
</resources>

dev 增加同名资源覆盖:

文件:simpleDemo/src/dev/res/values/strings.xml

xml 复制代码
<resources>
    <string name="app_name">示例应用开发版</string>
</resources>

说明:

Android 资源会按构建变体自动覆盖,dev 下同名 app_name 会覆盖 main


4. release 自动关闭 dcloud 调试开关

如果 dcloud_control.xml 放在 src/main 且写着 debug="true",release 也会继承这个配置。

正确做法是按 buildType 拆分。

调试包配置:

文件:simpleDemo/src/debug/assets/data/dcloud_control.xml

xml 复制代码
<hbuilder debug="true" syncDebug="true">
<apps>
    <app appid="__UNI__XXXXXXX" appver=""/>
</apps>
</hbuilder>

发布包配置:

文件:simpleDemo/src/release/assets/data/dcloud_control.xml

xml 复制代码
<hbuilder debug="false" syncDebug="false">
<apps>
    <app appid="__UNI__XXXXXXX" appver=""/>
</apps>
</hbuilder>

并删除:

  • simpleDemo/src/main/assets/data/dcloud_control.xml

5. 让输出 APK 名称带上 flavor

配置后会出现 prodDebug/devRelease 等多个变体,如果输出文件名只叫 android_release.apk,产物会互相覆盖。

建议在 androidComponents 中带上 flavor:

groovy 复制代码
androidComponents {
    onVariants(selector().all()) { variant ->
        variant.outputs.forEach { output ->
            def bt = variant.buildType
            def flavor = variant.flavorName
            def flavorPart = (flavor != null && !flavor.isEmpty()) ? "${flavor}_" : ""
            output.outputFileName.set("android_${flavorPart}${bt}.apk")
        }
    }
}

6. 打包

如果你使用 Android Studio 的 Build Variants 面板,正常会看到:

  • prodDebug / prodRelease
  • devDebug / devRelease

如果只看到 debug/release,通常是 Gradle Sync 失败或未同步成功。


总结

uni-app Android 离线打包做多环境,核心是三件事:

  • productFlavors 区分环境(包名、key 等)
  • src/dev / src/release 做资源和资产覆盖(应用名、dcloud 控制文件)
  • 用规范的变体命名和产物命名,避免人工误操作

这样一来,开发、测试、线上包能稳定并行,发版也会更可控。

相关推荐
祖国的好青年16 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴16 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭17 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首17 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
Lhan.zzZ17 小时前
笔记_2026.4.28_003
c++·笔记·qt·opencv
zhangphil18 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙18 小时前
echarts,3d堆叠图
android·3d·echarts
李白的天不白18 小时前
如何项目发布到github上
android·vue.js
summerkissyou198718 小时前
Android-RTC、NTP 和 System Time(系统时间)
android
小书房18 小时前
Kotlin使用体验及理解1
android·开发语言·kotlin