DCloud_App_Array
DCloud_App_Array
  • 发布:2020-11-04 20:57
  • 更新:2022-09-24 09:25
  • 阅读:150807

HBuilderX App云端打包 - 安心打包使用指南

分类:HBuilderX

概述

过去,App云端打包时需要将应用代码、打包证书等提交到DCloud云端打包机,在云端打包机的原生开发环境中生成安装包apk/ipa。
DCloud云端服务器虽然不会保存开发者应用代码和证书等信息,但开发者可能还是不放心,或者担心在网络传输过程中可能存在拦截泄漏的风险。

而离线打包,不但不方便,还有2个重要功能无法使用:

  1. 原生混淆,保护js代码(因为秘钥的安全问题,离线打包无法使用)
  2. 插件市场的付费原生插件(因为插件版权问题,离线打包无法使用)

HBuilderX2.9.9版本新增Android平台安心打包功能,不再提交应用代码及打包证书到云端服务器,同时也减轻云端打包机压力,缩短高峰期云端打包等待时间。
HBuilderX3.0.7版本新增iOS平台支持安心打包功能(仅支持MacOS)

安心打包原理

  • 首次打包
    1. HBuilderX会提交App的模块配置信息到云端,在云端打包机生成原生代码包(不包含应用代码、证书信息)
    2. HBuilderX下载原生代码包,在本地电脑上将应用代码添加到原生代码包中,生成未签名安装包
    3. 缓存原生代码包,用于下次打包复用
    4. 在本地电脑上使用打包证书对未签名安装包进行签名操作,生成安装包
  • 非首次打包
    1. HBuilderX判断缓存的原生代码包是否可以复用,如果没有修改App模块配置或影响原生代码包配置操作继续下一步,否则转首次打包流程,以下情况也会触发首次打包流程:
      • 使用了uni原生插件,本地无法判断原生插件是否更新了,因此项目中只要包含uni原生插件都会走首次打包流程
      • HBuilderX更新,本地缓存原生代码包需要更新,需要走首次打包流程生成新版本原生代码包
    2. 将修改后的应用代码添加到原生代码包中,生成未签名安装包
    3. 在本地电脑上使用打包证书对未签名安装包进行签名操作,生成安装包

因为大多数打包,并不改动原生部分(主要是manifest.json),只修改前端代码。此时将无需从云端打包机下载原生包,打包速度会非常快。

安心打包优势

  • 更安全:打包时不提交应用代码、证书等信息
  • 更快速:非首次打包时不用提交云端打包机排队等待,本地直接出包
  • 省流量:减少了打包时提交打包资源,非首次打包时不用下载原生代码包
  • 更便宜:除非使用了体积很大的本地原生插件,否则将难以突破40M的免费打包体积阀值。开发者和DCloud的成本双下降

使用安心打包

新版本HBuilderX云端打包时无需额外操作,默认会勾选“安心打包”,如下图所示:

如果没有安装安心打包插件,会弹出以下提示框,点击“安装”继续

插件安装完成后需重新点击“打包”按钮提交打包

打包完成后自动保存到项目的"unpackage/release/apk/"目录

如果清空了这个目录,那么下次打包将执行首次打包逻辑。

注意事项

  • Windows环境:仅Android平台支持安心打包,iOS暂不支持;MacOSX环境:Android和ios都支持安心打包。
  • 自定义调试基座不支持安心打包
  • 使用DCloud老版证书不支持安心打包
  • 使用原生混淆时,配置的待加密js文件需要提交到云端打包机(打包完成后自动清除这些js)
  • 安心打包并非纯离线打包,虽然证书和前端代码不再提交云端打包机,但项目的manifest中的模块配置、本地原生插件、原生混淆配置的前端文件,仍需提交才能出包
  • iOS平台安心打包无法兼容swift,如果uni原生插件使用swift开发,提交appstore提示“ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it.”错误时,请改用传统打包

FAQ

  • 安心打包是否有免费打包次数限制?
    打包次数限制是为了避免部分开发者过多占用云端打包资源而增加的限流措施,在使用安心打包时,由非首次打包机制生成的安装包由于不占用云端打包资源,所以不会占用云端免费打包次数,也可以理解为安心打包非首次打包无打包次数限制。

Android 安心打包问题汇总

Q1: Windows:控制台提示打包成功,相应目录下没有apk文件

问题: 某些用户反馈,windows电脑,控制台提示Android安心打包成功,进入相应目录(unpackage/release/apk),目录下找不到apk文件
原因 :unpackage/release/apk目录,没有写入权限,移动apk文件失败了。

解决方法:

  1. 赋予unpackage/release/apk目录写入权限
  2. 重启电脑试试

Q2: fakeLogOpen(/dev/log_crash) failed

某些情况下,首次提交安心打包,您可能会遇到下列错误:

[Error] W: fakeLogOpen(/dev/log_crash) failed  
[Error] W: fakeLogOpen(/dev/log_stats) failed  
[Error] W: fakeLogOpen(/dev/log_stats) failed  
[Info] I: Copying libs... (/lib)  
[Info] I: Building apk file...  
[Info] I: Copying unknown files/dir...  
[Info] I: Built apk...  
[Error] Apk tool compile package to apk failed  
[Info] 制作结果:Failed. Reason:

解决方法: 重新提交安心打包

Q3: 启动图.9.png格式问题

错误日志中,出现如下日志:

[Error] W: ERROR: 9-patch image C:\xxxxx\res\drawable-hdpi\splash.9.png malformed.  
[Error] W: No marked region found along edge.  
[Error] W: Found along top edge.

原因: 启动图xxx.9.png不是有效9.png图片,格式错误导致。
解决方法: 重新生成有效的9.png图片

备注: 部分用户可能会提问,同样.9.png项目,为什么传统打包成功,安心打包失败呢?因为:安心打包校验机制更为严格。
文档: .9.png图片相关文档

Q4: Error occurred during initialization of VM

错误日志中,出现如下日志:

[Info] Error occurred during initialization of VM  
[Info] Could not reserve enough space for 1048576KB object heap  
[Error] 制作结果:Failed.    Reason: 

解决方法:

  1. 找到安心打包插件(app-safe-pack)目录下app-safe-pack.ini文件
  2. 将文件内容里-Xmx1024M修改为-Xmx512M
  3. 重新提交打包

备注: HBuilderX 3.1.10及以上版本生效

ios 安心打包问题汇总

Q1: 打包失败,签名失败errSecInternalComponent错误

错误日志中,出现如下日志:

[Error] HBuilder.xcarchive/Payload/HBuilder.app: replacing existing signature  
[Error] Warning: unable to build chain to self-signed root for signer  "xxxxxxxxxx“”  
[Error] HBuilder.xcarchive/Payload/HBuilder.app: errSecInternalComponent

原因: 可能是用户手动点击安装了证书导致打包签名失败。
解决方法: 打开钥匙串访问删除相关用户手动安装的证书后重新打包(下图仅供参考,需开发者判断哪些证书是手动安装的证书)。

安心打包问题反馈

如果您遇到安心打包问题,且无法解决,请加QQ群182151114。
进群需要提供操作系统HBuilderX版本号信息,提问请提交错误日志截图
本群仅限反馈安心打包问题,请勿发布无关信息。

25 关注 分享
DCloud_heavensoft 9***@qq.com DCloud_uniCloud_JSON 4***@qq.com swpupeng 老哥教教我 BaseCloud 活泉 大叔刘 typer sonicsunsky 海中月是天上月 梦尋Junjie 梁飞鸿 skysowe 小菜啊 x***@163.com 3***@qq.com Ran1ever1 1***@qq.com 我这边 a***@163.com 2***@qq.com 1***@qq.com 2***@qq.com

要回复文章请先登录注册

鸟大了

鸟大了

回复 BoredApe :
请暂时请先使用云端打包。下个版本会解决这个问题。
什么时候更新呢,挺喜欢这个功能的?
2022-09-24 09:25
鸟大了

鸟大了

回复 BoredApe :
什么时候更新呢,挺喜欢这个功能的?
2022-09-24 09:24
BoredApe

BoredApe

回复 sidneylv :
请暂时请先使用云端打包。下个版本会解决这个问题。
2022-09-22 14:18
3***@qq.com

3***@qq.com

我通过hbuilderx原生云打包uniapp成apk安装的时候显示系统不兼容怎么解决啊
2022-09-22 09:54
sidneylv

sidneylv

更新3.6.3后,本地打包一直失败,报错:attribute name has invalid character‘*’
2022-09-22 08:34
DCloud_HB_WDL

DCloud_HB_WDL

回复 Jiucep :
菜单【工具】【插件安装】,找到App云打包插件,将这个插件卸载。然后再次提交打包,则会自动安装此插件
2022-09-21 11:14
Jiucep

Jiucep

回复 DCloud_HB_HXY :
只有个安心打包插件,要把这个插件卸载吗
2022-09-21 11:02
3***@qq.com

3***@qq.com

3.6.3.20220917 安心打包更新后打包出现这个
2022-09-21 09:09
3***@qq.com

3***@qq.com

[Info] 正在制作apk安装包...

[Info] I: Using Apktool 2.4.1 on __UNI__9E58AE6_cm.apk
[Info] I: Loading resource table...
[Info] I: Decoding AndroidManifest.xml with resources...
[Info] I: Loading resource table from file: C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\apktool\1.apk
[Info] I: Regular manifest package...
[Info] I: Decoding file-resources...
[Info] I: Decoding values */* XMLs...
[Info] I: Copying raw classes.dex file...
[Info] I: Copying raw classes2.dex file...
[Info] I: Copying raw assets/39285EFA.dex file...
[Info] I: Copying assets and libs...
[Info] I: Copying unknown files...
[Info] I: Copying original files...
[Info] begin replace files to apk...
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-hdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-hdpi/icon.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-hdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-hdpi/icon.png] success.
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-xhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xhdpi/icon.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-xhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xhdpi/icon.png] success.
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-xxhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xxhdpi/icon.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-xxhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xxhdpi/icon.png] success.
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-xxxhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xxxhdpi/icon.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/icon-android-xxxhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xxxhdpi/icon.png] success.
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/splash-android-hdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-hdpi/splash.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/splash-android-hdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-hdpi/splash.png] success.
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/splash-android-xhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xhdpi/splash.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/splash-android-xhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xhdpi/splash.png] success.
[Info] begin copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/splash-android-xxhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xxhdpi/splash.png]...
[Info] copy file[E:/daiai/源码修改/抖米前端代码/代还/厚德未来/unpackage/cache/wgt/__UNI__9E58AE6/.manifest/splash-android-xxhdpi.png] to [C:/Users/MSI/AppData/Local/HBuilder X/AndroidPackWork/cache/__UNI__9E58AE6/packge_cache/__NONE__/__UNI__9E58AE6_cm/res/drawable-xxhdpi/splash.png] success.
[Info] begin update files to apk...
[Error] try compile package:0
[Info] I: Using Apktool 2.4.1
[Info] I: Copying C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm classes.dex file...
[Info] I: Copying C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm classes2.dex file...
[Info] I: Checking whether resources has changed...
[Info] I: Building resources...
[Error] W: C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\AndroidManifest.xml:44: Tag <action> attribute name has invalid character '*'.
[Error] brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\MSI\AppData\Local\Temp\brut_util_Jar_9830745402336190573.tmp, p, --forced-package-id, 127, --min-sdk-version, 19, --target-sdk-version, 28, --version-code, 100, --version-name, 1.0.0, --no-version-vectors, -F, C:\Users\MSI\AppData\Local\Temp\APKTOOL842214537742766454.tmp, -e, C:\Users\MSI\AppData\Local\Temp\APKTOOL14504153837625312423.tmp, -0, arsc, -I, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\apktool\1.apk, -S, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\res, -M, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\AndroidManifest.xml]
[Error] try compile package:1
[Info] I: Using Apktool 2.4.1
[Info] I: Checking whether resources has changed...
[Info] I: Building resources...
[Error] W: C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\AndroidManifest.xml:44: Tag <action> attribute name has invalid character '*'.
[Error] brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\MSI\AppData\Local\Temp\brut_util_Jar_3862102641280923487.tmp, p, --forced-package-id, 127, --min-sdk-version, 19, --target-sdk-version, 28, --version-code, 100, --version-name, 1.0.0, --no-version-vectors, -F, C:\Users\MSI\AppData\Local\Temp\APKTOOL2277434418544808952.tmp, -e, C:\Users\MSI\AppData\Local\Temp\APKTOOL15896307195222606409.tmp, -0, arsc, -I, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\apktool\1.apk, -S, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\res, -M, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\AndroidManifest.xml]
[Error] try compile package:2
[Info] I: Using Apktool 2.4.1
[Info] I: Checking whether resources has changed...
[Info] I: Building resources...
[Error] W: C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\AndroidManifest.xml:44: Tag <action> attribute name has invalid character '*'.
[Error] brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\MSI\AppData\Local\Temp\brut_util_Jar_16403110092439359461.tmp, p, --forced-package-id, 127, --min-sdk-version, 19, --target-sdk-version, 28, --version-code, 100, --version-name, 1.0.0, --no-version-vectors, -F, C:\Users\MSI\AppData\Local\Temp\APKTOOL11465418205353203627.tmp, -e, C:\Users\MSI\AppData\Local\Temp\APKTOOL2307533247307633324.tmp, -0, arsc, -I, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\apktool\1.apk, -S, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\res, -M, C:\Users\MSI\AppData\Local\HBuilder X\AndroidPackWork\cache\__UNI__9E58AE6\packge_cache\__NONE__\__UNI__9E58AE6_cm\AndroidManifest.xml]
[Error] Apk tool compile package to apk failed
[Error] 制作结果:Failed. Reason:
2022-09-21 09:08
z***@163.com

z***@163.com

回复 DCloud_HB_HXY :
已解决
2022-09-20 14:43