Skip to content

Commit

Permalink
Add a clean up process on the device
Browse files Browse the repository at this point in the history
In order to clean up on close, use a separate process which is not
killed when the device is disconnected (even if the main process itself
is killed).
  • Loading branch information
rom1v committed May 1, 2020
1 parent 8c67992 commit 2f74ec2
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 11 deletions.
62 changes: 62 additions & 0 deletions server/src/main/java/com/genymobile/scrcpy/CleanUp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.genymobile.scrcpy;

import com.genymobile.scrcpy.wrappers.ContentProvider;
import com.genymobile.scrcpy.wrappers.ServiceManager;

import java.io.File;
import java.io.IOException;

/**
* Handle the cleanup of scrcpy, even if the main process is killed.
* <p>
* This is useful to restore some state when scrcpy is closed, even on device disconnection (which kills the scrcpy process).
*/
public final class CleanUp {

public static final String SERVER_PATH = "/data/local/tmp/scrcpy-server.jar";

private CleanUp() {
// not instantiable
}

public static void configure() throws IOException {
// TODO
boolean needProcess = false;
if (needProcess) {
startProcess();
} else {
// There is no additional clean up to do when scrcpy dies
unlinkSelf();
}
}

private static void startProcess() throws IOException {
String[] cmd = {"app_process", "/", CleanUp.class.getName()};

ProcessBuilder builder = new ProcessBuilder(cmd);
builder.environment().put("CLASSPATH", SERVER_PATH);
builder.start();
}

private static void unlinkSelf() {
try {
new File(SERVER_PATH).delete();
} catch (Exception e) {
Ln.e("Could not unlink server", e);
}
}

public static void main(String... args) {
unlinkSelf();

try {
// Wait for the server to die
System.in.read();
} catch (IOException e) {
// Expected when the server is dead
}

Ln.i("Cleaning up");
// TODO
}
}
14 changes: 3 additions & 11 deletions server/src/main/java/com/genymobile/scrcpy/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import android.media.MediaCodec;
import android.os.Build;

import java.io.File;
import java.io.IOException;

public final class Server {

private static final String SERVER_PATH = "/data/local/tmp/scrcpy-server.jar";

private Server() {
// not instantiable
Expand All @@ -18,6 +16,9 @@ private Server() {
private static void scrcpy(Options options) throws IOException {
Ln.i("Device: " + Build.MANUFACTURER + " " + Build.MODEL + " (Android " + Build.VERSION.RELEASE + ")");
final Device device = new Device(options);

CleanUp.configure();

boolean tunnelForward = options.isTunnelForward();
try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) {
ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate(), options.getMaxFps());
Expand Down Expand Up @@ -132,14 +133,6 @@ private static Rect parseCrop(String crop) {
return new Rect(x, y, x + width, y + height);
}

private static void unlinkSelf() {
try {
new File(SERVER_PATH).delete();
} catch (Exception e) {
Ln.e("Could not unlink server", e);
}
}

private static void suggestFix(Throwable e) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (e instanceof MediaCodec.CodecException) {
Expand Down Expand Up @@ -172,7 +165,6 @@ public void uncaughtException(Thread t, Throwable e) {
}
});

unlinkSelf();
Options options = createOptions(args);
scrcpy(options);
}
Expand Down

0 comments on commit 2f74ec2

Please sign in to comment.