Compare commits

...

4 Commits

Author SHA1 Message Date
Romain Vimont
e811b7710d Attach base context to application 2023-11-03 14:32:19 +01:00
Romain Vimont
3d93a099b7 Add log 2023-11-03 11:51:41 +01:00
Romain Vimont
29c305ca5f Initialize FakeContext first 2023-11-03 11:51:32 +01:00
Romain Vimont
65d6bdb237 Attempt to fix #4392
<https://github.com/Genymobile/scrcpy/issues/4392#issuecomment-1790954884>
2023-11-03 09:58:23 +01:00
2 changed files with 33 additions and 1 deletions

View File

@ -18,7 +18,7 @@ public final class FakeContext extends MutableContextWrapper {
}
private FakeContext() {
super(null);
super(Workarounds.retrieveSystemContext());
}
@Override

View File

@ -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,12 @@ public final class Workarounds {
public static void apply(boolean audio, boolean camera) {
Workarounds.prepareMainLooper();
try {
fillActivityThread();
FakeContext.get();
} catch (Exception e) {
throw new AssertionError(e);
}
boolean mustFillAppInfo = false;
boolean mustFillBaseContext = false;
@ -123,6 +130,19 @@ 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;
}
};
Method method = ContextWrapper.class.getDeclaredMethod("attachBaseContext", Context.class);
method.invoke(application, retrieveSystemContext());
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 +326,16 @@ public final class Workarounds {
throw new RuntimeException("Cannot create AudioRecord");
}
}
static Context retrieveSystemContext() {
try {
Method getSystemContextMethod = activityThreadClass.getDeclaredMethod("getSystemContext");
Context ctx = (Context) getSystemContextMethod.invoke(activityThread);
Ln.i("===== " + ctx);
return ctx;
} catch (Exception e) {
Ln.e("Cannot retrieve system context", e);
return null;
}
}
}