Cocoscreator 打包 Android 踩坑笔记

开发环境:
cocoscreator 2.0.10
Android studio 3.3.2
grandle 版本 gradle-4.10.3-all
ndk版本 r16b
sdk版本 28

本来没打算记录的,但是转念一想,要是能够帮助到其他人呢,所以还是记录一篇。
若有写的不对的,欢迎帖子下面留言指出。

**

第一坑:C++回调js崩溃

**
_ [FATAL ERROR] location: v8::HandleScope::CreateHandle(), message: Cannot create a handle without a HandleScope_

造成这个错误的直接原因是,在C++调用js之前,没有声明 se::AutoHandleScope hs;
解决方法:在调用之前加上这个声明就OK了

第二坑:C++利用 evalString()函数回调js,传递字符串

C++回调代码

错误日志:
E/jswrapper: ERROR: Uncaught SyntaxError: Invalid or unexpected token, location: (no filename):0:0
E/jswrapper: ScriptEngine::evalString script (no filename), failed!

关于这个坑,只能说是自己大意了,或者是想偷懒造成的坑,因为刚开始测试的时候,回传参数就写了个数字,然后一切都没问题,于是乎就以为一切都OK了。
然而当你的参数涉及到字符串的时候,坑就出现了,你打印charStr这个字符串,发现没问题,然后之前调用cc.quicksdk.notifyLoginResult(0) 也没问题,
为什么参数传多了就报 no filename 了呢。
解决方案:

解决方案也是比较简单,就是将字符串进行转译,至于为什么,我觉得明白的早已明白,不明白的,思考一下也能明白。说到底,这个坑是自己偷懒造成的,因为本可以把回调函数也注册进C++,这样C++这边就不需要使用evalString来回调js了。

第三坑:js调用的C++ bool函数,没有写return

C++代码如下

又给自己挖了一个坑,先看错误日志吧
错误日志:
2020-03-13 11:04:52.935 28032-28120/com.jsgame.helloworld D/cocos2d-x: js_engine_SdkBridge_updateRoleInfoWith
2020-03-13 11:04:52.936 28032-28120/com.jsgame.helloworld D/cocos2d-x: QuickSDK::updateRoleInfoWith…
2020-03-13 11:04:52.936 28032-28120/com.jsgame.helloworld D/QKManager: setGameRoleInfo
2020-03-13 11:04:52.937 28032-28120/com.jsgame.helloworld D/BaseLib Cu: sci
2020-03-13 11:04:52.937 28032-28120/com.jsgame.helloworld D/BaseLib Cu: ac2i
2020-03-13 11:04:52.938 28032-28120/com.jsgame.helloworld D/quicksdk apiadapter.undefined: setGameRoleInfo
2020-03-13 11:04:52.938 28032-28155/com.jsgame.helloworld D/BaseLib Cu: iue
2020-03-13 11:04:52.938 28032-28155/com.jsgame.helloworld D/BaseLib Cu: gcl
2020-03-13 11:04:52.938 28032-28155/com.jsgame.helloworld D/BaseLib Cu: gcc
--------- beginning of crash
2020-03-13 11:04:52.939 28032-28120/com.jsgame.helloworld A/libc: Fatal signal 4 (SIGILL), code 1, fault addr 0xcb70b9ec in tid 28120 (GLThread 4283)

这个坑属于粗心大意,在C++跟js之间来回切换,造成了疏忽,好在比较容易解决,不过崩溃报的错算是怎么回事么,害的我一直以为是线程问题,找了好一会问题。
解决方案:


既然没返回值,那就 void 就完事了。

第四坑:Android debug包正常,Release启动崩溃。

错误日志:
java.lang.RuntimeException: Unable to create application com.ct108.mnby.MyApplication: java.lang.NullPointerException: Attempt to invoke interface method ‘com.b.a.a com.b.a.b.a()’ on a null object reference

这个也百度了不少帖子,各种答案各种不同的修复,可就是没有对口的方案,后来问一大佬同事,大佬一语击中了我,

混淆,我勒个擦擦啊,在大佬的提示,我在android的app目录下,找到了
这个文件,打开文件,照葫芦画瓢,把两个第三方的jar包丢进去,OK,一切正常了,世界终于清净了。

顺带把自己写的工具类也丢进去。

第五坑:Android动态权限获取

关于动态权限获取,其实网络上也有比较多的流行方案,https://www.jianshu.com/p/6e306729bb0d 这只是一个参考,里面写了当下比较流行的两种
Easy Permissions 跟 Permissions Dispatcher
具体怎么选择,每个人都有自己不同的观点,我选择了 Easy Permissions,集成起来也比较得方便,官方得github也写得比较详细
github传送门:https://github.com/googlesamples/easypermissions
我照着官方的,集成了这个版本

这里需要注意的一点就是,看一下官方对sdk的要求

重点,你的sdk版本必须是28,
OK,注意到这个之后,其他的就没有问题了。

第六坑:Android studio 打签名包报错

Android studio 签名 报错:Could not download groovy-all.jar (org.codehaus.groovy:groovy-all:2.4.12)

好吧,继续万能的百度吧,
方法一:在Android的APP目录下,找到build.gradle文件,在android{}的里面加入下面的代码

神奇也是神奇,签名包是打出来了,没有卡在签名了,然而启动就崩溃了,maybe问题在其他地方。
方法二:替换下载站,把Android工程的build.gradle文件里面的下载站更换,

就这两个地方,然后把方法一的方式注释,OK,签名包也是顺利的出来了,再启动一下,好了,游戏正常运行。
所以呢,还是因为墙内用户的锅。

第七坑:Android端APP,websocket的wss连接失败

报错内容,跟论坛里的一位帖子类似 https://forum.cocos.org/t/websocket-ssl/60024,而且这帖子的主人也分析的很细致了,我遇到的问题基本跟他一致,只是解决方式略微的不同,所以记录一下,以便其他遇到问题的开发者参考。
错误日志的关键语句:
CA Root file isn’t set. SSL connection will not peer server certificate
Creating Vhost ‘default’ port -1, 1 protocols, IPv6 on
server’s cert didn’t look good, X509_V_ERR = 20: error:00000014:lib(0):func(0):reason(20)
WebSocket (0xc616f900) onConnectionError, state: 0 …
WebSocket (0xc616f900) onConnectionClosed, state: 2 …
onConnectionClosed, WebSocket (0xc616f900) is closing by server.
WebSocket (0xc616f900) onConnectionClosed DONE!

解决方式:上代码吧,看的直接点

md5这个要看你构建的时候是不是勾选了MD5 cache的选项,所以这样写必然是OK的。
至于第三个参数的提示飘红,你可以直接忽略,或者直接看一下cocos的源码
在 jsb_websocket.cpp的WebSocket_constructor这个函数中,你会看到这么一个调用


so,你就放心大胆的用吧,管它飘红不飘红。

好像差不多就踩了这些坑吧, 后续要是有想起来其他的,再补上。

13赞

mark

mark

mark

楼主的精神值得学习,不打算升级引擎吗?
我的一个小项目从2.2.2升级到2.3.1 ,其他平台都正常,就android 启动就挂掉,折腾了一天多,没搞定,放弃了,

稳,先mark

2.3.1对Android工程的结构都调整了

mark

是,调整了好折腾,之前用2.2.2都一切正常,用2.3.1新建了一个ts的工程打包Android 又是好的,对比了之后也调整了,但是还是出问题,

mark

参考官方文档进行替换。我刚开始也是打包失败,我这边是app/jni文件夹下Android.mk有过修改。修改到根目录下jni的CocosAndroid.mk。还有在settings.gradle中把game,instance从include里去掉,再gradle下,我这边打包正常了

1赞

mark
阿斯达

mark111111

mark~~~~~~

请问是将ca证书放在resources下使用吗,我设置了ca证书还是一直报CA Root file isn’t set

mark 权限部分解决了我遇到的问题。

mark一下

mark一小下

这个要记下来,万一碰到了呢!!!

打包是没有问题,就是wss连接不上2.4.3版本的