From 65d6bdb237f5487071b48969bbf0d105c4e8f992 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Fri, 3 Nov 2023 09:58:22 +0100 Subject: [PATCH] Attempt to fix #4392 --- .../com/genymobile/scrcpy/FakeContext.java | 2 +- .../com/genymobile/scrcpy/Workarounds.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/FakeContext.java b/server/src/main/java/com/genymobile/scrcpy/FakeContext.java index 6501d4cf..d9bcaf9e 100644 --- a/server/src/main/java/com/genymobile/scrcpy/FakeContext.java +++ b/server/src/main/java/com/genymobile/scrcpy/FakeContext.java @@ -18,7 +18,7 @@ public final class FakeContext extends MutableContextWrapper { } private FakeContext() { - super(null); + super(Workarounds.retrieveSystemContext()); } @Override diff --git a/server/src/main/java/com/genymobile/scrcpy/Workarounds.java b/server/src/main/java/com/genymobile/scrcpy/Workarounds.java index b8ee68ca..37240246 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Workarounds.java +++ b/server/src/main/java/com/genymobile/scrcpy/Workarounds.java @@ -7,6 +7,7 @@ import android.content.AttributionSource; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioRecord; @@ -30,6 +31,11 @@ public final class Workarounds { public static void apply(boolean audio, boolean camera) { Workarounds.prepareMainLooper(); + try { + fillActivityThread(); + } catch (Exception e) { + throw new AssertionError(e); + } boolean mustFillAppInfo = false; boolean mustFillBaseContext = false; @@ -123,6 +129,17 @@ public final class Workarounds { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.packageName = FakeContext.PACKAGE_NAME; + Application application = new Application() { + @Override + public String getOpPackageName() { + return FakeContext.PACKAGE_NAME; + } + }; + + Field initialApplicationField = activityThreadClass.getDeclaredField("mInitialApplication"); + initialApplicationField.setAccessible(true); + initialApplicationField.set(activityThread, application); + // appBindData.appInfo = applicationInfo; Field appInfoField = appBindDataClass.getDeclaredField("appInfo"); appInfoField.setAccessible(true); @@ -306,4 +323,14 @@ public final class Workarounds { throw new RuntimeException("Cannot create AudioRecord"); } } + + static Context retrieveSystemContext() { + try { + Method getSystemContextMethod = activityThreadClass.getDeclaredMethod("getSystemContext"); + return (Context) getSystemContextMethod.invoke(activityThread); + } catch (Exception e) { + Ln.e("Cannot retrieve system context", e); + return null; + } + } }