RenderDoc 学习使用(二):Android平台真机环境下对特殊项目进行截帧分析
方案一:使用mprop工具
mprop 工具,是安卓8及以下修改debuggable为1的方案
-adb push (mprop文件路径) /data/local/tmp
-adb shell su
-chmod 755 /data/local/tmp/mprop
-data/local/tmp/mprop debuggable 1
-stop;start
-adb shell su
-getprop ro.debuggable
方案二:使用Magisk工具
Magisk(面具),是安卓8以上修改debuggable为1的方案。
https://github.com/topjohnwu/Magisk
-adb shell su
-props
-3 (-Edit MagiskHide props)
-1 (-ro.debuggable)
-adb shell su
-getprop ro.debuggable
Fake dlopen 加载 renderdoc.so
编译renderdoc.so
//=>renderdoc/Core/resource_manager.cpp
.............
FrameRefType ComposeFrameRefsFirstKnown(FrameRefType first, FrameRefType second)
{
=> //if(eFrameRef_Minimum <= first && first <= eFrameRef_Maximum)
if(first <= eFrameRef_Maximum)
return first;
else
return second;
}
//=>renderdoc/Core/resource_manager.h
inline InitReqType InitReq(FrameRefType refType, InitPolicy policy, bool initialized)
{
=>//if(eFrameRef_Minimum > refType || refType > eFrameRef_Maximum)
if(refType > eFrameRef_Maximum)
return eInitReq_Copy;
//=>renderdoc/Common/globalconfig.h
//#define RENDERDOC_ANDROID_LIBRARY "libVkLayer_GLES_RenderDoc.so"
#define RENDERDOC_ANDROID_LIBRARY "libvkEGL.so"
//CMakeLists.txt
set_target_properties(renderdoc PROPERTIES LINK_FLAGS "${RDOC_LINK_FLAGS}")
# rename output library
set_target_properties(renderdoc PROPERTIES OUTPUT_NAME "vkEGL")
编译之后生成文件:libvkEGL.so,该文件在RDC使用时会被加载到应用中。
Hook OpenNativeLibrary
接下来通过Hook OpenNativeLibrary函数的方式加载libvkEGL.so。在这里我们采用 inline hook 框架:
int HookOpenNativeLibrary()
{
LOGD("Hook OpenNativeLibrary");
void* HelperLibraryHandle = NULL;
if ((LibraryHandle = fake_dlopen("libnativeloader.so", RTLD_NOW)) == NULL) {
LOGD("LibraryHandle is null : %s", dlerror());
}
//mi 5x
OpenNativeLibrary = (OpenNativeLibraryFunc)fake_dlsym(LibraryHandle, "_ZN7android17OpenNativeLibraryEP7_JNIEnviPKcP8_jobjectP8_jstring");
//mi 8
if (OpenNativeLibrary == NULL)
{
OpenNativeLibrary = (OpenNativeLibraryFunc)fake_dlsym(LibraryHandle, "_ZN7android17OpenNativeLibraryEP7_JNIEnviPKcP8_jobjectP8_jstringPbPNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEE");
}
LOGD("OpenNativeLibrary is null : %d", OpenNativeLibrary == NULL);
int result = hook((void*)OpenNativeLibrary, (void*)&new_OpenNativeLibrary, (void **)(&old_OpenNativeLibrary));
return result;
}
- 从Android 7.0 开始,Android 系统将阻止应用动态链接非公开NDK库,可以通过开源库:dlfcn_compat,制作fake_dlopen、fake_dlsym函数来获取libnativeloader模块中的OpenNativeLibrary函数地址
-
https://github.com/mustime/Adrill/blob/main/README.zh-CN.md
adb shell
su
adrill --pname zygote/zygote64 --libpath libOpenNativeLibrary.so
(注意使用具体位置)
/data/RDC/lib64/adrill_arm64-v8a --pname zygote64 --libpath /data/RDC/lib64/libOpenNativeLibrary.so
https://github.com/Chainfire/inject-hook-cflumen
adb shell
su
inject (pid of zygote64) libOpenNativeLibrary.so
(注意使用具体位置和具体进程号)
/data/RDC/lib64/inject 652 /data/RDC/lib64/libOpenNativeLibrary.so