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; + } + } }