Cordova 构建不包括 APK 中的 dojo _base 文件夹

Cordova build not including dojo _base folder in APK

我正在更新 Cordova 移动应用程序中的 dojo 库。 运行 在浏览器中更新应用程序(使用 Cordova-simulate)时一切正常。当 运行 我的应用程序在模拟器或设备上时,我收到如下错误:

Unable to open asset URL: file:///android_asset/www/scripts/lib/3.32/dojo/_base/Url.js```

当我检查我的 .apk 文件时,错误是有道理的,因为 _base_firebug 文件夹有没有被复制到apk中。

_base and_firebug 文件夹在应用程序构建过程中已正确复制到 platforms 文件夹,但未包含在最终 APK 中。据我所知,问题是这些文件夹名称以下划线字符开头。

我将 _base 和 _firebug 重命名为 base 和 firebug。再次构建后,我能够确认它们已包含在 APK 中。这似乎证实下划线是阻止目录被包含的原因。

我发现这个 2014 post dojo/_base/*js missing from worklight apk in wl 6.1 是同一个基本问题。我尝试了建议的修复,但 Android 在安装时拒绝了我的 apk,并出现以下错误。 post 已经 6 岁了,所以显然有些东西已经改变了,或者我做的事情完全错了。可能两者都有。

adb: failed to install app-debug.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl633061898.tmp/base.apk: META-INF/CERT.SF indicates /data/app/vmdl633061898.tmp/base.apk is signed using APK Signature Scheme v2, but no such signature was found. Signature stripped?]

理想情况下,我想指定一些命令行选项(或 build-extras.gradle 选项,或其他)来强制构建过程包含 _base_firebug 个文件夹。

或者,如果有人 link 清楚说明如何解压缩、修改、重新压缩、签名和对齐我的 APK,那也会非常有帮助。

如有任何建议,我们将不胜感激。

提前致谢。

这不是我想要的完美(最简单)的解决方案,但它对我有用。也许它会帮助其他使用 dojo/_base 库遇到同样问题的人。

TL;DR 我在构建过程中添加了一个 before_compile 挂钩,手动将 _base 文件夹复制到位。

为此,我首先使用 npm 将 fs-extra 安装到我的项目中。

npm i fs-extra

接下来,我在我的项目根文件夹中添加了一个 ./build_modifications/before_compile/ 文件夹,并创建了文件 beforeCordovaCompile.js.

#!/usr/bin/env node

// required node modules

var fs = require('fs-extra');

module.exports = function(context) {

var androidFrom = 'C:\Users\username\git_repos\projectfolder\platforms\android\app\src\main\assets\www\scripts\lib\3.32\dojo\_base';
var androidTo = 'C:\Users\username\git_repos\projectfolder\platforms\android\app\build\intermediates\merged_assets\debug\out\www\scripts\lib\3.32\dojo\_base';

// function that copies resource files to chosen platform
function filesToCopy(fromFolder, toFolder) {

    console.log('copying ' + fromFolder + ' to ' + toFolder);

    try {
        fs.copySync(fromFolder, toFolder);
        console.log('success!');
    } catch (err) {
        console.error(err);
    }
}

filesToCopy(androidFrom, androidTo);
};

最后,我将 hook 元素添加到我的 config.xml 中。在哪里 ”。”等于我的项目文件夹根目录。

<hook type="before_compile" src="./build_modifications/before_compile/beforeCordovaCompile.js" />

我通过执行构建进行了测试,它将 _base 文件夹包含到 merged_assets 文件夹和我的 apk.

cordova build android --debug --buildConfig=C:/Users/username/git_repos/projectfolderDevSupport/signing/build.json

注意 1:当我第一次检查我的 apk 时,我非常失望,因为我没有看到 _base 文件夹。最终我意识到我的 zip 实用程序的排序方式与 windows 不同,并且 _base 文件夹列在所有其他库文件夹之后而不是首先列出。

注2:经过一个平台remove/add,遇到这个问题我很郁闷re-occur。我不知道为什么,但出于某种原因 cordova 运行 没有像 cordova build 那样触发钩子.我对此的解决方案是先进行构建,然后再进行 运行。看来,一旦 _base 文件夹包含到 apk 中,除非您删除 apk,否则该文件夹不会被删除。