mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 09:00:44 +00:00
Start remoteserver and captured packages by adb commands in native code.
Use adb to enumerate installed 3rd party packages in capture dialog. Cleaned up all the "adb:" strcmp's.
This commit is contained in:
committed by
Baldur Karlsson
parent
8899cb8e73
commit
bcb9914665
@@ -23,6 +23,7 @@
|
||||
* THE SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
#include "api/replay/renderdoc_replay.h"
|
||||
#include "core/core.h"
|
||||
@@ -705,7 +706,7 @@ void RenderDoc::BecomeRemoteServer(const char *listenhost, uint16_t port, volati
|
||||
struct RemoteServer : public IRemoteServer
|
||||
{
|
||||
public:
|
||||
RemoteServer(Network::Socket *sock) : m_Socket(sock)
|
||||
RemoteServer(Network::Socket *sock, const char *hostname) : m_Socket(sock), m_hostname(hostname)
|
||||
{
|
||||
map<RDCDriver, string> m = RenderDoc::Inst().GetReplayDrivers();
|
||||
|
||||
@@ -713,6 +714,7 @@ public:
|
||||
for(auto it = m.begin(); it != m.end(); ++it)
|
||||
m_Proxies.push_back(*it);
|
||||
}
|
||||
const string &hostname() const { return m_hostname; }
|
||||
virtual ~RemoteServer() { SAFE_DELETE(m_Socket); }
|
||||
void ShutdownConnection() { delete this; }
|
||||
void ShutdownServerAndConnection()
|
||||
@@ -797,6 +799,9 @@ public:
|
||||
|
||||
rdctype::str GetHomeFolder()
|
||||
{
|
||||
if(Android::IsHostADB(m_hostname.c_str()))
|
||||
return "/";
|
||||
|
||||
rdctype::str ret;
|
||||
|
||||
Serialiser sendData("", Serialiser::WRITING, false);
|
||||
@@ -824,6 +829,33 @@ public:
|
||||
{
|
||||
rdctype::array<DirectoryFile> ret;
|
||||
|
||||
if(Android::IsHostADB(m_hostname.c_str()))
|
||||
{
|
||||
string adbStdout = Android::adbExecCommand("shell pm list packages -3");
|
||||
using namespace std;
|
||||
istringstream stdoutStream(adbStdout);
|
||||
string line;
|
||||
vector<DirectoryFile> packages;
|
||||
while(getline(stdoutStream, line))
|
||||
{
|
||||
vector<string> tokens;
|
||||
split(line, tokens, ':');
|
||||
if(tokens.size() == 2 && tokens[0] == "package")
|
||||
{
|
||||
DirectoryFile package;
|
||||
package.filename = trim(tokens[1]);
|
||||
package.flags = eFileProp_Executable;
|
||||
packages.push_back(package);
|
||||
}
|
||||
}
|
||||
|
||||
create_array_uninit(ret, packages.size());
|
||||
for(size_t i = 0; i < packages.size(); i++)
|
||||
ret[i] = packages[i];
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
string folderPath = path;
|
||||
|
||||
Serialiser sendData("", Serialiser::WRITING, false);
|
||||
@@ -1069,6 +1101,7 @@ public:
|
||||
|
||||
private:
|
||||
Network::Socket *m_Socket;
|
||||
string m_hostname;
|
||||
|
||||
void Send(RemoteServerPacket type, const Serialiser &ser) { SendPacket(m_Socket, type, ser); }
|
||||
void Get(RemoteServerPacket &type, Serialiser **ser)
|
||||
@@ -1137,6 +1170,9 @@ extern "C" RENDERDOC_API uint32_t RENDERDOC_CC
|
||||
RemoteServer_ExecuteAndInject(RemoteServer *remote, const char *app, const char *workingDir,
|
||||
const char *cmdLine, void *env, const CaptureOptions *opts)
|
||||
{
|
||||
if(Android::IsHostADB(remote->hostname().c_str()))
|
||||
return Android::StartAndroidPackageForCapture(app);
|
||||
|
||||
return remote->ExecuteAndInject(app, workingDir, cmdLine, env, opts);
|
||||
}
|
||||
|
||||
@@ -1190,7 +1226,7 @@ RENDERDOC_CreateRemoteServerConnection(const char *host, uint32_t port, RemoteSe
|
||||
if(port == 0)
|
||||
port = RENDERDOC_GetDefaultRemoteServerPort();
|
||||
|
||||
if(host != NULL && !strncmp(host, "adb:", 4))
|
||||
if(host != NULL && Android::IsHostADB(host))
|
||||
{
|
||||
s = "127.0.0.1";
|
||||
|
||||
@@ -1236,7 +1272,7 @@ RENDERDOC_CreateRemoteServerConnection(const char *host, uint32_t port, RemoteSe
|
||||
return eReplayCreate_NetworkIOFailed;
|
||||
}
|
||||
|
||||
*rend = new RemoteServer(sock);
|
||||
*rend = new RemoteServer(sock, host);
|
||||
|
||||
return eReplayCreate_Success;
|
||||
}
|
||||
|
||||
@@ -707,7 +707,7 @@ extern "C" RENDERDOC_API TargetControl *RENDERDOC_CC RENDERDOC_CreateTargetContr
|
||||
|
||||
bool android = false;
|
||||
|
||||
if(host != NULL && !strncmp(host, "adb:", 4))
|
||||
if(host != NULL && Android::IsHostADB(host))
|
||||
{
|
||||
android = true;
|
||||
s = "127.0.0.1";
|
||||
|
||||
@@ -443,3 +443,10 @@ inline uint64_t CountLeadingZeroes(uint64_t value);
|
||||
#else
|
||||
#error Undefined Platform!
|
||||
#endif
|
||||
|
||||
namespace Android
|
||||
{
|
||||
bool IsHostADB(const char *hostname);
|
||||
uint32_t StartAndroidPackageForCapture(const char *package);
|
||||
string adbExecCommand(const string &args);
|
||||
}
|
||||
|
||||
@@ -499,7 +499,7 @@ extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_EnumerateRemoteTargets(
|
||||
nextIdent++;
|
||||
|
||||
uint32_t lastIdent = RenderDoc_LastTargetControlPort;
|
||||
if(host != NULL && !strncmp(host, "adb:", 4))
|
||||
if(host != NULL && Android::IsHostADB(host))
|
||||
{
|
||||
if(nextIdent == RenderDoc_FirstTargetControlPort)
|
||||
nextIdent += RenderDoc_AndroidPortOffset;
|
||||
@@ -594,6 +594,12 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EndSelfHostCapture(const ch
|
||||
rdoc->EndFrameCapture(NULL, NULL);
|
||||
}
|
||||
|
||||
namespace Android
|
||||
{
|
||||
bool IsHostADB(const char *hostname)
|
||||
{
|
||||
return !strncmp(hostname, "adb:", 4);
|
||||
}
|
||||
string adbExecCommand(const string &args)
|
||||
{
|
||||
string adbExePath = RenderDoc::Inst().GetConfigSetting("adbExePath");
|
||||
@@ -614,7 +620,23 @@ void adbForwardPorts()
|
||||
RenderDoc_FirstTargetControlPort + RenderDoc_AndroidPortOffset,
|
||||
RenderDoc_FirstTargetControlPort));
|
||||
}
|
||||
uint32_t StartAndroidPackageForCapture(const char *package)
|
||||
{
|
||||
string packageName = basename(string(package)); // Remove leading '/' if any
|
||||
|
||||
adbExecCommand("shell am force-stop " + packageName);
|
||||
adbForwardPorts();
|
||||
adbExecCommand("shell setprop debug.vulkan.layers VK_LAYER_RENDERDOC_Capture");
|
||||
adbExecCommand("shell monkey -p " + packageName + " -c android.intent.category.LAUNCHER 1");
|
||||
Threading::Sleep(
|
||||
5000); // Let the app pickup the setprop before we turn it back off for replaying.
|
||||
adbExecCommand("shell setprop debug.vulkan.layers \\\"\\\"");
|
||||
|
||||
return RenderDoc_FirstTargetControlPort + RenderDoc_AndroidPortOffset;
|
||||
}
|
||||
}
|
||||
|
||||
using namespace Android;
|
||||
extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdctype::str *deviceList)
|
||||
{
|
||||
string adbStdout = adbExecCommand("devices");
|
||||
@@ -641,3 +663,14 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdc
|
||||
|
||||
*deviceList = ret;
|
||||
}
|
||||
|
||||
extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_StartAndroidRemoteServer()
|
||||
{
|
||||
adbExecCommand("shell am force-stop org.renderdoc.renderdoccmd");
|
||||
adbForwardPorts();
|
||||
adbExecCommand("shell setprop debug.vulkan.layers \\\"\\\"");
|
||||
adbExecCommand(
|
||||
"shell pm grant org.renderdoc.renderdoccmd android.permission.READ_EXTERNAL_STORAGE");
|
||||
adbExecCommand(
|
||||
"shell am start -n org.renderdoc.renderdoccmd/.Loader -e renderdoccmd remoteserver");
|
||||
}
|
||||
|
||||
@@ -113,6 +113,9 @@ namespace renderdoc
|
||||
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern ReplaySupport RENDERDOC_EnumerateAndroidDevices(IntPtr driverName);
|
||||
|
||||
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern ReplaySupport RENDERDOC_StartAndroidRemoteServer();
|
||||
|
||||
[DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern void RENDERDOC_StartSelfHostCapture(IntPtr dllname);
|
||||
|
||||
@@ -409,5 +412,10 @@ namespace renderdoc
|
||||
|
||||
return driverList.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
public static void StartAndroidRemoteServer()
|
||||
{
|
||||
RENDERDOC_StartAndroidRemoteServer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1967,12 +1967,7 @@ namespace renderdocui.Windows
|
||||
|
||||
private void startAndroidRemoteServerToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
// /K to keep the window open after finishing.
|
||||
// We want to see the output, e.g. to see if adb is on the path.
|
||||
ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/K android_remoteserver.bat");
|
||||
|
||||
Process process = Process.Start(processInfo);
|
||||
process.Close();
|
||||
StaticExports.StartAndroidRemoteServer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -628,8 +628,8 @@
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy $(SolutionDir)scripts\android_remoteserver.bat $(TargetDir)
|
||||
copy $(SolutionDir)scripts\android_capture.bat $(TargetDir)</PostBuildEvent>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
adb shell am force-stop %*
|
||||
adb forward tcp:38970 tcp:38920
|
||||
adb shell setprop debug.vulkan.layers VK_LAYER_RENDERDOC_Capture
|
||||
adb shell monkey -p %* -c android.intent.category.LAUNCHER 1
|
||||
timeout 5
|
||||
adb shell setprop debug.vulkan.layers \"\"
|
||||
@@ -1,6 +0,0 @@
|
||||
adb shell am force-stop org.renderdoc.renderdoccmd
|
||||
adb forward tcp:39970 tcp:39920
|
||||
adb forward tcp:38970 tcp:38920
|
||||
adb shell setprop debug.vulkan.layers \"\"
|
||||
adb shell pm grant org.renderdoc.renderdoccmd android.permission.READ_EXTERNAL_STORAGE
|
||||
adb shell am start -n org.renderdoc.renderdoccmd/.Loader -e renderdoccmd remoteserver
|
||||
Reference in New Issue
Block a user