2025-07-15 14:28:55.708 1573-1586 memtrack system_server E Couldn't load memtrack module 2025-07-15 14:28:56.419 1352-1352 SELinux servicemanager E avc: denied { find } for service=tab pid=2761 uid=10051 scontext=u:r:untrusted_app:s0:c51,c256,c512,c768 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=1 2025-07-15 14:28:57.008 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x000082da 2025-07-15 14:28:57.008 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x000082e5 2025-07-15 14:28:57.013 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x00008c29 2025-07-15 14:28:57.014 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x000087fe 2025-07-15 14:28:57.037 2761-2790 EGL_emulation org.cocos2d.demo E tid 2790: eglSurfaceAttrib(1493): error 0x3009 (EGL_BAD_MATCH) 2025-07-15 14:28:58.749 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::onGetStringFromFile stream not found, possible missing file. 2025-07-15 14:28:58.749 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::runScript script stream, buffer is empty! 2025-07-15 14:28:58.749 2761-2788 jswrapper org.cocos2d.demo E [ERROR] Failed to invoke require, location: C:/ProgramData/cocos/editors/Creator/2.4.13/resources/cocos2d-x/cocos/scripting/js-bindings/manual/jsb_global.cpp:299 2025-07-15 14:28:58.785 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::evalString catch exception: 2025-07-15 14:28:58.805 2761-2788 jswrapper org.cocos2d.demo E ERROR: Uncaught ReferenceError: self is not defined, location: src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js:0:0 STACK: [0]anonymous@src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js:2 [1]anonymous@src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js:3 [2]anonymous@jsb-adapter/jsb-engine.js:2975 [3]download@jsb-adapter/jsb-engine.js:2984 [4]downloadScript@jsb-adapter/jsb-engine.js:2971 [5]a@src/cocos2d-jsb.28d62.js:16668 [6]anonymous@src/cocos2d-jsb.28d62.js:16678 [7]retry@src/cocos2d-jsb.28d62.js:18111 [8]download@src/cocos2d-jsb.28d62.js:16663 [9]load@src/cocos2d-jsb.28d62.js:17318 [10]94.e.exports@src/cocos2d-jsb.28d62.js:17134 [11]_flow@src/cocos2d-jsb.28d62.js:17579 [12]async@src/cocos2d-jsb.28d62.js:17574 [13]anonymous@src/cocos2d-jsb.28d62.js:17261 [14]forEach@src/cocos2d-jsb.28d62.js:18189 [15]94.e.exports@src/cocos2d-jsb.28d62.js:17244 [16]_flow@src/cocos2d-jsb.28d62.js:17579 [17]anonymous@src/cocos2d-jsb.28d62.js:17586 [18]98.e.exports@src/cocos2d-jsb.2 2025-07-15 14:28:58.807 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::evalString script src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js, failed! 2025-07-15 14:28:58.807 2761-2788 jswrapper org.cocos2d.demo E [ERROR] Failed to invoke require, location: C:/ProgramData/cocos/editors/Creator/2.4.13/resources/cocos2d-x/cocos/scripting/js-bindings/manual/jsb_global.cpp:299 2025-07-15 14:29:01.667 1450-1471 storaged storaged E getDiskStats failed with result NOT_SUPPORTED and size 0 2025-07-15 14:29:11.348 1715-2033 bt_btif com.android.bluetooth E register_notification_rsp: Avrcp device is not connected, handle: 0x0 2025-07-15 14:29:11.348 1715-2033 bt_btif com.android.bluetooth E register_notification_rsp: Avrcp device is not connected, handle: 0x0 2025-07-15 14:29:11.476 1452-1452 OMXNodeInstance media.codec E setConfig(0xf5210060:google.mp3.decoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001) 2025-07-15 14:29:11.476 1452-1452 OMXNodeInstance media.codec E getConfig(0xf5210060:google.mp3.decoder, ConfigAndroidVendorExtension(0x6f100004)) ERROR: Undefined(0x80001001) 解决问题
时间: 2025-07-20 17:28:04 浏览: 6
<think>我们正在处理一个Android应用程序(org.cocos2d.demo)的日志错误。错误主要涉及以下几个方面:
1. 内存跟踪模块加载失败(memtrack module)
2. SELinux权限问题(avc: denied)
3. OpenGL相关错误(eglCodecCommon, EGL_emulation)
4. JavaScript引擎执行错误(jswrapper)
我们将逐一分析并尝试提供解决方案:
1. **memtrack模块加载失败**:
这个错误通常是由于设备或模拟器上的memtrack内核模块缺失或不可用。memtrack用于跟踪应用程序的内存使用情况。对于开发者来说,这通常不会影响应用程序的功能,但可能影响内存分析工具的使用。
- 解决方案:如果是在模拟器上运行,尝试使用不同的模拟器镜像(例如使用Google Play的镜像)。如果是真机,可能无法解决,因为它需要内核支持。忽略此错误可能不会影响应用运行。
2. **SELinux权限问题**:
日志显示:`avc: denied { find } for service=tab ...`。这表示应用程序(untrusted_app)在尝试查找名为"tab"的服务时被SELinux拒绝。
- 解决方案:需要修改SELinux策略以允许此操作。但作为应用开发者,我们通常无法直接修改系统策略。可以尝试以下方法:
a. 确保在AndroidManifest.xml中声明了所需的权限。
b. 如果服务是自定义服务,确保服务被正确声明并且可被调用。
c. 如果是系统服务,可能需要系统签名或者系统权限。在非系统应用中使用系统服务可能会受到限制。
3. **OpenGL相关错误**:
错误包括:
- `glUtilsParamSize: unknow param ...`:这些参数是OpenGL扩展的一部分,可能模拟器或设备不支持。
- `eglSurfaceAttrib(1493): error 0x3009 (EGL_BAD_MATCH)`:通常表示在设置表面属性时参数不匹配,比如在创建EGL窗口表面时使用了不支持的属性。
- 解决方案:
a. 检查代码中设置OpenGL属性的地方,确保参数正确。
b. 如果使用模拟器,尝试使用不同的渲染模式(如切换到软件渲染或使用不同的模拟器镜像)。
c. 检查OpenGL上下文创建和表面配置是否匹配。
4. **JavaScript引擎错误**:
错误信息显示:
- `ScriptEngine::onGetStringFromFile stream not found`:文件未找到,可能是路径错误或文件缺失。
- `ScriptEngine::runScript script stream, buffer is empty!`:脚本内容为空,可能是文件读取失败。
- `Uncaught ReferenceError: self is not defined`:在`gravityengine.mg.cocoscreator.min.dbb97.js`中使用了未定义的变量`self`。
- 解决方案:
a. 确保文件`src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js`存在于项目中,并且路径正确(注意大小写,因为有些文件系统区分大小写)。
b. 检查文件是否被正确打包到APK中。如果是Cocos Creator项目,确保在构建时该文件被包含在assets目录下。
c. 在代码中,`self`通常是浏览器环境中的全局对象(相当于window)。在Cocos Creator的JSB(JavaScript Binding)环境中,可能没有`self`。可以尝试在脚本开头定义`self`为全局对象(在node.js或某些环境中是global,在浏览器中是window)。在Cocos Creator中,可以使用`window`或者`globalThis`。但是,如果该脚本是设计用于Web环境的,可能需要修改以适应JSB环境。
例如,在脚本开头添加:
```javascript
if (typeof self === 'undefined') {
var self = globalThis || window; // 根据环境选择
}
```
d. 确保所有依赖的脚本文件都被正确加载,并且没有网络请求错误(在移动端可能是本地文件加载错误)。
针对上述问题,我们重点解决JavaScript引擎错误,因为这是导致应用崩溃的直接原因。
下面是一个可能的解决方案,在Cocos Creator项目中修复`self`未定义的问题:
步骤:
1. 找到文件`src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js`。
2. 在文件的最开始处添加上述代码片段,定义`self`。
但是,由于这是一个压缩过的文件(min.js),直接修改可能比较困难。因此,我们可以考虑在加载这个脚本之前,先注入一个全局的`self`定义。
在Cocos Creator中,可以在项目启动时(例如在main.js或入口脚本中)添加以下代码:
```javascript
// 在入口脚本(如main.js)的顶部
if (typeof self === 'undefined') {
global.self = global;
// 或者 global.self = window; 取决于运行环境
}
```
注意:在Cocos Creator的JSB环境中,全局对象是`global`,而在Web环境中是`window`。我们可以使用`globalThis`(ES11)来统一,但要注意目标平台是否支持。
由于Cocos Creator的JSB环境(如Android/iOS)支持`global`,而Web环境支持`window`,我们可以这样写:
```javascript
if (typeof globalThis !== 'undefined') {
self = globalThis;
} else if (typeof global !== 'undefined') {
self = global;
} else if (typeof window !== 'undefined') {
self = window;
}
```
但是,在严格模式下,给未声明的变量赋值会报错。因此,我们最好声明`self`:
```javascript
if (typeof self === 'undefined') {
if (typeof globalThis !== 'undefined') {
var self = globalThis;
} else if (typeof global !== 'undefined') {
var self = global;
} else if (typeof window !== 'undefined') {
var self = window;
}
}
```
然而,在模块作用域内使用`var`会声明一个模块级的变量,而不会成为全局变量。为了设置全局的`self`,我们可以直接赋值给全局对象:
在非严格模式下,我们可以直接写:
self = ...;
但在严格模式下,会报错。因此,我们可以通过以下方式:
```javascript
(function(globalObject) {
if (!globalObject.self) {
globalObject.self = globalObject;
}
})(typeof globalThis !== 'undefined' ? globalThis :
typeof global !== 'undefined' ? global :
typeof window !== 'undefined' ? window : this);
```
在入口脚本中执行上述代码,确保在加载其他脚本之前定义好`self`。
另外,关于文件加载失败的问题,需要检查:
- 文件路径是否正确(在项目中,路径是相对于assets的,注意构建后目录结构的变化)。
- 文件是否被正确导入到项目中,并且在构建发布时被包含。
如果问题仍然存在,可能需要检查Cocos Creator的构建配置,确保该文件被包含在构建目录中。
由于我们无法直接修改项目文件,以上代码需要由开发者集成到项目中。
下面我们给出一个在Cocos Creator入口脚本中修复全局`self`的代码示例:
```javascript
// 在main.js或项目入口脚本的最前面
(function() {
var globalObj = typeof globalThis !== 'undefined' ? globalThis :
typeof global !== 'undefined' ? global :
typeof window !== 'undefined' ? window :
typeof self !== 'undefined' ? self : {};
// 确保全局对象上存在self
if (!globalObj.self) {
try {
// 尝试给全局对象添加self属性
Object.defineProperty(globalObj, 'self', {
value: globalObj,
enumerable: false,
writable: true,
configurable: true
});
} catch (e) {
// 如果无法通过defineProperty添加(比如在IE8下),则使用赋值
globalObj.self = globalObj;
}
}
})();
```
这样,在后续加载的脚本中,`self`就会被定义为全局对象。
另外,关于文件未找到的错误,请检查:
- 文件`src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js`是否在项目中存在,并且路径正确。
- 在构建时,该文件是否被正确复制到构建目录(通常为build/assets/...)。
如果文件确实存在但无法加载,可能是由于路径大小写问题(特别是在区分大小写的文件系统上)或路径错误。在代码中,确保使用正确的路径(相对于assets目录,且大小写匹配)。
最后,关于`require`失败的问题,可能是由于文件加载失败(空文件或路径错误)导致。因此,解决文件路径和`self`定义问题后,应该可以解决。
由于问题涉及多个方面,需要逐一排查。如果问题仍然存在,请检查Cocos Creator的版本和构建配置。
由于我们无法直接运行和调试,以上提供的是基于日志的解决方案。
如果问题仍然存在,请提供更多关于项目结构的信息。
§§相关问题§§:
1. 在Cocos Creator中如何定义全局变量?
2. 如何解决Cocos Creator构建后资源文件缺失的问题?
3. 在Android开发中如何解决SELinux权限问题?
4. 在OpenGL开发中如何避免EGL_BAD_MATCH错误?</think>### 问题分析与解决方案
您提供的日志显示了 Android 应用(org.cocos2d.demo)运行时的多类错误,主要涉及:
1. **SELinux 权限问题**
2. **OpenGL/EGL 渲染错误**
3. **JavaScript 脚本加载与执行错误**
4. **内存跟踪模块问题**
以下是针对核心问题的解决方案和代码实现:
---
### 1. SELinux 权限问题解决方案
**错误信息**:
`avc: denied { find } for service=tab... tcontext=u:object_r:default_android_service:s0`
**原因**:
应用尝试访问系统服务但缺少 SELinux 权限策略。
**修复步骤**:
1. 创建 SELinux 策略文件 `my_app.te`
2. 编译并刷入设备
```bash
# 创建 SELinux 策略文件 (my_app.te)
allow untrusted_app default_android_service:service_manager find;
# 编译策略文件
checkpolicy -M -o my_app.pp my_app.te
# 推送策略到设备
adb push my_app.pp /data/security/current/sepolicy/
adb reboot
```
**说明**:
该策略允许 `untrusted_app` 域的应用查找 `default_android_service` 类型的服务。需在已 root 的设备上操作。
---
### 2. OpenGL/EGL 渲染错误解决方案
**错误信息**:
`eglSurfaceAttrib(1493): error 0x3009 (EGL_BAD_MATCH)`
**原因**:
EGL 表面属性配置不兼容(常见于模拟器或 GPU 驱动问题)。
**修复代码**(在 Cocos Creator 渲染初始化时添加):
```cpp
// 在 AppDelegate.cpp 中修改 EGL 配置
bool AppDelegate::applicationDidFinishLaunching() {
// 修改 EGL 配置
EGLint attribs[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_DEPTH_SIZE, 0, // 禁用深度缓冲
EGL_STENCIL_SIZE, 0,// 禁用模板缓冲
EGL_NONE
};
// 应用新配置
auto glView = GLViewImpl::createWithRect(
"MyGame",
cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height),
1.0f,
true,
attribs // 传入自定义属性
);
director->setOpenGLView(glView);
}
```
**关键修改**:
- 移除非常用扩展属性(如 `0x000082da`)
- 禁用非常用缓冲(深度/模板缓冲)
- 明确指定基础颜色缓冲大小
---
### 3. JavaScript 脚本错误解决方案
**错误信息**:
`Uncaught ReferenceError: self is not defined`
**修复方案**:
在脚本加载前注入全局 `self` 对象定义:
```javascript
// 在 main.js 或入口脚本顶部添加
if (typeof global !== 'undefined') {
// Node.js 或 Cocos JSB 环境
global.self = global;
} else if (typeof window !== 'undefined') {
// 浏览器环境
window.self = window;
}
// 添加文件加载容错机制
cc.assetManager.downloader.register({
// 处理 .js 文件加载
'.js': {
handle: (url, options, onComplete) => {
const result = new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = reject;
xhr.send();
});
result.then((data) => {
if (!data || data.length === 0) {
cc.warn(`Empty script: ${url}`);
onComplete(new Error(`Empty script: ${url}`));
} else {
onComplete(null, data);
}
}).catch(onComplete);
}
}
});
```
**关键改进**:
1. 定义全局 `self` 对象兼容浏览器/JSB 环境
2. 添加脚本加载容错机制
3. 空文件检测和错误上报
---
### 4. 内存跟踪模块问题解决方案
**错误信息**:
`Couldn't load memtrack module`
**解决方案**:
在 AndroidManifest.xml 中添加硬件特性声明:
```xml
<manifest ...>
<uses-feature android:name="android.hardware.memorytracking" android:required="false"/>
</manifest>
```
此声明告知系统应用可在无内存跟踪硬件的设备上运行。
---
### 完整问题修复流程
1. **优先修复 JS 错误**:注入全局 `self` 并添加脚本加载容错
2. **处理渲染问题**:修改 EGL 配置初始化代码
3. **解决权限问题**:部署 SELinux 策略文件
4. **声明硬件特性**:更新 AndroidManifest.xml
> **注意**:SELinux 策略修改需要 root 权限,发布版本中应通过标准 API 访问服务。
阅读全文
相关推荐


















