uni-app Android离线打包的多环境配置方案

 更新时间:2026年04月28日 09:46:30   作者:拾壹此间  
本文介绍uni-app项目Android多环境打包方案,通过productFlavors区分包名和key、利用flavor覆盖资源和资产、规范变体命名和产物命名等方法,确保开发、测试、线上包稳定并行,发版更可控,需要的朋友可以参考下

很多 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

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

<meta-data
    android:name="dcloud_appkey"
    android:value="${DCLOUD_APPKEY}" />

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

3. 应用名称按环境覆盖

main 保持正式名称:

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

<resources>
    <string name="app_name">示例应用</string>
</resources>

dev 增加同名资源覆盖:

文件:simpleDemo/src/dev/res/values/strings.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

<hbuilder debug="true" syncDebug="true">
<apps>
    <app appid="__UNI__XXXXXXX" appver=""/>
</apps>
</hbuilder>

发布包配置:

文件:simpleDemo/src/release/assets/data/dcloud_control.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:

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 控制文件)
  • 用规范的变体命名和产物命名,避免人工误操作

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

到此这篇关于 uni-app Android离线打包的多环境配置方案的文章就介绍到这了,更多相关 uni-app Android离线打包配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通知监控NotificationListenerService onNotificationPosted重复回调问题

    通知监控NotificationListenerService onNotificationPosted重复回

    这篇文章主要为大家介绍了通知监控NotificationListenerService onNotificationPosted重复回调问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Android实现拍照和录制视频功能

    Android实现拍照和录制视频功能

    这篇文章主要为大家详细介绍了Android实现拍照和录制视频功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android Fragment动态创建详解及示例代码

    Android Fragment动态创建详解及示例代码

    这篇文章主要介绍了Android Fragment动态创建详解的相关资料,并附实例代码及实现效果图,需要的朋友可以参考下
    2016-11-11
  • Android Activity启动模式之singleTask实例详解

    Android Activity启动模式之singleTask实例详解

    这篇文章主要介绍了Android Activity启动模式之singleTask,结合实例形式较为详细的分析了singleTask模式的功能、使用方法与相关注意事项,需要的朋友可以参考下
    2016-01-01
  • 解决PhoneGap不支持viewport的几种方法

    解决PhoneGap不支持viewport的几种方法

    今天小编就为大家分享一篇关于解决PhoneGap不支持viewport的几种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Android XML数据的三种解析方式

    Android XML数据的三种解析方式

    这篇文章主要为大家详细介绍了Android XML数据的三种解析方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Flutter Getx中的put和lazyPut函数使用案例解析

    Flutter Getx中的put和lazyPut函数使用案例解析

    这篇文章主要为大家介绍了Flutter Getx中的put和lazyPut函数使用案例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Android开发使用Message对象分发必备知识点详解

    Android开发使用Message对象分发必备知识点详解

    这篇文章主要为大家介绍了Android开发使用Message对象分发必备知识点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android开发之数据的存储方式详解

    Android开发之数据的存储方式详解

    本篇文章主要介绍了Android开发之数据的存储方式,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-11-11
  • Android高级UI特效仿直播点赞动画效果

    Android高级UI特效仿直播点赞动画效果

    这篇文章主要介绍了Android高级UI特效仿直播点赞动画效果,最近比较火的抖音快手直播视频都有这样的效果,下面脚本之家小编给大家带来android 仿直播点赞效果的实现代码,需要的朋友参考下吧
    2018-03-03

最新评论