From ce8d3ac6d145724949060c8bbe139a204d901adf Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Fri, 16 Jun 2023 11:40:54 +0200 Subject: [PATCH] systemctx --- .../com/genymobile/scrcpy/FakeContext.java | 21 ++++++++++++++++++- 1 file changed, 20 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 738203de..0b3fedbd 100644 --- a/server/src/main/java/com/genymobile/scrcpy/FakeContext.java +++ b/server/src/main/java/com/genymobile/scrcpy/FakeContext.java @@ -2,10 +2,14 @@ package com.genymobile.scrcpy; import android.annotation.TargetApi; import android.content.AttributionSource; +import android.content.Context; import android.content.ContextWrapper; import android.os.Build; import android.os.Process; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + public final class FakeContext extends ContextWrapper { public static final String PACKAGE_NAME = "com.android.shell"; @@ -13,12 +17,27 @@ public final class FakeContext extends ContextWrapper { private static final FakeContext INSTANCE = new FakeContext(); + private static Context retrieveSystemContext() { + try { + Class activityThreadClass = Class.forName("android.app.ActivityThread"); + Constructor activityThreadConstructor = activityThreadClass.getDeclaredConstructor(); + activityThreadConstructor.setAccessible(true); + Object activityThread = activityThreadConstructor.newInstance(); + + Method getSystemContextMethod = activityThread.getClass().getDeclaredMethod("getSystemContext"); + return (Context) getSystemContextMethod.invoke(activityThread); + } catch (Exception e) { + Ln.e("Cannot retrieve system context", e); + return null; + } + } + public static FakeContext get() { return INSTANCE; } private FakeContext() { - super(null); + super(retrieveSystemContext()); } @Override