oppo快游戏小包模式 加载远程资源报错

  • Creator 版本:2.09

  • 目标平台: Android

  • 手机型号 oppo

小部分用户出现游戏黑屏进不去的现象,后发现是加载时出现报错
访问了不存在的资源

构建选项:

附上oppo方提供的报错log、红框中的资源打包出来的res里没有

log附件
logcat_R15.zip (82.4 KB)

引擎组能帮忙看一下哪里出的问题吗

真的很急好几天了 连个回复都没有, 要是自己能解决也不用上论坛问了

@jare @panda @huanxinyin @BigBear
能否帮忙分析一下

我这碰上的情况比你那还严重点,我打出来rpk,进去就是黑的~你这个log是怎么显示出来的?

我也遇到了类似的情况,打包rpk后,logcat查看的时候,会发现调到jsb里面的api去加载远程的配置文件,这个jsb可能是oppo那边适配rpk的,因为他们是当成原生平台,我在想直接用xmlhttprequest加载不知道行不行

你这个是cc.sys.isNative为true导致的,你们可能用了jsb的东西,不存在就黑屏了,我之前也是这样,
log用AndroidStudio 的logcat 查看日志,标签是这个jswrapper: JS:

1赞

貌似cc.loader.load在oppo小游戏里面,在加载json时走的逻辑如下:

downloadText = function (item) {
    var url = item.url;
    console.log('downloadText.url:',url);

    var result = jsb.fileUtils.getStringFromFile(url);
    if (typeof result === 'string' && result) {
        return result;
    }
    else {
        return new Error('Download text failed: ' + url);
    }
};
因为打成了一个rpk包,加上上面这段代码的处理,所以每次都是从本地加载的,楼主你这个加载远程的url会报错,而且oppo小游戏对资源的限制是10M,所以这里有点无解啊,看到官方适配时写了下面这段代码
var RTAdapter = window.RTAdapter = function () {
    this.id = ID;
    this.async = true;
    this.pipeline = null;
    this.REMOTE_SERVER_ROOT = 'REMOTE_SERVER_ROOT_PLACE_HOLDER';
};

请问这个REMOTE_SERVER_ROOT是不是支持从远程服务器下载资源的,但实际测试发现没有走到这里,
参考文件oppo-runtime/res下面的 rt-adapter.js
@jare @panda

找到一种解决办法,修改oppo-runtime/res/jsb-adapter/engine中修改downloadText代码如下:

let downloadBinary, downloadText, loadFont;
downloadText = function (item,callback) {
    var url = item.url;
    console.log('downloadText.url:',url);

    if(url.startsWith("http://") || url.startsWith("https://")){
        if(callback){
            console.log('downloadText getXMLHttpRequest')
            var xhr = cc.loader.getXMLHttpRequest(),
                errInfo = 'Load text file failed: ' + url;
            xhr.open('GET', url, true);
            if (xhr.overrideMimeType) xhr.overrideMimeType('text\/plain; charset=utf-8');
            xhr.onload = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200 || xhr.status === 0) {
                        callback(null, xhr.responseText);
                    }
                    else {
                        callback({status:xhr.status, errorMessage:errInfo + '(wrong status)'});
                    }
                }
                else {
                    callback({status:xhr.status, errorMessage:errInfo + '(wrong readyState)'});
                }
            };
            xhr.onerror = function(){
                callback({status:xhr.status, errorMessage:errInfo + '(error)'});
            };
            xhr.ontimeout = function(){
                callback({status:xhr.status, errorMessage:errInfo + '(time out)'});
            };
            xhr.send(null);
        }
    }else{
        var result = jsb.fileUtils.getStringFromFile(url);
        if (typeof result === 'string' && result) {
            return result;
        }
        else {
            return new Error('Download text failed: ' + url);
        }
    }
};

这样在下载远程文件的时候,就能正常跑过了,但是oppo要求,游戏提供包体不能超过 10M,之前没看到要求,我们的有37M,感觉还是悲剧了

我遇到的问题实际上是item.url访问的文件不存在, 跟后面的jsb.fileUtils.getStringFromFile大概率没关系

楼主,我遇到的问题和你一模一样,请问解决了吗

https://forum.cocos.com/t/topic/79066/7
才发现自己的也是这个问题