mirror of
https://github.com/Genymobile/scrcpy
synced 2024-12-30 19:22:05 +00:00
Add a clean up process on the device
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).
This commit is contained in:
parent
8c6799297b
commit
2f74ec2518
62
server/src/main/java/com/genymobile/scrcpy/CleanUp.java
Normal file
62
server/src/main/java/com/genymobile/scrcpy/CleanUp.java
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -4,12 +4,10 @@ import android.graphics.Rect;
|
|||||||
import android.media.MediaCodec;
|
import android.media.MediaCodec;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
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
|
||||||
@ -18,6 +16,9 @@ public final class Server {
|
|||||||
private static void scrcpy(Options options) throws IOException {
|
private static void scrcpy(Options options) throws IOException {
|
||||||
Ln.i("Device: " + Build.MANUFACTURER + " " + Build.MODEL + " (Android " + Build.VERSION.RELEASE + ")");
|
Ln.i("Device: " + Build.MANUFACTURER + " " + Build.MODEL + " (Android " + Build.VERSION.RELEASE + ")");
|
||||||
final Device device = new Device(options);
|
final Device device = new Device(options);
|
||||||
|
|
||||||
|
CleanUp.configure();
|
||||||
|
|
||||||
boolean tunnelForward = options.isTunnelForward();
|
boolean tunnelForward = options.isTunnelForward();
|
||||||
try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) {
|
try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) {
|
||||||
ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate(), options.getMaxFps());
|
ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate(), options.getMaxFps());
|
||||||
@ -132,14 +133,6 @@ 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("Could not unlink server", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void suggestFix(Throwable e) {
|
private static void suggestFix(Throwable e) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
if (e instanceof MediaCodec.CodecException) {
|
if (e instanceof MediaCodec.CodecException) {
|
||||||
@ -172,7 +165,6 @@ public final class Server {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
unlinkSelf();
|
|
||||||
Options options = createOptions(args);
|
Options options = createOptions(args);
|
||||||
scrcpy(options);
|
scrcpy(options);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user