From 64b70724e097a3415deca38a2a8a6e69790fac32 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 2 Oct 2022 16:35:50 +0200 Subject: [PATCH] Expose APK path from Java --- .../java/com/genymobile/scrcpy/Device.java | 11 ++++++ .../scrcpy/wrappers/PackageManager.java | 36 +++++++++++++++++++ .../scrcpy/wrappers/ServiceManager.java | 17 +++++++++ 3 files changed, 64 insertions(+) create mode 100644 server/src/main/java/com/genymobile/scrcpy/wrappers/PackageManager.java diff --git a/server/src/main/java/com/genymobile/scrcpy/Device.java b/server/src/main/java/com/genymobile/scrcpy/Device.java index 763a7fad..2baddc67 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Device.java +++ b/server/src/main/java/com/genymobile/scrcpy/Device.java @@ -7,6 +7,7 @@ import com.genymobile.scrcpy.wrappers.SurfaceControl; import com.genymobile.scrcpy.wrappers.WindowManager; import android.content.IOnPrimaryClipChangedListener; +import android.content.pm.ApplicationInfo; import android.graphics.Rect; import android.os.Build; import android.os.IBinder; @@ -21,6 +22,8 @@ import java.util.concurrent.atomic.AtomicBoolean; public final class Device { + private static final String SCRCPY_PACKAGE_NAME = "com.genymobile.scrcpy"; + public static final int POWER_MODE_OFF = SurfaceControl.POWER_MODE_OFF; public static final int POWER_MODE_NORMAL = SurfaceControl.POWER_MODE_NORMAL; @@ -319,4 +322,12 @@ public final class Device { public static Settings getSettings() { return SETTINGS; } + + public static String getApkPath() { + ApplicationInfo info = SERVICE_MANAGER.getPackageManager().getApplicationInfo(SCRCPY_PACKAGE_NAME); + if (info == null) { + return null; + } + return info.sourceDir; + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/PackageManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/PackageManager.java new file mode 100644 index 00000000..44bf2423 --- /dev/null +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/PackageManager.java @@ -0,0 +1,36 @@ +package com.genymobile.scrcpy.wrappers; + +import com.genymobile.scrcpy.Ln; + +import android.content.pm.ApplicationInfo; +import android.os.IInterface; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class PackageManager { + + private IInterface manager; + private Method getApplicationInfoMethod; + + public PackageManager(IInterface manager) { + this.manager = manager; + } + + private Method getGetApplicationInfoMethod() throws NoSuchMethodException { + if (getApplicationInfoMethod == null) { + getApplicationInfoMethod = manager.getClass().getDeclaredMethod("getApplicationInfo", String.class, int.class, int.class); + } + return getApplicationInfoMethod; + } + + public ApplicationInfo getApplicationInfo(String packageName) { + try { + Method method = getGetApplicationInfoMethod(); + return (ApplicationInfo) method.invoke(manager, packageName, 0, ServiceManager.USER_ID); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + Ln.e("Cannot get application info", e); + return null; + } + } +} diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java index 68f6817d..b31e4920 100644 --- a/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java @@ -22,6 +22,7 @@ public final class ServiceManager { private StatusBarManager statusBarManager; private ClipboardManager clipboardManager; private ActivityManager activityManager; + private PackageManager packageManager; public ServiceManager() { try { @@ -119,4 +120,20 @@ public final class ServiceManager { return activityManager; } + + public PackageManager getPackageManager() { + if (packageManager == null) { + try { + //IInterface manager = getService("package", "android.content.pm.IPackageManager"); + Class activityThreadClass = Class.forName("android.app.ActivityThread"); + Method getPackageManager = activityThreadClass.getDeclaredMethod("getPackageManager"); + IInterface manager = (IInterface) getPackageManager.invoke(null); + return new PackageManager(manager); + } catch (Exception e) { + throw new AssertionError(e); + } + } + + return packageManager; + } }