HarmonyOS 鸿蒙Next 按照文档配置多目标产物后无法打包app,但是可以运行

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 按照文档配置多目标产物后无法打包app,但是可以运行 我按照这篇文档

能力说明-配置多目标产物-配置构建-编译构建-DevEco Studio - 华为HarmonyOS开发者 (huawei.com)

的指导,给我的entry模块的buildOptionSet添加了多个配置,每个配置都带上了buildProfileFields属性用于添加不同的服务器地址,字段名叫API_HOST。

然后就打包失败了,报错说找不到BuildProfile.API_HOST,但是直接运行就没有问题,就很神奇。说是2处报错,其实都是这一句的位置

以下是涉及到的文件修改,供各位大佬分析。简单的说就是

  1. 给entry配置了N个buildOptionSet的成员,每个成员的API_HOST字符串值不一样。
  2. 给entry配置了N个target,并使用buildModeBinder把target和buildOption关联起来
  3. 项目有debug和release这2个buildModeSet成员,entry的每个target都配置到default产品上
  4. 整体逻辑:debug和release这2个,可以和N个buildOption进行组合,实现类似Android中2个维度组合的多渠道配置

  1. 项目的build-profile.json5
{
  "app": {
    "signingConfigs": [],
    "products": [
      {
        "name": "default",
        "signingConfig": "default",
        "compatibleSdkVersion": "5.0.0(12)",
        "runtimeOS": "HarmonyOS",
        "buildOption": {
          "strictMode": {
            "caseSensitiveCheck": true,
            "useNormalizedOHMUrl": true
          }
        }
      }
    ],
    "buildModeSet": [
      {
        "name": "debug",
        "buildOption": {
          "debuggable": true,
        }
      },
      {
        "name": "release",
        "buildOption": {
          "debuggable": false,
        }
      },
    ]
  },
  "modules": [
    {
      "name": "entry",
      "srcPath": "./entry",
      "targets": [
        {
          "name": "sit",
          "applyToProducts": [
            "default",
          ]
        },
        {
          "name": "uat",
          "applyToProducts": [
            "default",
          ]
        },
        {
          "name": "o2o",
          "applyToProducts": [
            "default",
          ]
        },
        {
          "name": "pre",
          "applyToProducts": [
            "default",
          ]
        },
        {
          "name": "release",
          "applyToProducts": [
            "default",
          ]
        }
      ]
    }
    // 删除了无关内容
  ]
}
  1. entry的build-profile.json5
{
  "apiType": "stageMode",
  "buildOption": {},
  "buildOptionSet": [
    // 修改这里的配置时,记得查找各种服务器环境下是否有同样的配置
    // json5是纯配置文件,不能像Android一样写代码定义变量统一管理
    {
      "name": "sit",
      "arkOptions": {
        "buildProfileFields": {
          "API_HOST": "xxxxx"
        }
      }
    },
    {
      "name": "uat",
      "arkOptions": {
        "buildProfileFields": {
          "API_HOST": "xxxxx"
        }
      }
    },
    {
      "name": "o2o",
      "arkOptions": {
        "buildProfileFields": {
          "API_HOST": "xxxxx"
        }
      }
    },
    {
      "name": "pre",
      "arkOptions": {
        "buildProfileFields": {
          "API_HOST": "xxxxx"
        }
      }
    },
    {
      "name": "release",
      "arkOptions": {
        "obfuscation": {
          "ruleOptions": {
            "enable": false,
            "files": [
              "./obfuscation-rules.txt"
            ]
          }
        },
        "buildProfileFields": {
          "API_HOST": "xxxxx"
        }
      }
    },
  ],
  "targets": [
    {
      "name": "sit"
    },
    {
      "name": "uat"
    },
    {
      "name": "o2o"
    },
    {
      "name": "pre"
    },
    {
      "name": "release"
    }
  ],
  "buildModeBinder": [
    {
      "buildModeName": "debug",
      "mappings": [
        {
          "targetName": "sit",
          "buildOptionName": "sit"
        },
        {
          "targetName": "uat",
          "buildOptionName": "uat"
        },
        {
          "targetName": "o2o",
          "buildOptionName": "o2o"
        },
        {
          "targetName": "pre",
          "buildOptionName": "pre"
        },
        {
          "targetName": "release",
          "buildOptionName": "release"
        }
      ]
    },
    {
      "buildModeName": "release",
      "mappings": [
        {
          "targetName": "sit",
          "buildOptionName": "sit"
        },
        {
          "targetName": "uat",
          "buildOptionName": "uat"
        },
        {
          "targetName": "o2o",
          "buildOptionName": "o2o"
        },
        {
          "targetName": "pre",
          "buildOptionName": "pre"
        },
        {
          "targetName": "release",
          "buildOptionName": "release"
        }
      ]
    }
  ]
}

更多关于HarmonyOS 鸿蒙Next 按照文档配置多目标产物后无法打包app,但是可以运行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

2024年9月24日,问题解决,经过如下:

  1. 向客服提交工单,说明了自己的问题经过和怀疑,得到转发来自开发人员的回复如下(个人认为的重点部分已经加粗并放大):

    尊敬的开发者,您好,

    关于您的反馈的问题,

    如果需要通过Build App的方式打包多目标产物,即构建不同的目标的App文件,需要在项目级build-profile文件中设置不同product,在IDE中选择Product后就只会生成对应目标的App。 具体配置APP多目标构建产物的详细介绍请参见:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-customized-multi-targets-and-products-guides-V5#section1011341611469

    每个target对应一个HAP,每个product对应一个APP包,APP包由多个目标的HAP组成,因此在执行Build > Build Hap(s)/APP(s) > Build APP(s)时,会把所有的target都编译打包

    合作愉快。 华为开发者联盟

  2. 分析回复

    打包product时,会把所有的target都打包,而我恰好在项目的build-profile文件中,把entry模块的5、6个target全部应用到了default产品中,也就是说会把N个entry都编译为HAP放进app里,自然会出现重复的entry模块。

    cke_26479.png

  3. 问题解决和总结

    对entry的不同target,全部改成不同的product,只保留1个default即可,不同的API_HOST配置到不同的product里,即可解决问题,正常打包。

总结:确保每个模块,只有一个target应用到某个product中,不要重复。

更多关于HarmonyOS 鸿蒙Next 按照文档配置多目标产物后无法打包app,但是可以运行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


2024年9月23日尝试解决失败,记录如下:

想法:

错误提示说找不到API_HOST,我认为是没有给default配置这个字段,于是新增default的buildOption和target,并关联,并和其他target一起应用到default产品中。

结果:

仍然打包失败,但是出错提示不合理,怀疑是打包过程的bug

Module: (entry) and Module: (entry) have the same moduleName, please check deviceType or distroFilter of the module。

项目仅有一个entry,不存在重复的情况,所以不应该提示entry重复

补充,已经尝试过Build/Clean Project、Rebuild Project和File/invalidate Caches,重试后报错仍然存在,

在HarmonyOS鸿蒙Next中,配置多目标产物后无法打包但可以运行,可能是由于以下原因:

  1. 构建脚本配置问题:多目标产物的构建脚本可能未正确配置,导致打包过程失败。检查构建脚本中的目标配置,确保每个目标的依赖和资源路径正确。

  2. 资源文件冲突:多目标产物可能共享相同的资源文件,导致打包时资源冲突。检查资源文件的命名和路径,确保每个目标的资源文件独立且无冲突。

  3. 依赖库版本不兼容:不同目标可能依赖不同版本的库,导致打包时版本冲突。检查每个目标的依赖库版本,确保兼容性。

  4. 签名配置问题:打包应用需要正确的签名配置。检查签名配置,确保签名文件、密钥和别名正确无误。

  5. 构建工具版本问题:使用的构建工具版本可能与鸿蒙Next不兼容。检查构建工具版本,确保其支持鸿蒙Next的多目标产物配置。

  6. 日志信息缺失:打包失败时,日志信息可能未详细记录。检查构建日志,查找具体的错误信息,以便定位问题。

  7. 环境变量配置问题:构建环境变量可能未正确配置,导致打包失败。检查环境变量,确保其与鸿蒙Next的要求一致。

  8. 目标产物配置错误:多目标产物的配置可能错误,导致打包过程无法识别或处理。检查目标产物的配置,确保其符合鸿蒙Next的要求。

解决这些问题后,重新尝试打包,应能成功生成应用包。

根据您的描述,可能是由于多目标产物配置中某些设置不正确或缺失导致的打包失败。建议您检查以下几点:

  1. 配置文件:确保build-profile.json中的targets配置正确,每个目标的apiVersionruntimeOS等参数无误。
  2. 依赖项:确认所有依赖项在多目标配置中都已正确声明,尤其是不同目标可能需要的特定依赖。
  3. 构建脚本:检查build.gradlebuild.hml脚本,确保没有遗漏或错误的配置。
  4. 日志信息:查看构建日志,定位具体错误信息,通常日志会提示缺少哪些资源或配置。

如果问题仍然存在,建议参考HarmonyOS官方文档或社区论坛获取更多帮助。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!