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:
Michael Rennie
2016-11-02 14:19:05 +00:00
committed by Baldur Karlsson
parent 8899cb8e73
commit bcb9914665
9 changed files with 92 additions and 25 deletions
+39 -3
View File
@@ -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;
}
+1 -1
View File
@@ -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";
+7
View File
@@ -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);
}
+34 -1
View File
@@ -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");
}
+8
View File
@@ -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();
}
}
}
+1 -6
View File
@@ -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();
}
}
}
+2 -2
View File
@@ -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.
-6
View File
@@ -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 \"\"
-6
View File
@@ -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