Make the server unlink itself

To clean up the device, the client executed "adb shell rm" once the
server was guaranteed to be started (after the connection succeeded).

This implied to track whether the installation state, and failed if an
additional tunnel was used in "forward" mode:
<https://github.com/Genymobile/scrcpy/issues/386#issuecomment-453936034>

Instead, make the server unlink itself on start.
This commit is contained in:
Romain Vimont 2019-01-14 21:12:23 +01:00
parent fefb9816a9
commit 39c5e71605
5 changed files with 12 additions and 23 deletions

View file

@ -135,11 +135,6 @@ process_t adb_install(const char *serial, const char *local) {
return proc; return proc;
} }
process_t adb_remove_path(const char *serial, const char *path) {
const char *const adb_cmd[] = {"shell", "rm", path};
return adb_execute(serial, adb_cmd, ARRAY_LEN(adb_cmd));
}
SDL_bool process_check_success(process_t proc, const char *name) { SDL_bool process_check_success(process_t proc, const char *name) {
if (proc == PROCESS_NONE) { if (proc == PROCESS_NONE) {
LOGE("Could not execute \"%s\"", name); LOGE("Could not execute \"%s\"", name);

View file

@ -49,7 +49,6 @@ process_t adb_reverse(const char *serial, const char *device_socket_name, uint16
process_t adb_reverse_remove(const char *serial, const char *device_socket_name); process_t adb_reverse_remove(const char *serial, const char *device_socket_name);
process_t adb_push(const char *serial, const char *local, const char *remote); process_t adb_push(const char *serial, const char *local, const char *remote);
process_t adb_install(const char *serial, const char *local); process_t adb_install(const char *serial, const char *local);
process_t adb_remove_path(const char *serial, const char *path);
// convenience function to wait for a successful process execution // convenience function to wait for a successful process execution
// automatically log process errors with the provided process name // automatically log process errors with the provided process name

View file

@ -34,11 +34,6 @@ static SDL_bool push_server(const char *serial) {
return process_check_success(process, "adb push"); return process_check_success(process, "adb push");
} }
static SDL_bool remove_server(const char *serial) {
process_t process = adb_remove_path(serial, DEVICE_SERVER_PATH);
return process_check_success(process, "adb shell rm");
}
static SDL_bool enable_tunnel_reverse(const char *serial, Uint16 local_port) { static SDL_bool enable_tunnel_reverse(const char *serial, Uint16 local_port) {
process_t process = adb_reverse(serial, SOCKET_NAME, local_port); process_t process = adb_reverse(serial, SOCKET_NAME, local_port);
return process_check_success(process, "adb reverse"); return process_check_success(process, "adb reverse");
@ -167,8 +162,6 @@ SDL_bool server_start(struct server *server, const char *serial,
return SDL_FALSE; return SDL_FALSE;
} }
server->server_copied_to_device = SDL_TRUE;
if (!enable_tunnel(server)) { if (!enable_tunnel(server)) {
SDL_free((void *) server->serial); SDL_free((void *) server->serial);
return SDL_FALSE; return SDL_FALSE;
@ -229,10 +222,6 @@ socket_t server_connect_to(struct server *server) {
close_socket(&server->server_socket); close_socket(&server->server_socket);
} }
// the server is started, we can clean up the jar from the temporary folder
remove_server(server->serial); // ignore failure
server->server_copied_to_device = SDL_FALSE;
// we don't need the adb tunnel anymore // we don't need the adb tunnel anymore
disable_tunnel(server); // ignore failure disable_tunnel(server); // ignore failure
server->tunnel_enabled = SDL_FALSE; server->tunnel_enabled = SDL_FALSE;
@ -254,10 +243,6 @@ void server_stop(struct server *server) {
// ignore failure // ignore failure
disable_tunnel(server); disable_tunnel(server);
} }
if (server->server_copied_to_device) {
remove_server(server->serial); // ignore failure
}
} }
void server_destroy(struct server *server) { void server_destroy(struct server *server) {

View file

@ -13,7 +13,6 @@ struct server {
SDL_bool tunnel_enabled; SDL_bool tunnel_enabled;
SDL_bool tunnel_forward; // use "adb forward" instead of "adb reverse" SDL_bool tunnel_forward; // use "adb forward" instead of "adb reverse"
SDL_bool send_frame_meta; // request frame PTS to be able to record properly SDL_bool send_frame_meta; // request frame PTS to be able to record properly
SDL_bool server_copied_to_device;
}; };
#define SERVER_INITIALIZER { \ #define SERVER_INITIALIZER { \
@ -25,7 +24,6 @@ struct server {
.tunnel_enabled = SDL_FALSE, \ .tunnel_enabled = SDL_FALSE, \
.tunnel_forward = SDL_FALSE, \ .tunnel_forward = SDL_FALSE, \
.send_frame_meta = SDL_FALSE, \ .send_frame_meta = SDL_FALSE, \
.server_copied_to_device = SDL_FALSE, \
} }
// init default values // init default values

View file

@ -2,11 +2,14 @@ package com.genymobile.scrcpy;
import android.graphics.Rect; import android.graphics.Rect;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
public final class Server { public final class Server {
private static final String SERVER_PATH = "/data/local/tmp/scrcpy-server.jar";
private Server() { private Server() {
// not instantiable // not instantiable
} }
@ -86,6 +89,14 @@ public final class Server {
return new Rect(x, y, x + width, y + height); return new Rect(x, y, x + width, y + height);
} }
private static void unlinkSelf() {
try {
new File(SERVER_PATH).delete();
} catch (Exception e) {
Ln.e("Cannot unlink server", e);
}
}
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override @Override
@ -94,6 +105,7 @@ public final class Server {
} }
}); });
unlinkSelf();
Options options = createOptions(args); Options options = createOptions(args);
scrcpy(options); scrcpy(options);
} }