From 7d3e5f73484c25b7898c800688025406585b1375 Mon Sep 17 00:00:00 2001 From: Michael Rennie Date: Mon, 15 Aug 2016 16:51:22 +0100 Subject: [PATCH] Fix replay check to record from APKs, and write to app's temp directory. /sdcard is not always available as it requires manifest write permissions. Recordings still need to be copied somewhere readable by RenderDocCmd.apk, as APKs can only read from their own temp directory. --- .../os/posix/android/android_stringio.cpp | 27 ++++++++++++++++--- renderdoc/os/posix/posix_libentry.cpp | 2 +- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/renderdoc/os/posix/android/android_stringio.cpp b/renderdoc/os/posix/android/android_stringio.cpp index da068c4cf..eb59e74c8 100644 --- a/renderdoc/os/posix/android/android_stringio.cpp +++ b/renderdoc/os/posix/android/android_stringio.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include +#include #include #include "os/os_specific.h" @@ -63,15 +64,33 @@ namespace FileIO { const char *GetTempRootPath() { - return "/sdcard"; + static string ret; + GetExecutableFilename(ret); + + // This folder is writable even if the APK does not have manifest write permissions. + ret = "/data/data/" + ret + "/files"; + return ret.c_str(); } +// For RenderDocCmd.apk, this returns "org.renderdoc.renderdoccmd" +// For other APKs, we use it to get the writable temp directory. void GetExecutableFilename(string &selfName) { - char path[512] = {0}; - readlink("/proc/self/exe", path, 511); + char buf[4096]; + snprintf(buf, sizeof(buf), "/proc/%u/cmdline", getpid()); + int fd = open(buf, O_RDONLY); + if(fd < 0) + { + return; + } + ssize_t len = read(fd, buf, sizeof(buf)); + close(fd); + if(len < 0 || len == sizeof(buf)) + { + return; + } - selfName = string(path); + selfName = buf; } }; diff --git a/renderdoc/os/posix/posix_libentry.cpp b/renderdoc/os/posix/posix_libentry.cpp index 8978d2377..6313fd36b 100644 --- a/renderdoc/os/posix/posix_libentry.cpp +++ b/renderdoc/os/posix/posix_libentry.cpp @@ -44,7 +44,7 @@ void library_loaded() if(curfile.find("/renderdoccmd") != string::npos || curfile.find("/renderdocui") != string::npos || curfile.find("/qrenderdoc") != string::npos || - curfile.find("/system/bin/app_process") != string::npos) + curfile.find("org.renderdoc.renderdoccmd") != string::npos) { RDCDEBUG("Not creating hooks - in replay app");