You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台LD_PRELOAD拦截OpenGL API失败的问题求助

问题解决指南

一、LD_PRELOAD 生效问题修复

Android 所有应用进程由 Zygote 父进程 fork 生成,Zygote 预初始化时已加载动态链接器,直接设置全局 LD_PRELOAD 无法影响应用的符号加载。必须通过wrap 机制指定预加载库:

  1. 确认设备已 Root,创建 wrap 文件(替换com.your.app.package为目标应用包名):
    echo "LD_PRELOAD=/data/local/tmp/libshader_intercept.so %cmd" > /data/local/tmp/com.your.app.package.wrap
    
  2. 设置文件权限:
    chmod 644 /data/local/tmp/com.your.app.package.wrap
    
  3. 重启目标应用:
    am force-stop com.your.app.package
    am start -n com.your.app.package/.MainActivity
    

二、架构不兼容问题解决

Genymotion x86 模拟器通过 ARM 兼容层运行 arm64 APK,但兼容层无法加载 x86 架构的拦截库,需二选一解决:

  • 方案1:编译 arm64 版本的拦截库
    修改 NDK 项目的Application.mk文件,指定架构:
    APP_ABI := arm64-v8a
    
    重新编译得到 arm64 架构的.so文件,推送到设备后使用。
  • 方案2:改用 x86/x86_64 架构的 APK
    直接测试 x86 版本的目标应用,无需兼容层,x86 拦截库可正常加载。

三、代码优化建议

1. 修复日志输出问题

Android 应用的printf输出不会默认进入 logcat,改用 Android 日志 API:

#include <android/log.h>
#define LOG_TAG "ShaderHook"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

将代码中所有printf/fprintf替换为LOGD,方便通过adb logcat -s ShaderHook查看拦截日志。

2. 修复文件权限问题

Android 10+ 对外部存储权限限制严格,优先使用应用私有目录存储文件,避免权限失败:

// 替换原文件路径为应用私有目录
char filePath[256];
snprintf(filePath, sizeof(filePath), "/data/data/%s/files/intercepted_shader.glsl", "com.your.app.package");
FILE *file = fopen(filePath, "w");

(注:将com.your.app.package替换为目标应用包名)

3. 增加空指针安全检查

避免原函数指针为空导致崩溃:

// 调用原函数前先检查
if (real_glShaderSource != nullptr) {
    real_glShaderSource(shader, count, string, length);
} else {
    LOGD("Failed to get real glShaderSource function");
}

4. 优化 dlopen 参数

使用RTLD_NOW | RTLD_GLOBAL确保正确获取符号:

void* handle = dlopen("libGLESv2.so", RTLD_NOW | RTLD_GLOBAL);

内容的提问来源于stack exchange,提问作者Fox1942

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:43:26