3.8.x 构建原生, 多渠道sdk问题

目前在构建面板选择构建原生(ios、android)
会同时在项目路径下创建一个native目录。
所有构建后的路径都是软连native/平台文件。
因为native这个目录是构建时默认创建

那么现在有一个问题。。

我要接sdk1
构建ios时, build/ios/proj软连到native。我把所有的sdk1的各种库和代码添加到了naitive/平台/目录内

我又要接sdk2, 怎么办?
构建的ios1,build/ios/proj软连还的native, 这个时候native怎么区分?

1赞

方法一:同一个文件内,不同的渠道代码,用宏来区分
方法二:不同的驱动用不同的文件,不同渠道导入不同的文件
方法三:不同的渠道不同的文件夹,导入对应的文件夹
方法四:导入外部文件

大佬, 有没有方案能在构建时, 新建一个native1的目录这种。

写个后处理 复制native目录, 然后修改gradle.properties中的NATIVE_DIR 指向复制的目录

你得学习gradle多渠道处理了,我之前做的项目就是,一个安卓工程里相同的部分放在公共module,其他渠道各自一个module,各自接自己的sdk,打包的时候选对应的渠道打包就行,真的执行起来也是很麻烦的,需要一定安卓知识。后面做的项目直接跟发行合作,他们出一个sdk,我们只接这一个sdk之后,打出母包给他们,他们再用自己的打包工具分出渠道包,这样就很方便了。

这个比较简单,我们是做到打包系统的脚本里面,打包的一个步骤是资源替换,就是会把指定目录下的diff(包括资源,代码,工程)替换到工程目录下。

不同渠道就是 build.py -r a_channel 和 build.py -r b_channel . 会把a_channel或者b_channel 的相同路径文件合并进工程目录。打完包还原就可以了。
做到jenkins里面,就一个下拉列表,可以选择用哪个diff。

像你这个需求,就是在a_channel/native/engine/android/ 下面接a sdk,在b_channel/native/engine/android/ 下面接b sdk 就行了。可以事先工程里面接好,然后复制进diff目录就好。

另外建议正式打包还是不要走编辑器的面板打包,自定义的地方比较少,建议导出json以后使用命令行打包,然后外面包个python做本地打包,再外面包个jenkins做打包机打包。

最简单是让引擎组解决,不要所有构建任务共用一个native目录就好了 @minggo

我们后续看下怎么不破坏兼容性的情况下做到。

我通过查看引擎构建源码, 在native-pack-tool/dist/utils.js内Paths结构。


发现写死的native路径,
这块我个人认为应该暴漏出来,或者是在构建面板加个参数控制之类的。


最简单的办法

我自己的做法是第一次打包先整理出一个干净的xcode项目,然后之后的打包只copy data文件,你接sdk都在native里操作,这样新生成的native不用管,因为新构建也只是游戏数据不一样,这样我自己还可以对构建后的项目进行结构定制处理,因为我现在是喜欢用swift来写sdk,我就要把原来的项目都oc文件调用改造一下,我把入口文件重新用swift写,cocos的东西写成一个bridge,cocos.start()这种感觉,相当于也是一个sdk的感觉,这样就好操作多了。我个人开发自己的一点经验。望指导!

看了一下还是我这个办法最好,不仅是替换sdk,任意工程,配置,代码,资源都可以替换。还是自己构建打包系统好啊。

但是你这个,依旧需要每个渠道包构建+发布吧。如果你要打30个渠道包,这个总打包时长不是很尴尬

image 需要打哪个包就把对应文件夹名字改成native

打母包即可,后续发行会直接用母包出渠道包。
不用母包的方式(解包替换再装包),其实每次也是要build的。一样避免不了打包时长。

天才~~~

把构建流程中CocosParams.platformName 暴露出来,让用户可以配置就能完美解决这个问题。

3.8.3和3.8.4测试通过了

export const onBeforeBuild: BuildHook.onBeforeBuild = async function (options: ITaskOptions, result: IBuildResult) {
CUR_DIR_NAME = 指定native下原生工程目录名;
if (HACK_FALG) {
return;
}
HACK_FALG = true;
let modulePath = path.join(path.dirname(Editor.App.path), “/resources/3d/engine/scripts/native-pack-tool”);
let module = require(modulePath);
if (!module) {
throw new Error(查找不到 native-pack-tool模块,path:${modulePath});

}
let poolMap = module.nativePackToolMg.PackToolMap;
const HackList = ['android', 'ios'];
for (let i = 0, len = HackList.length; i < len; i++) {
    let obj = HackList[i];
    let classInts = poolMap[obj];
    let old = classInts.init;
    let newInit = function (...args) {
        args[0].platformName = CUR_DIR_NAME;
        old.apply(classInts, args);
    };
    classInts.init = newInit;
}

};
找一个构建流程插件的hook文件替换就行。ps:记得修改参数CUR_DIR_NAME;
具体源码可以看native-pack-tool。 所有的平台都是通过这个打包模块构建,里面有构建需要的参数。
这方法就是强制复写platformName这个参数。来制定native/android/** 这个andorid目录名

请问下如果是自定义引擎,这里的modulePath路径应该怎么写?

哈哈哈哈,终于也看到了这么用的了。。我都是native_raw native_xxx native_yyy …