From 2d03c72ee0645b9ce693b4a2257fde644f615c3a Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 9 Jul 2020 15:05:41 +0800 Subject: [PATCH 01/65] Android 11: Fix method address Signed-off-by: tiann --- .../lib/src/main/jni/Foundation/VMPatch.cpp | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp index 7c2c7a89a..c729ea0ec 100644 --- a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp +++ b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp @@ -245,12 +245,24 @@ void mark() { // Do nothing }; +static size_t getArtMethodAddress(jobject javaMethod, jmethodID methodId) { + if (patchEnv.api_level < 30) { + return (size_t) methodId; + } else { + JNIEnv *env = Environment::current(); + jclass executableClass = env->FindClass("java/lang/reflect/Executable"); + jfieldID artMethod = env->GetFieldID(executableClass, "artMethod", "J"); + jlong addr = env->GetLongField(javaMethod, artMethod); + return addr; + } +} void measureNativeOffset(bool isArt) { jmethodID markMethod = nativeEngineClass->getStaticMethod("nativeMark").getId(); - size_t startAddress = (size_t) markMethod; + jobject method = Environment::current()->ToReflectedMethod(nativeEngineClass.get(), markMethod, JNI_TRUE); + size_t startAddress = (size_t) getArtMethodAddress(method, markMethod); size_t targetAddress = (size_t) mark; if (isArt && patchEnv.art_work_around_app_jni_bugs) { targetAddress = (size_t) patchEnv.art_work_around_app_jni_bugs; @@ -294,8 +306,8 @@ inline void replaceGetCallingUid(jboolean isArt) { inline void replaceOpenDexFileMethod(jobject javaMethod, jboolean isArt, int apiLevel) { - - size_t mtd_openDexNative = (size_t) Environment::current()->FromReflectedMethod(javaMethod); + jmethodID openDexNative = Environment::current()->FromReflectedMethod(javaMethod); + size_t mtd_openDexNative = getArtMethodAddress(javaMethod, openDexNative); int nativeFuncOffset = patchEnv.native_offset; void **jniFuncPtr = (void **) (mtd_openDexNative + nativeFuncOffset); @@ -321,7 +333,8 @@ replaceCameraNativeSetupMethod(jobject javaMethod, jboolean isArt, int apiLevel) if (!javaMethod) { return; } - size_t mtd_cameraNativeSetup = (size_t) Environment::current()->FromReflectedMethod(javaMethod); + jmethodID cameraNativeSetup = Environment::current()->FromReflectedMethod(javaMethod); + size_t mtd_cameraNativeSetup = getArtMethodAddress(javaMethod, cameraNativeSetup); int nativeFuncOffset = patchEnv.native_offset; void **jniFuncPtr = (void **) (mtd_cameraNativeSetup + nativeFuncOffset); @@ -358,7 +371,8 @@ replaceAudioRecordNativeCheckPermission(jobject javaMethod, jboolean isArt, int return; } jmethodID methodStruct = Environment::current()->FromReflectedMethod(javaMethod); - void **funPtr = (void **) (reinterpret_cast(methodStruct) + patchEnv.native_offset); + size_t mtd_methodStruct = getArtMethodAddress(javaMethod, methodStruct); + void **funPtr = (void **) (mtd_methodStruct + patchEnv.native_offset); patchEnv.orig_audioRecordNativeCheckPermission = (Function_audioRecordNativeCheckPermission) (*funPtr); *funPtr = (void *) new_native_audioRecordNativeCheckPermission; } @@ -429,8 +443,9 @@ void hookAndroidVM(JArrayClass javaMethods, measureNativeOffset(isArt); // Crash on Q if hook directly by modify entrypoint of function. // Just skip this step on Q and get never crash - if(apiLevel<=28) + if(apiLevel <= 28) replaceGetCallingUid(isArt); + replaceOpenDexFileMethod(javaMethods.getElement(OPEN_DEX).get(), isArt, apiLevel); replaceCameraNativeSetupMethod(javaMethods.getElement(CAMERA_SETUP).get(), From a730a6a669edf9e0e283f33497202d1fa915454b Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 9 Jul 2020 15:23:51 +0800 Subject: [PATCH 02/65] Android 11: Fix provider hook Signed-off-by: tiann --- .../com/lody/virtual/client/hook/providers/ProviderHook.java | 4 +++- .../main/java/com/lody/virtual/helper/compat/BuildCompat.java | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index 2d20ae089..71ea35c73 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -157,7 +157,9 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab try { String name = method.getName(); if ("call".equals(name)) { - if (BuildCompat.isQ()) { + if (BuildCompat.isR()) { + start = 3; + } else if (BuildCompat.isQ()) { start = 2; } String methodName = (String) args[start]; diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java index 02f3ad0eb..d91ac33d6 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java @@ -31,4 +31,8 @@ public static boolean isQ() { return SDK == Q - 1 && getPreviewSDKInt() > 0 || Build.VERSION.SDK_INT >= Q; } + public static boolean isR() { + return Build.VERSION.SDK_INT >= 30; + } + } \ No newline at end of file From 2cc6ed954ed31d88db862e362bfd6bc265f1c2dd Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 9 Jul 2020 15:28:06 +0800 Subject: [PATCH 03/65] Android 11: Fix handleStartActivity Signed-off-by: tiann --- .../src/main/java/android/app/ClientTransactionHandler.java | 2 ++ .../src/main/java/android/app/TransactionHandlerProxy.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index e0b105253..af29db160 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -116,6 +116,8 @@ public abstract Activity handleLaunchActivity(ActivityThread.ActivityClientRecor /** Perform activity start. */ public abstract void handleStartActivity(ActivityThread.ActivityClientRecord r, PendingTransactionActions pendingActions); + public abstract void handleStartActivity(IBinder r, + PendingTransactionActions pendingActions); /** Get package info. */ public abstract LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo); diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index 712b22cf0..088a4a2ac 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -175,6 +175,11 @@ public void handleStartActivity(ActivityClientRecord r, PendingTransactionAction originalHandler.handleStartActivity(r, pendingActions); } + @Override + public void handleStartActivity(IBinder r, PendingTransactionActions pendingActions) { + originalHandler.handleStartActivity(r, pendingActions); + } + @Override public LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo) { return originalHandler.getPackageInfoNoCheck(ai, compatInfo); From 3775e25a223abd99d735e5a7471f6af55dd8ca29 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 9 Jul 2020 15:34:25 +0800 Subject: [PATCH 04/65] Android 11: FIX handleStopActivity Signed-off-by: tiann --- .../src/main/java/android/app/ClientTransactionHandler.java | 3 +++ .../src/main/java/android/app/TransactionHandlerProxy.java | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index af29db160..dced80c28 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -90,6 +90,9 @@ public abstract void handleResumeActivity(IBinder token, boolean finalStateReque */ public abstract void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); + + public abstract void handleStopActivity(IBinder token, int configChanges, + PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); /** Report that activity was stopped to server. */ public abstract void reportStop(PendingTransactionActions pendingActions); /** Restart the activity after it was stopped. */ diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index 088a4a2ac..a3f758f55 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -81,6 +81,11 @@ public void handleStopActivity(IBinder token, boolean show, int configChanges, P originalHandler.handleStopActivity(token, show, configChanges, pendingActions, finalStateRequest, reason); } + @Override + public void handleStopActivity(IBinder token, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { + originalHandler.handleStopActivity(token, configChanges, pendingActions, finalStateRequest, reason); + } + @Override public void reportStop(PendingTransactionActions pendingActions) { originalHandler.reportStop(pendingActions); From 542ea96f7b0ad575eadcbea90a62f2a6156d1d55 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 9 Jul 2020 15:40:52 +0800 Subject: [PATCH 05/65] Android 11: FIX recursive call Signed-off-by: tiann --- .../main/java/com/lody/virtual/client/core/VirtualCore.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java index 4cff92b84..eec7d1052 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java @@ -41,6 +41,7 @@ import com.lody.virtual.client.ipc.VActivityManager; import com.lody.virtual.client.ipc.VPackageManager; import com.lody.virtual.client.stub.VASettings; +import com.lody.virtual.helper.compat.BuildCompat; import com.lody.virtual.helper.compat.BundleCompat; import com.lody.virtual.helper.utils.BitmapUtils; import com.lody.virtual.os.VUserHandle; @@ -390,7 +391,8 @@ public void removeVisibleOutsidePackage(String pkg) { } public boolean isOutsidePackageVisible(String pkg) { - if (!isXposedEnabled()) { + if (!isXposedEnabled() && !BuildCompat.isR()) { + // FIXME: 2020/7/9 recursive call PackageManager unHookPackageManager = getUnHookPackageManager(); try { unHookPackageManager.getPackageInfo(pkg, 0); From 9f8f2515220726cbf1736785c7e36cea8dcabdb7 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 9 Jul 2020 15:42:47 +0800 Subject: [PATCH 06/65] disable Xposed for Android 11 in temporary Signed-off-by: tiann --- .../src/main/java/com/lody/virtual/client/core/VirtualCore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java index eec7d1052..404dd9654 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java @@ -410,7 +410,7 @@ public boolean isOutsidePackageVisible(String pkg) { } public boolean isXposedEnabled() { - return !VirtualCore.get().getContext().getFileStreamPath(".disable_xposed").exists(); + return !VirtualCore.get().getContext().getFileStreamPath(".disable_xposed").exists() || BuildCompat.isR(); } public boolean isAppInstalled(String pkg) { From d3167e9ed4b1e441a1d187bdde911e618d965efe Mon Sep 17 00:00:00 2001 From: streaming <1148933186@QQ.COM> Date: Mon, 9 Nov 2020 17:22:12 +0800 Subject: [PATCH 07/65] Update MethodProxies.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 包名替换 --- .../virtual/client/hook/proxies/location/MethodProxies.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java index 7aa156b8e..e768c369a 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java @@ -10,7 +10,7 @@ import com.lody.virtual.helper.utils.ArrayUtils; import com.lody.virtual.helper.utils.Reflect; import com.lody.virtual.remote.vloc.VLocation; - +import com.lody.virtual.client.hook.utils.MethodParameterUtils; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -254,6 +254,7 @@ public String getMethodName() { @Override public Object call(Object who, Method method, Object... args) throws Throwable { + MethodParameterUtils.replaceFirstAppPkg(args); if (!isFakeLocationEnable()) { return super.call(who, method, args); } From 51fd88068103de8ddf48d28aeed641ce78b96959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E4=B8=BD=E6=AC=A3?= Date: Sun, 22 Nov 2020 23:10:46 +0800 Subject: [PATCH 08/65] Update ProviderHook.java Fix android 11 --- .../com/lody/virtual/client/hook/providers/ProviderHook.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index 2d20ae089..e60f4f465 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -157,7 +157,10 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab try { String name = method.getName(); if ("call".equals(name)) { - if (BuildCompat.isQ()) { + // Android 11 + if(Build.VERSION.SDK_INT >= 30) + start = 3; + else if (BuildCompat.isQ()) { start = 2; } String methodName = (String) args[start]; From 24e3b7810d960418b99ecf42e0d13b3b58346afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E4=B8=BD=E6=AC=A3?= Date: Sun, 22 Nov 2020 23:11:55 +0800 Subject: [PATCH 09/65] Update ProviderHook.java Fix Android 11 --- .../com/lody/virtual/client/hook/providers/ProviderHook.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index e60f4f465..91e4e9857 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -153,7 +153,8 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab } MethodBox methodBox = new MethodBox(method, mBase, args); int start = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? 1 : 0; - + // Android 11. + if(Build.VERSION.SDK_INT >= 30) start = 2; try { String name = method.getName(); if ("call".equals(name)) { From e4423ebb5a41d18bba56c15d1bec54dcf41fa49c Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 12:42:00 +0800 Subject: [PATCH 10/65] Fix broken io redirect. Signed-off-by: tiann --- .../lib/src/main/java/com/lody/virtual/client/NativeEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/NativeEngine.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/NativeEngine.java index 719c1dedc..00fd2712b 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/NativeEngine.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/NativeEngine.java @@ -144,7 +144,7 @@ public static void forbid(String path) { public static void enableIORedirect() { try { - String soPath = VirtualCore.get().getContext().getApplicationInfo().nativeLibraryDir + File.separator + "lib" + LIB_NAME; + String soPath = VirtualCore.get().getContext().getApplicationInfo().nativeLibraryDir + File.separator + "lib" + LIB_NAME + ".so"; if (!new File(soPath).exists()) { throw new RuntimeException("io redirect failed."); } From 41279f0cb7ac9cc1415f2f1b05602335b8507724 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 12:43:13 +0800 Subject: [PATCH 11/65] Add comments Signed-off-by: tiann --- .../com/lody/virtual/client/hook/providers/ProviderHook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index 91e4e9857..94c0fb5ad 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -153,7 +153,7 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab } MethodBox methodBox = new MethodBox(method, mBase, args); int start = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? 1 : 0; - // Android 11. + // Android 11: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/IContentProvider.java?q=IContentProvider&ss=android%2Fplatform%2Fsuperproject if(Build.VERSION.SDK_INT >= 30) start = 2; try { String name = method.getName(); From 10d5257418be3baf009c1f3121a83047e36090df Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:11:35 +0800 Subject: [PATCH 12/65] Android 11: free reflection dependency update Signed-off-by: tiann --- VirtualApp/lib/build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/VirtualApp/lib/build.gradle b/VirtualApp/lib/build.gradle index 445b19e93..fc857faff 100644 --- a/VirtualApp/lib/build.gradle +++ b/VirtualApp/lib/build.gradle @@ -39,8 +39,10 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - api "me.weishu.exposed:exposed-core:0.8.1" - implementation "me.weishu:free_reflection:2.2.0" + api("me.weishu.exposed:exposed-core:0.8.1") { + exclude group: 'me.weishu', module: 'free_reflection' + } + implementation "me.weishu:free_reflection:3.0.1" } repositories { From ed887cf438aa55109bbc972ce3e659641bf1f819 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:11:52 +0800 Subject: [PATCH 13/65] Android 11: fix activity lifecycle Signed-off-by: tiann --- .../android/app/ClientTransactionHandler.java | 18 ++++++++++++++++ .../android/app/TransactionHandlerProxy.java | 21 +++++++++++++++++++ .../java/android/view/DisplayAdjustments.java | 11 ++++++++++ 3 files changed, 50 insertions(+) create mode 100644 VirtualApp/lib/src/main/java/android/view/DisplayAdjustments.java diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index e0b105253..e8d2f22f2 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -24,6 +24,7 @@ import android.content.res.Configuration; import android.os.IBinder; import android.util.MergedConfiguration; +import android.view.DisplayAdjustments; import java.util.List; import java.util.Map; @@ -90,6 +91,11 @@ public abstract void handleResumeActivity(IBinder token, boolean finalStateReque */ public abstract void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); + + // Android 11 + public abstract void handleStopActivity(IBinder token, int configChanges, + PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); + /** Report that activity was stopped to server. */ public abstract void reportStop(PendingTransactionActions pendingActions); /** Restart the activity after it was stopped. */ @@ -108,6 +114,10 @@ public abstract void handleNewIntent(IBinder token, List intents, /** Deliver picture-in-picture mode change notification. */ public abstract void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, Configuration overrideConfig); + + // Android 11 + public abstract void handlePictureInPictureRequested(IBinder token); + /** Update window visibility. */ public abstract void handleWindowVisibility(IBinder token, boolean show); /** Perform activity launch. */ @@ -116,11 +126,19 @@ public abstract Activity handleLaunchActivity(ActivityThread.ActivityClientRecor /** Perform activity start. */ public abstract void handleStartActivity(ActivityThread.ActivityClientRecord r, PendingTransactionActions pendingActions); + + // Android 11 + public abstract void handleStartActivity(IBinder binder, + PendingTransactionActions pendingActions); /** Get package info. */ public abstract LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo); /** Deliver app configuration change notification. */ public abstract void handleConfigurationChanged(Configuration config); + + public abstract void handleFixedRotationAdjustments(IBinder token, + DisplayAdjustments.FixedRotationAdjustments fixedRotationAdjustments); + /** * Get {@link ActivityThread.ActivityClientRecord} instance that corresponds to the * provided token. diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index 712b22cf0..019d0b14e 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -12,6 +12,7 @@ import android.os.IBinder; import android.util.Log; import android.util.MergedConfiguration; +import android.view.DisplayAdjustments; import com.lody.virtual.client.VClientImpl; import com.lody.virtual.client.core.VirtualCore; @@ -81,6 +82,11 @@ public void handleStopActivity(IBinder token, boolean show, int configChanges, P originalHandler.handleStopActivity(token, show, configChanges, pendingActions, finalStateRequest, reason); } + @Override + public void handleStopActivity(IBinder token, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { + originalHandler.handleStopActivity(token, configChanges, pendingActions, finalStateRequest, reason); + } + @Override public void reportStop(PendingTransactionActions pendingActions) { originalHandler.reportStop(pendingActions); @@ -116,6 +122,11 @@ public void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode originalHandler.handlePictureInPictureModeChanged(token, isInPipMode, overrideConfig); } + @Override + public void handlePictureInPictureRequested(IBinder token) { + originalHandler.handlePictureInPictureRequested(token); + } + @Override public void handleWindowVisibility(IBinder token, boolean show) { originalHandler.handleWindowVisibility(token, show); @@ -175,6 +186,11 @@ public void handleStartActivity(ActivityClientRecord r, PendingTransactionAction originalHandler.handleStartActivity(r, pendingActions); } + @Override + public void handleStartActivity(IBinder binder, PendingTransactionActions pendingActions) { + originalHandler.handleStartActivity(binder, pendingActions); + } + @Override public LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo) { return originalHandler.getPackageInfoNoCheck(ai, compatInfo); @@ -185,6 +201,11 @@ public void handleConfigurationChanged(Configuration config) { originalHandler.handleConfigurationChanged(config); } + @Override + public void handleFixedRotationAdjustments(IBinder token, DisplayAdjustments.FixedRotationAdjustments fixedRotationAdjustments) { + originalHandler.handleFixedRotationAdjustments(token, fixedRotationAdjustments); + } + @Override public ActivityClientRecord getActivityClient(IBinder token) { Log.i(TAG, "getActivityClient : " + token); diff --git a/VirtualApp/lib/src/main/java/android/view/DisplayAdjustments.java b/VirtualApp/lib/src/main/java/android/view/DisplayAdjustments.java new file mode 100644 index 000000000..94d2da16d --- /dev/null +++ b/VirtualApp/lib/src/main/java/android/view/DisplayAdjustments.java @@ -0,0 +1,11 @@ +package android.view; + +/** + * @author weishu + * @date 2020/11/23. + */ + +// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/DisplayAdjustments.java;drc=master;l=184 +public class DisplayAdjustments { + public static class FixedRotationAdjustments {} +} From db1f1905d4e8c6e7b364415748daff53616d5ca9 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:12:13 +0800 Subject: [PATCH 14/65] Remove vm hook for Android 11 temporarily Signed-off-by: tiann --- VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp index 7c2c7a89a..f16382993 100644 --- a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp +++ b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp @@ -426,6 +426,10 @@ void hookAndroidVM(JArrayClass javaMethods, "dvmCreateStringFromCstr"); } } + if (apiLevel >= 30) { + // fixme for Android 11 + return; + } measureNativeOffset(isArt); // Crash on Q if hook directly by modify entrypoint of function. // Just skip this step on Q and get never crash From 4828d24ab7563bf9d189dfa82bb834af10e7cbdb Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:34:42 +0800 Subject: [PATCH 15/65] Android 11: fix pm Signed-off-by: tiann --- .../com/lody/virtual/client/core/VirtualCore.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java index 404dd9654..9c03651af 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java @@ -391,17 +391,6 @@ public void removeVisibleOutsidePackage(String pkg) { } public boolean isOutsidePackageVisible(String pkg) { - if (!isXposedEnabled() && !BuildCompat.isR()) { - // FIXME: 2020/7/9 recursive call - PackageManager unHookPackageManager = getUnHookPackageManager(); - try { - unHookPackageManager.getPackageInfo(pkg, 0); - return true; - } catch (PackageManager.NameNotFoundException e) { - return false; - } - } - try { return getService().isOutsidePackageVisible(pkg); } catch (RemoteException e) { @@ -410,7 +399,7 @@ public boolean isOutsidePackageVisible(String pkg) { } public boolean isXposedEnabled() { - return !VirtualCore.get().getContext().getFileStreamPath(".disable_xposed").exists() || BuildCompat.isR(); + return !VirtualCore.get().getContext().getFileStreamPath(".disable_xposed").exists() && !BuildCompat.isR(); } public boolean isAppInstalled(String pkg) { From 2d396a4f4b35f28689bc280ae3111f54498adad0 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:37:46 +0800 Subject: [PATCH 16/65] Don't install Installer if Xposed is disabled. Signed-off-by: tiann --- .../main/java/io/virtualapp/home/NewHomeActivity.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java b/VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java index bfaf2824d..08bba4f37 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java @@ -40,6 +40,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; +import java.util.concurrent.atomic.AtomicBoolean; import io.virtualapp.R; import io.virtualapp.abs.ui.VUiKit; @@ -62,7 +63,7 @@ public class NewHomeActivity extends NexusLauncherActivity { private Handler mUiHandler; private boolean mDirectlyBack = false; - private boolean checkXposedInstaller = true; + private final AtomicBoolean checkXposedInstaller = new AtomicBoolean(true); public static void goHome(Context context) { Intent intent = new Intent(context, NewHomeActivity.class); @@ -83,6 +84,9 @@ public void onCreate(Bundle savedInstanceState) { } private void installXposed() { + if (!VirtualCore.get().isXposedEnabled()) { + return; + } boolean isXposedInstalled = false; try { isXposedInstalled = VirtualCore.get().isAppInstalled(XPOSED_INSTALLER_PACKAGE); @@ -156,8 +160,7 @@ private static void dismissDialog(ProgressDialog dialog) { @Override protected void onResume() { super.onResume(); - if (checkXposedInstaller) { - checkXposedInstaller = false; + if (checkXposedInstaller.compareAndSet(true, false)) { installXposed(); } // check for update From a290cee8aa47a8cd8ac41f914e45482182574a1f Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:38:30 +0800 Subject: [PATCH 17/65] FIX vm hook Signed-off-by: tiann --- VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp index 9aee8529b..c729ea0ec 100644 --- a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp +++ b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp @@ -440,10 +440,6 @@ void hookAndroidVM(JArrayClass javaMethods, "dvmCreateStringFromCstr"); } } - if (apiLevel >= 30) { - // fixme for Android 11 - return; - } measureNativeOffset(isArt); // Crash on Q if hook directly by modify entrypoint of function. // Just skip this step on Q and get never crash From 4e13b95342088dd7f94ed9620170eaae4aa17df1 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 13:43:13 +0800 Subject: [PATCH 18/65] 0.20.0 Signed-off-by: tiann --- VirtualApp/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VirtualApp/app/build.gradle b/VirtualApp/app/build.gradle index 1442c9d3b..cf0ce69ae 100644 --- a/VirtualApp/app/build.gradle +++ b/VirtualApp/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "io.va.exposed" minSdkVersion 21 targetSdkVersion 23 - versionCode 190 - versionName "0.19.0" + versionCode 200 + versionName "0.20.0" multiDexEnabled false android { defaultConfig { From db06c55feca3007ac075dcf582121398331b0a52 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 19:51:05 +0800 Subject: [PATCH 19/65] Android 11: update epic. Signed-off-by: tiann --- VirtualApp/lib/build.gradle | 2 ++ .../main/java/com/lody/virtual/client/core/VirtualCore.java | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/VirtualApp/lib/build.gradle b/VirtualApp/lib/build.gradle index fc857faff..430ea8379 100644 --- a/VirtualApp/lib/build.gradle +++ b/VirtualApp/lib/build.gradle @@ -41,8 +41,10 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') api("me.weishu.exposed:exposed-core:0.8.1") { exclude group: 'me.weishu', module: 'free_reflection' + exclude group: 'me.weishu', module: 'epic' } implementation "me.weishu:free_reflection:3.0.1" + implementation "me.weishu:epic:0.11.0" } repositories { diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java index 9c03651af..7026319fe 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java @@ -41,7 +41,6 @@ import com.lody.virtual.client.ipc.VActivityManager; import com.lody.virtual.client.ipc.VPackageManager; import com.lody.virtual.client.stub.VASettings; -import com.lody.virtual.helper.compat.BuildCompat; import com.lody.virtual.helper.compat.BundleCompat; import com.lody.virtual.helper.utils.BitmapUtils; import com.lody.virtual.os.VUserHandle; @@ -399,7 +398,7 @@ public boolean isOutsidePackageVisible(String pkg) { } public boolean isXposedEnabled() { - return !VirtualCore.get().getContext().getFileStreamPath(".disable_xposed").exists() && !BuildCompat.isR(); + return !VirtualCore.get().getContext().getFileStreamPath(".disable_xposed").exists(); } public boolean isAppInstalled(String pkg) { From 93329bde6cacd8f80327fe1da1f96307e9c18f71 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 19:54:37 +0800 Subject: [PATCH 20/65] remove dex2oat Signed-off-by: tiann --- .../virtual/server/pm/VAppManagerService.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java index aa851f9cd..47e46b5d3 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java @@ -8,8 +8,6 @@ import com.lody.virtual.client.core.InstallStrategy; import com.lody.virtual.client.core.VirtualCore; -import com.lody.virtual.client.env.VirtualRuntime; -import com.lody.virtual.helper.ArtDexOptimizer; import com.lody.virtual.helper.collection.IntArray; import com.lody.virtual.helper.compat.NativeLibraryHelperCompat; import com.lody.virtual.helper.utils.ArrayUtils; @@ -37,8 +35,6 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicReference; -import dalvik.system.DexFile; - /** * @author Lody */ @@ -240,26 +236,6 @@ public synchronized InstallResult installPackage(String path, int flags, boolean PackageParserEx.savePackageCache(pkg); PackageCacheManager.put(pkg, ps); mPersistenceLayer.save(); - if (!dependSystem) { - boolean runDexOpt = false; - if (VirtualRuntime.isArt()) { - try { - ArtDexOptimizer.compileDex2Oat(ps.apkPath, VEnvironment.getOdexFile(ps.packageName).getPath()); - } catch (IOException e) { - e.printStackTrace(); - runDexOpt = true; - } - } else { - runDexOpt = true; - } - if (runDexOpt) { - try { - DexFile.loadDex(ps.apkPath, VEnvironment.getOdexFile(ps.packageName).getPath(), 0).close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } BroadcastSystem.get().startApp(pkg); if (notify) { notifyAppInstalled(ps, -1); From 3d7fe7ca308311c243615431e8e38511b8d39f43 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 20:11:18 +0800 Subject: [PATCH 21/65] Update epic Signed-off-by: tiann --- VirtualApp/lib/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VirtualApp/lib/build.gradle b/VirtualApp/lib/build.gradle index 430ea8379..937d3d444 100644 --- a/VirtualApp/lib/build.gradle +++ b/VirtualApp/lib/build.gradle @@ -44,7 +44,7 @@ dependencies { exclude group: 'me.weishu', module: 'epic' } implementation "me.weishu:free_reflection:3.0.1" - implementation "me.weishu:epic:0.11.0" + implementation "me.weishu:epic:0.11.1" } repositories { From 38f3be7124faf442f94b1cd9f59f622b0ca9efd5 Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 23 Nov 2020 20:53:41 +0800 Subject: [PATCH 22/65] Fix PackageInstallerSession error Signed-off-by: tiann --- .../server/pm/installer/PackageInstallerSession.java | 12 +++++++++--- .../pm/installer/VPackageInstallerService.java | 3 +++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java index 2228124e3..d707d743b 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java @@ -193,10 +193,11 @@ private void validateInstallLocked() throws PackageManagerException { final String targetName = "base.apk"; final File targetFile = new File(mResolvedStageDir, targetName); if (!addedFile.equals(targetFile)) { - addedFile.renameTo(targetFile); + // addedFile.renameTo(targetFile); + mResolvedStagedFiles.add(targetFile); + } else { + mResolvedBaseFile = targetFile; } - mResolvedBaseFile = targetFile; - mResolvedStagedFiles.add(targetFile); } } if (mResolvedBaseFile == null) { @@ -380,6 +381,11 @@ public void close() throws RemoteException { } } + // https://cs.android.com/android/platform/superproject/+/android-11.0.0_r1:frameworks/base/core/java/android/content/pm/IPackageInstallerSession.aidl;l=39 + public void commit(IntentSender statusReceiver, boolean forTransferred) throws RemoteException { + commit(statusReceiver); + } + @Override public void commit(IntentSender statusReceiver) throws RemoteException { final boolean wasSealed; diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java index 20be4d587..cb90f0908 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java @@ -117,6 +117,9 @@ private int createSessionInternal(SessionParams params, String installerPackageN sessionId = allocateSessionIdLocked(); session = new PackageInstallerSession(mInternalCallback, mContext, mInstallHandler.getLooper(), installerPackageName, sessionId, userId, callingUid, params, VEnvironment.getPackageInstallerStageDir()); } + synchronized (mSessions) { + mSessions.put(sessionId, session); + } mCallbacks.notifySessionCreated(session.sessionId, session.userId); return sessionId; } From edfb987193299c696265e18c4338ec21ffd8a00d Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 15:08:23 +0800 Subject: [PATCH 23/65] Feat: Initial support for split apks Signed-off-by: tiann --- .../android/content/pm/PackageParser.java | 5 ++++ .../virtual/server/pm/VAppManagerService.java | 27 ++++++++++++++++--- .../pm/installer/PackageInstallerSession.java | 11 +++++--- .../installer/VPackageInstallerService.java | 4 ++- .../server/pm/parser/PackageParserEx.java | 9 +++++++ .../virtual/server/pm/parser/VPackage.java | 24 +++++++++++++++++ 6 files changed, 73 insertions(+), 7 deletions(-) diff --git a/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java b/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java index 92d180028..abd7a7f0d 100644 --- a/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java +++ b/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java @@ -63,6 +63,11 @@ public class Package { // Applications requested features public ArrayList reqFeatures = null; public int mSharedUserLabel; + + public String[] splitNames; + public String codePath; + public String baseCodePath; + public String[] splitCodePaths; } public final class Service extends Component { diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java index 47e46b5d3..97ffecb96 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java @@ -147,7 +147,7 @@ public synchronized InstallResult installPackage(String path, int flags, boolean return InstallResult.makeFailure("path = NULL"); } File packageFile = new File(path); - if (!packageFile.exists() || !packageFile.isFile()) { + if (!packageFile.exists()) { return InstallResult.makeFailure("Package File is not exist."); } VPackage pkg = null; @@ -191,7 +191,6 @@ public synchronized InstallResult installPackage(String path, int flags, boolean dependSystem = false; } - NativeLibraryHelperCompat.copyNativeBinaries(new File(path), libDir); if (!dependSystem) { File privatePackageFile = new File(appDir, "base.apk"); File parentFolder = privatePackageFile.getParentFile(); @@ -200,14 +199,36 @@ public synchronized InstallResult installPackage(String path, int flags, boolean } else if (privatePackageFile.exists() && !privatePackageFile.delete()) { VLog.w(TAG, "Warning: unable to delete file : " + privatePackageFile.getPath()); } + File baseApkFile = packageFile.isFile() ? packageFile : new File(pkg.baseCodePath); try { - FileUtils.copyFile(packageFile, privatePackageFile); + FileUtils.copyFile(baseApkFile, privatePackageFile); } catch (IOException e) { privatePackageFile.delete(); return InstallResult.makeFailure("Unable to copy the package file."); } + // copy lib in base apk + NativeLibraryHelperCompat.copyNativeBinaries(baseApkFile, libDir); + packageFile = privatePackageFile; + + if (pkg.splitNames != null) { + int length = pkg.splitNames.length; + for (int i = 0; i < length; i++) { + String splitName = pkg.splitNames[i]; + File privateSplitFile = new File(appDir, splitName + ".apk"); + try { + FileUtils.copyFile(new File(pkg.splitCodePaths[i]), privateSplitFile); + + // copy lib in split apk + NativeLibraryHelperCompat.copyNativeBinaries(privateSplitFile, libDir); + } catch (IOException e) { + privateSplitFile.delete(); + return InstallResult.makeFailure("Unable to copy split: " + splitName); + } + } + } } + if (existOne != null) { PackageCacheManager.remove(pkg.packageName); } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java index d707d743b..d37c9a104 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallerSession.java @@ -20,6 +20,8 @@ import com.lody.virtual.helper.utils.FileUtils; import com.lody.virtual.helper.utils.VLog; +import com.lody.virtual.remote.InstallResult; +import com.lody.virtual.server.pm.VAppManagerService; import java.io.File; import java.io.FileDescriptor; @@ -179,6 +181,10 @@ public void onPackageInstalled(String basePackageName, int returnCode, String ms dispatchSessionFinished(returnCode, msg, extras); } }; + + InstallResult installResult = VAppManagerService.get().installPackage(stageDir.getPath(), 0); + destroyInternal(); + dispatchSessionFinished(installResult.isSuccess ? INSTALL_SUCCEEDED : INSTALL_FAILED_INTERNAL_ERROR, installResult.toString(), null); } private void validateInstallLocked() throws PackageManagerException { @@ -193,14 +199,13 @@ private void validateInstallLocked() throws PackageManagerException { final String targetName = "base.apk"; final File targetFile = new File(mResolvedStageDir, targetName); if (!addedFile.equals(targetFile)) { - // addedFile.renameTo(targetFile); - mResolvedStagedFiles.add(targetFile); + mResolvedStagedFiles.add(addedFile); } else { mResolvedBaseFile = targetFile; } } } - if (mResolvedBaseFile == null) { + if (mResolvedBaseFile == null && mResolvedStagedFiles.isEmpty()) { throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, "Full install must include a base package"); } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java index cb90f0908..98304cb39 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/installer/VPackageInstallerService.java @@ -29,6 +29,7 @@ import com.lody.virtual.server.IPackageInstaller; import com.lody.virtual.server.pm.VAppManagerService; +import java.io.File; import java.io.IOException; import java.security.SecureRandom; import java.util.ArrayList; @@ -115,7 +116,8 @@ private int createSessionInternal(SessionParams params, String installerPackageN "Too many active sessions for UID " + callingUid); } sessionId = allocateSessionIdLocked(); - session = new PackageInstallerSession(mInternalCallback, mContext, mInstallHandler.getLooper(), installerPackageName, sessionId, userId, callingUid, params, VEnvironment.getPackageInstallerStageDir()); + File sessionDir = new File(VEnvironment.getPackageInstallerStageDir(), "vmd-" + sessionId); + session = new PackageInstallerSession(mInternalCallback, mContext, mInstallHandler.getLooper(), installerPackageName, sessionId, userId, callingUid, params, sessionDir); } synchronized (mSessions) { mSessions.put(sessionId, session); diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java index fcc7a2243..d48fb530d 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java @@ -224,6 +224,15 @@ private static VPackage buildPackageCache(PackageParser.Package p) { cache.mAppMetaData = p.mAppMetaData; cache.configPreferences = p.configPreferences; cache.reqFeatures = p.reqFeatures; + + // for split apks + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + cache.splitNames = p.splitNames; + cache.codePath = p.codePath; + cache.baseCodePath = p.baseCodePath; + cache.splitCodePaths = p.splitCodePaths; + } + addOwner(cache); return cache; } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java index d62a3e4d4..5bbb71d7f 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java @@ -65,6 +65,20 @@ public VPackage[] newArray(int size) { public ArrayList reqFeatures = null; public Object mExtras; + public String[] splitNames; + + /** + * Path where this package was found on disk. For monolithic packages + * this is path to single base APK file; for cluster packages this is + * path to the cluster directory. + */ + public String codePath; + + /** Path of base APK */ + public String baseCodePath; + /** Paths of any split APKs, ordered by parsed splitName */ + public String[] splitCodePaths; + public VPackage() { } @@ -117,6 +131,11 @@ protected VPackage(Parcel in) { this.mSharedUserLabel = in.readInt(); this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR); this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR); + + this.splitNames = in.createStringArray(); + this.codePath = in.readString(); + this.baseCodePath = in.readString(); + this.splitCodePaths = in.createStringArray(); } @Override @@ -223,6 +242,11 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.mSharedUserLabel); dest.writeTypedList(this.configPreferences); dest.writeTypedList(this.reqFeatures); + + dest.writeStringArray(this.splitNames); + dest.writeString(this.codePath); + dest.writeString(this.baseCodePath); + dest.writeStringArray(this.splitCodePaths); } public static class ActivityIntentInfo extends IntentInfo { From b2ecf793bcc8ffa1a521559d67d38beeaa53cbae Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 16:06:56 +0800 Subject: [PATCH 24/65] Feat: support split resources Signed-off-by: tiann --- .../io/virtualapp/home/adapters/CloneAppListAdapter.java | 3 +++ .../src/main/java/io/virtualapp/home/models/AppInfo.java | 1 + .../main/java/io/virtualapp/home/repo/AppRepository.java | 7 +++++++ .../java/com/lody/virtual/client/core/VirtualCore.java | 5 +++++ .../java/com/lody/virtual/remote/InstalledAppInfo.java | 8 +++++++- .../java/com/lody/virtual/server/pm/PackageSetting.java | 6 +++++- .../com/lody/virtual/server/pm/VAppManagerService.java | 6 ++++++ .../lody/virtual/server/pm/parser/PackageParserEx.java | 5 +++-- 8 files changed, 37 insertions(+), 4 deletions(-) diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java index 08b4848c5..1c1e521df 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java @@ -98,6 +98,9 @@ public void onBindViewHolder(ViewHolder holder, int position) { holder.labelView.setVisibility(View.INVISIBLE); } + if (info.splitApk) { + } else { + } holder.itemView.setOnClickListener(v -> { mItemEventListener.onItemClick(info, position); }); diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java index 65bffbe2b..0ae8230aa 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java @@ -15,4 +15,5 @@ public class AppInfo { public CharSequence version; public int cloneCount; public boolean disableMultiVersion; + public boolean splitApk; } diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java b/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java index b918503d3..670b8c4be 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java @@ -181,6 +181,12 @@ private List convertPackageInfoToAppData(Context context, List convertPackageInfoToAppData(Context context, List CREATOR = new Creator() { diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java index f3a049b2f..ec0780f1f 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java @@ -33,6 +33,8 @@ public PackageSetting[] newArray(int size) { public int appId; public long firstInstallTime; public long lastUpdateTime; + + public String[] splitCodePaths; private SparseArray userState = new SparseArray<>(); public PackageSetting() { @@ -47,10 +49,11 @@ protected PackageSetting(Parcel in) { //noinspection unchecked this.userState = in.readSparseArray(PackageUserState.class.getClassLoader()); this.skipDexOpt = in.readByte() != 0; + this.splitCodePaths = in.createStringArray(); } public InstalledAppInfo getAppInfo() { - return new InstalledAppInfo(packageName, apkPath, libPath, dependSystem, skipDexOpt, appId); + return new InstalledAppInfo(packageName, apkPath, libPath, dependSystem, skipDexOpt, appId, splitCodePaths); } PackageUserState modifyUserState(int userId) { @@ -96,6 +99,7 @@ public void writeToParcel(Parcel dest, int flags) { //noinspection unchecked dest.writeSparseArray((SparseArray) this.userState); dest.writeByte(this.skipDexOpt ? (byte) 1 : (byte) 0); + dest.writeStringArray(this.splitCodePaths); } public boolean isLaunched(int userId) { diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java index 97ffecb96..c51929047 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java @@ -191,6 +191,8 @@ public synchronized InstallResult installPackage(String path, int flags, boolean dependSystem = false; } + String[] splitCodePaths = null; + if (!dependSystem) { File privatePackageFile = new File(appDir, "base.apk"); File parentFolder = privatePackageFile.getParentFile(); @@ -213,6 +215,8 @@ public synchronized InstallResult installPackage(String path, int flags, boolean if (pkg.splitNames != null) { int length = pkg.splitNames.length; + splitCodePaths = new String[length]; + for (int i = 0; i < length; i++) { String splitName = pkg.splitNames[i]; File privateSplitFile = new File(appDir, splitName + ".apk"); @@ -225,6 +229,7 @@ public synchronized InstallResult installPackage(String path, int flags, boolean privateSplitFile.delete(); return InstallResult.makeFailure("Unable to copy split: " + splitName); } + splitCodePaths[i] = privateSplitFile.getPath(); } } } @@ -254,6 +259,7 @@ public synchronized InstallResult installPackage(String path, int flags, boolean ps.setUserState(userId, false/*launched*/, false/*hidden*/, installed); } } + ps.splitCodePaths = splitCodePaths; PackageParserEx.savePackageCache(pkg); PackageCacheManager.put(pkg, ps); mPersistenceLayer.save(); diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java index d48fb530d..d0b425481 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java @@ -250,8 +250,9 @@ public static void initApplicationInfoBase(PackageSetting ps, VPackage p) { ai.publicSourceDir = ps.apkPath; ai.sourceDir = ps.apkPath; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ai.splitSourceDirs = new String[]{ps.apkPath}; - ai.splitPublicSourceDirs = ai.splitSourceDirs; + ai.splitSourceDirs = ps.splitCodePaths; + ai.splitPublicSourceDirs = ps.splitCodePaths; + ApplicationInfoL.scanSourceDir.set(ai, ai.dataDir); ApplicationInfoL.scanPublicSourceDir.set(ai, ai.dataDir); String hostPrimaryCpuAbi = ApplicationInfoL.primaryCpuAbi.get(VirtualCore.get().getContext().getApplicationInfo()); From d3d9bcd6ed0fbf81af9c8e637860aeb7faff988b Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 16:12:06 +0800 Subject: [PATCH 25/65] Add special mark for split apk Signed-off-by: tiann --- .../io/virtualapp/home/adapters/CloneAppListAdapter.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java index 1c1e521df..5ff876be3 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java @@ -83,7 +83,7 @@ public void onBindViewHolder(ViewHolder holder, int position) { GlideUtils.loadPackageIconFromApkFile(mContext, info.path, holder.iconView, android.R.drawable.sym_def_app_icon); } - holder.nameView.setText(String.format("%s: %s", info.name, info.version)); + holder.nameView.setText(String.format("%s: %s%s", info.name, info.version, info.splitApk ? " [S]" : "")); if (isIndexSelected(position)) { holder.iconView.setAlpha(1f); holder.appCheckView.setImageResource(R.drawable.ic_check); @@ -98,9 +98,6 @@ public void onBindViewHolder(ViewHolder holder, int position) { holder.labelView.setVisibility(View.INVISIBLE); } - if (info.splitApk) { - } else { - } holder.itemView.setOnClickListener(v -> { mItemEventListener.onItemClick(info, position); }); From 69a5a6b2128ff2fa73aab633f2b1b0ecc7b8e5b2 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 16:14:40 +0800 Subject: [PATCH 26/65] 0.20.1 Feat: Support split apk. fixes #896, #704 Signed-off-by: tiann --- VirtualApp/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VirtualApp/app/build.gradle b/VirtualApp/app/build.gradle index cf0ce69ae..3a132d83a 100644 --- a/VirtualApp/app/build.gradle +++ b/VirtualApp/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "io.va.exposed" minSdkVersion 21 targetSdkVersion 23 - versionCode 200 - versionName "0.20.0" + versionCode 201 + versionName "0.20.1" multiDexEnabled false android { defaultConfig { From fe87e43b584cb897a53c35d5eed83bf80133ea7e Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 16:38:20 +0800 Subject: [PATCH 27/65] Add batterstats hook Signed-off-by: tiann --- .../client/core/InvocationStubManager.java | 3 ++ .../proxies/battery/BatteryStatsStub.java | 33 +++++++++++++++++++ .../android/internal/app/IBatteryStats.java | 23 +++++++++++++ .../os/health/SystemHealthManager.java | 17 ++++++++++ 4 files changed, 76 insertions(+) create mode 100644 VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/battery/BatteryStatsStub.java create mode 100644 VirtualApp/lib/src/main/java/mirror/com/android/internal/app/IBatteryStats.java create mode 100644 VirtualApp/lib/src/main/java/mirror/com/android/internal/os/health/SystemHealthManager.java diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java index 0f7045161..27462a8f7 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java @@ -15,6 +15,7 @@ import com.lody.virtual.client.hook.proxies.appwidget.AppWidgetManagerStub; import com.lody.virtual.client.hook.proxies.audio.AudioManagerStub; import com.lody.virtual.client.hook.proxies.backup.BackupManagerStub; +import com.lody.virtual.client.hook.proxies.battery.BatteryStatsStub; import com.lody.virtual.client.hook.proxies.bluetooth.BluetoothStub; import com.lody.virtual.client.hook.proxies.clipboard.ClipBoardStub; import com.lody.virtual.client.hook.proxies.connectivity.ConnectivityStub; @@ -187,6 +188,8 @@ private void injectInternal() throws Throwable { addInjector(new WifiScannerStub()); addInjector(new ShortcutServiceStub()); addInjector(new DevicePolicyManagerStub()); + + addInjector(new BatteryStatsStub()); } if (BuildCompat.isOreo()) { addInjector(new AutoFillManagerStub()); diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/battery/BatteryStatsStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/battery/BatteryStatsStub.java new file mode 100644 index 000000000..bae215ad3 --- /dev/null +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/battery/BatteryStatsStub.java @@ -0,0 +1,33 @@ +package com.lody.virtual.client.hook.proxies.battery; + +import android.content.Context; +import android.os.IInterface; + +import com.lody.virtual.client.core.VirtualCore; +import com.lody.virtual.client.hook.base.BinderInvocationProxy; +import com.lody.virtual.client.hook.base.ReplaceLastUidMethodProxy; + +import mirror.com.android.internal.os.health.SystemHealthManager; + +/** + * @author weishu + * @date 2020/11/24. + */ +public class BatteryStatsStub extends BinderInvocationProxy { + + public BatteryStatsStub() { + super(getInterface(), "batterystats"); + } + + private static IInterface getInterface() { + Object manager = VirtualCore.get().getContext().getSystemService(Context.SYSTEM_HEALTH_SERVICE); + return SystemHealthManager.mBatteryStats.get(manager); + } + + @Override + protected void onBindMethods() { + super.onBindMethods(); + + addMethodProxy(new ReplaceLastUidMethodProxy("takeUidSnapshot")); + } +} diff --git a/VirtualApp/lib/src/main/java/mirror/com/android/internal/app/IBatteryStats.java b/VirtualApp/lib/src/main/java/mirror/com/android/internal/app/IBatteryStats.java new file mode 100644 index 000000000..df3e44c5b --- /dev/null +++ b/VirtualApp/lib/src/main/java/mirror/com/android/internal/app/IBatteryStats.java @@ -0,0 +1,23 @@ +package mirror.com.android.internal.app; + +import android.os.IBinder; +import android.os.IInterface; + +import mirror.MethodParams; +import mirror.RefClass; +import mirror.RefStaticMethod; + +/** + * @author weishu + * @date 2020/11/24. + */ + +public class IBatteryStats { + public static Class TYPE = RefClass.load(IBatteryStats.class, "com.android.internal.app.IBatteryStats"); + + public static class Stub { + public static Class TYPE = RefClass.load(IBatteryStats.Stub.class, "com.android.internal.app.IBatteryStats$Stub"); + @MethodParams({IBinder.class}) + public static RefStaticMethod asInterface; + } +} diff --git a/VirtualApp/lib/src/main/java/mirror/com/android/internal/os/health/SystemHealthManager.java b/VirtualApp/lib/src/main/java/mirror/com/android/internal/os/health/SystemHealthManager.java new file mode 100644 index 000000000..2ffe17e73 --- /dev/null +++ b/VirtualApp/lib/src/main/java/mirror/com/android/internal/os/health/SystemHealthManager.java @@ -0,0 +1,17 @@ +package mirror.com.android.internal.os.health; + +import android.os.IInterface; + +import mirror.RefClass; +import mirror.RefObject; + +/** + * @author weishu + * @date 2020/11/24. + */ + +public class SystemHealthManager { + public static Class TYPE = RefClass.load(SystemHealthManager.class, "android.os.health.SystemHealthManager"); + + public static RefObject mBatteryStats; +} From d3b1f0724a0abda2535551d2b358e1eefa093af1 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 17:42:35 +0800 Subject: [PATCH 28/65] Fix network error caused by apache.http.legacy. Signed-off-by: tiann --- .../src/main/java/android/content/pm/PackageParser.java | 2 ++ .../com/lody/virtual/client/ipc/VPackageManager.java | 6 +++++- .../lody/virtual/server/pm/VPackageManagerService.java | 9 ++++++++- .../lody/virtual/server/pm/parser/PackageParserEx.java | 2 ++ .../java/com/lody/virtual/server/pm/parser/VPackage.java | 5 +++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java b/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java index abd7a7f0d..aa99d44a3 100644 --- a/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java +++ b/VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java @@ -68,6 +68,8 @@ public class Package { public String codePath; public String baseCodePath; public String[] splitCodePaths; + + public ArrayList usesOptionalLibraries; } public final class Service extends Component { diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java index 1f46d97a0..90656cdf0 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java @@ -189,7 +189,11 @@ public ApplicationInfo getApplicationInfo(String packageName, int flags, int use if (!new File(APACHE_LEGACY).exists()) { APACHE_LEGACY = "/system/framework/org.apache.http.legacy.jar"; } - if (android.os.Build.VERSION.SDK_INT >= P && info.targetSdkVersion <= P) { + List sharedLibraries = getInterface().getSharedLibraries(packageName); + boolean forceAdd = sharedLibraries.contains("org.apache.http.legacy"); + + // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater.java;l=36?q=OrgApacheHttpLegacyUpdater&ss=android%2Fplatform%2Fsuperproject:frameworks%2Fbase%2Fservices%2Fcore%2Fjava%2Fcom%2Fandroid%2Fserver%2Fpm%2Fparsing%2Flibrary%2F + if (android.os.Build.VERSION.SDK_INT >= P && info.targetSdkVersion < P || forceAdd) { String[] newSharedLibraryFiles; if (info.sharedLibraryFiles == null) { newSharedLibraryFiles = new String[]{APACHE_LEGACY}; diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java index 4c5a1f7af..fa8e54106 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java @@ -220,7 +220,14 @@ public List getSharedLibraries(String packageName) { synchronized (mPackages) { VPackage p = mPackages.get(packageName); if (p != null) { - return p.usesLibraries; + ArrayList list = new ArrayList<>(); + if (p.usesLibraries != null) { + list.addAll(p.usesLibraries); + } + if (p.usesOptionalLibraries != null) { + list.addAll(p.usesOptionalLibraries); + } + return list; } return null; } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java index d0b425481..4b5f272c0 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java @@ -233,6 +233,8 @@ private static VPackage buildPackageCache(PackageParser.Package p) { cache.splitCodePaths = p.splitCodePaths; } + cache.usesOptionalLibraries = p.usesOptionalLibraries; + addOwner(cache); return cache; } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java index 5bbb71d7f..809b5c373 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java @@ -66,6 +66,7 @@ public VPackage[] newArray(int size) { public Object mExtras; public String[] splitNames; + public ArrayList usesOptionalLibraries; /** * Path where this package was found on disk. For monolithic packages @@ -136,6 +137,8 @@ protected VPackage(Parcel in) { this.codePath = in.readString(); this.baseCodePath = in.readString(); this.splitCodePaths = in.createStringArray(); + + this.usesOptionalLibraries = in.createStringArrayList(); } @Override @@ -247,6 +250,8 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.codePath); dest.writeString(this.baseCodePath); dest.writeStringArray(this.splitCodePaths); + + dest.writeStringList(this.usesOptionalLibraries); } public static class ActivityIntentInfo extends IntentInfo { From 54d169a003a4dd55883c13b83ade4c5bdfab3c17 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 24 Nov 2020 20:52:22 +0800 Subject: [PATCH 29/65] Fix Xposed API error. fixes #752 Signed-off-by: tiann --- VirtualApp/lib/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VirtualApp/lib/build.gradle b/VirtualApp/lib/build.gradle index 937d3d444..573f40a2b 100644 --- a/VirtualApp/lib/build.gradle +++ b/VirtualApp/lib/build.gradle @@ -42,9 +42,11 @@ dependencies { api("me.weishu.exposed:exposed-core:0.8.1") { exclude group: 'me.weishu', module: 'free_reflection' exclude group: 'me.weishu', module: 'epic' + exclude group: 'me.weishu.exposed', module: 'exposed-xposedapi' } implementation "me.weishu:free_reflection:3.0.1" implementation "me.weishu:epic:0.11.1" + implementation "me.weishu.exposed:exposed-xposedapi:0.4.6" } repositories { From 41c3511fdf5a33771511c76243753b20d7ce8aee Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 25 Nov 2020 10:45:49 +0800 Subject: [PATCH 30/65] 0.20.2 Signed-off-by: tiann --- VirtualApp/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VirtualApp/app/build.gradle b/VirtualApp/app/build.gradle index 3a132d83a..feca88a64 100644 --- a/VirtualApp/app/build.gradle +++ b/VirtualApp/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "io.va.exposed" minSdkVersion 21 targetSdkVersion 23 - versionCode 201 - versionName "0.20.1" + versionCode 202 + versionName "0.20.2" multiDexEnabled false android { defaultConfig { From 820d3b795f8601de85c2538b4a954553555d87b0 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 3 Dec 2020 14:23:58 +0800 Subject: [PATCH 31/65] Fix signingInfo above Android Pie Signed-off-by: tiann --- .../virtual/helper/compat/BuildCompat.java | 20 +++++++++++++------ .../server/pm/parser/PackageParserEx.java | 17 +++++++++++++++- .../virtual/server/pm/parser/VPackage.java | 13 ++++++++++++ .../android/content/pm/PackageParser.java | 13 +++++++++--- 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java index d91ac33d6..1653ed2a0 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java @@ -20,19 +20,27 @@ public static int getPreviewSDKInt() { } public static boolean isOreo() { + return isAndroidLevel(Build.VERSION_CODES.O); + } - return (Build.VERSION.SDK_INT == 25 && getPreviewSDKInt() > 0) - || Build.VERSION.SDK_INT > 25; + public static boolean isPie() { + return isAndroidLevel(Build.VERSION_CODES.P); } public static boolean isQ() { - final int SDK = Build.VERSION.SDK_INT; - final int Q = 29; - return SDK == Q - 1 && getPreviewSDKInt() > 0 || Build.VERSION.SDK_INT >= Q; + return isAndroidLevel(29); } public static boolean isR() { - return Build.VERSION.SDK_INT >= 30; + return isAndroidLevel(30); + } + + private static boolean isAndroidLevelPreview(int level) { + return (Build.VERSION.SDK_INT == level && getPreviewSDKInt() > 0) + || Build.VERSION.SDK_INT > level; } + private static boolean isAndroidLevel(int level) { + return Build.VERSION.SDK_INT >= level; + } } \ No newline at end of file diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java index 4b5f272c0..47cb837df 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java @@ -14,6 +14,7 @@ import android.content.pm.ServiceInfo; import android.content.pm.Signature; import android.os.Build; +import android.os.Bundle; import android.os.Parcel; import android.text.TextUtils; @@ -21,6 +22,7 @@ import com.lody.virtual.client.env.Constants; import com.lody.virtual.client.fixer.ComponentFixer; import com.lody.virtual.helper.collection.ArrayMap; +import com.lody.virtual.helper.compat.BuildCompat; import com.lody.virtual.helper.compat.PackageParserCompat; import com.lody.virtual.helper.utils.FileUtils; import com.lody.virtual.helper.utils.VLog; @@ -121,6 +123,9 @@ public static void readSignature(VPackage pkg) { p.unmarshall(bytes, 0, bytes.length); p.setDataPosition(0); pkg.mSignatures = p.createTypedArray(Signature.CREATOR); + if (BuildCompat.isPie()) { + pkg.signingInfo = p.readParcelable(Bundle.class.getClassLoader()); + } } catch (IOException e) { e.printStackTrace(); } finally { @@ -151,6 +156,9 @@ public static void savePackageCache(VPackage pkg) { p = Parcel.obtain(); try { p.writeTypedArray(signatures, 0); + if (BuildCompat.isPie()) { + p.writeParcelable(pkg.signingInfo, 0); + } FileUtils.writeParcelToFile(p, signatureFile); } catch (IOException e) { e.printStackTrace(); @@ -212,6 +220,7 @@ private static VPackage buildPackageCache(PackageParser.Package p) { System.arraycopy(signatures, 0, cache.mSignatures, 0, numberOfSigs); } } + cache.signingInfo = mirror.android.content.pm.PackageParser.SigningInfo.ctor.newInstance(signingDetails); } cache.mAppMetaData = p.mAppMetaData; cache.packageName = p.packageName; @@ -425,13 +434,19 @@ public static PackageInfo generatePackageInfo(VPackage p, int flags, long firstI } } } - if ((flags & PackageManager.GET_SIGNATURES) != 0) { + boolean hasGetSignatureFlag = (flags & PackageManager.GET_SIGNATURES) != 0; + boolean hasGetSigningInfoFlag = BuildCompat.isPie() && (flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0; + + if (hasGetSignatureFlag || hasGetSigningInfoFlag) { int N = (p.mSignatures != null) ? p.mSignatures.length : 0; if (N > 0) { pi.signatures = new Signature[N]; System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); } } + if (hasGetSigningInfoFlag) { + pi.signingInfo = p.signingInfo; + } return pi; } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java index 809b5c373..4000442ea 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/VPackage.java @@ -14,11 +14,14 @@ import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import android.content.pm.Signature; +import android.content.pm.SigningInfo; import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; +import com.lody.virtual.helper.compat.BuildCompat; + import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -80,6 +83,8 @@ public VPackage[] newArray(int size) { /** Paths of any split APKs, ordered by parsed splitName */ public String[] splitCodePaths; + public SigningInfo signingInfo; + public VPackage() { } @@ -139,6 +144,10 @@ protected VPackage(Parcel in) { this.splitCodePaths = in.createStringArray(); this.usesOptionalLibraries = in.createStringArrayList(); + + if (BuildCompat.isPie()) { + this.signingInfo = in.readParcelable(Bundle.class.getClassLoader()); + } } @Override @@ -252,6 +261,10 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeStringArray(this.splitCodePaths); dest.writeStringList(this.usesOptionalLibraries); + + if (BuildCompat.isPie()) { + dest.writeParcelable(this.signingInfo, flags); + } } public static class ActivityIntentInfo extends IntentInfo { diff --git a/VirtualApp/lib/src/main/java/mirror/android/content/pm/PackageParser.java b/VirtualApp/lib/src/main/java/mirror/android/content/pm/PackageParser.java index 38a4ac02e..de8086cae 100644 --- a/VirtualApp/lib/src/main/java/mirror/android/content/pm/PackageParser.java +++ b/VirtualApp/lib/src/main/java/mirror/android/content/pm/PackageParser.java @@ -16,12 +16,12 @@ import java.io.File; import java.util.List; +import mirror.MethodParams; +import mirror.MethodReflectParams; import mirror.RefClass; import mirror.RefConstructor; -import mirror.RefObject; import mirror.RefMethod; -import mirror.MethodParams; -import mirror.MethodReflectParams; +import mirror.RefObject; import mirror.RefStaticMethod; /** @@ -101,6 +101,13 @@ public static class Component { public static RefObject> intents; } + public static class SigningInfo { + public static Class TYPE = RefClass.load(SigningInfo.class, "android.content.pm.SigningInfo"); + + @MethodReflectParams("android.content.pm.PackageParser$SigningDetails") + public static RefConstructor ctor; + } + public static class SigningDetails { public static Class TYPE = RefClass.load(SigningDetails.class, "android.content.pm.PackageParser$SigningDetails"); public static RefObject signatures; From 6e4e26a4c6e5954061013031de951b2faadf8ccf Mon Sep 17 00:00:00 2001 From: tiann Date: Mon, 14 Dec 2020 15:49:22 +0800 Subject: [PATCH 32/65] New applicationId. fixes #948 Signed-off-by: tiann --- VirtualApp/app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VirtualApp/app/build.gradle b/VirtualApp/app/build.gradle index feca88a64..71639dbf9 100644 --- a/VirtualApp/app/build.gradle +++ b/VirtualApp/app/build.gradle @@ -20,11 +20,11 @@ android { compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { - applicationId "io.va.exposed" + applicationId "io.va.exposed64" minSdkVersion 21 targetSdkVersion 23 - versionCode 202 - versionName "0.20.2" + versionCode 203 + versionName "0.20.3" multiDexEnabled false android { defaultConfig { From 62b1d7d9eb4105231d73dc0fc13bcedceec81870 Mon Sep 17 00:00:00 2001 From: weishu Date: Tue, 15 Dec 2020 12:32:42 +0800 Subject: [PATCH 33/65] Create FUNDING.yml --- .github/FUNDING.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..3ba82c5e5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # replace +patreon: weishu +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: http://paypal.me/virtualxposed From 212db8e304d1205f4021be8411ac5dffc68eb658 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 15 Dec 2020 13:53:06 +0800 Subject: [PATCH 34/65] Fix conflicts with 32bit app. Signed-off-by: tiann --- VirtualApp/app/src/main/AndroidManifest.xml | 6 +++--- .../main/java/io/virtualapp/dev/CmdReceiver.java | 3 ++- VirtualApp/launcher | 2 +- .../hook/proxies/account/AccountManagerStub.java | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/VirtualApp/app/src/main/AndroidManifest.xml b/VirtualApp/app/src/main/AndroidManifest.xml index d1f4b81b7..e56921e67 100644 --- a/VirtualApp/app/src/main/AndroidManifest.xml +++ b/VirtualApp/app/src/main/AndroidManifest.xml @@ -87,7 +87,7 @@ android:excludeFromRecents="true" android:label="@string/shared_to_vxp" android:screenOrientation="portrait" - android:taskAffinity="io.va.exposed.share" + android:taskAffinity="${applicationId}.share" android:theme="@style/Theme.AppCompat.Light.Dialog"> @@ -105,7 +105,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_installer_label" android:noHistory="true" - android:taskAffinity="io.va.exposed.installer" + android:taskAffinity="${applicationId}.installer" android:theme="@style/Theme.AppCompat.Light" /> - + diff --git a/VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java b/VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java index fc704a8ae..c296108f6 100644 --- a/VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java +++ b/VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java @@ -12,6 +12,7 @@ import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.remote.InstallResult; +import io.virtualapp.BuildConfig; import io.virtualapp.home.LoadingActivity; /** @@ -20,7 +21,7 @@ public class CmdReceiver extends BroadcastReceiver { - private static final String ACTION = "io.va.exposed.CMD"; + private static final String ACTION = BuildConfig.APPLICATION_ID + ".CMD"; private static final String KEY_CMD = "cmd"; private static final String KEY_PKG = "pkg"; private static final String KEY_UID = "uid"; diff --git a/VirtualApp/launcher b/VirtualApp/launcher index 3c930960e..3da4958a6 160000 --- a/VirtualApp/launcher +++ b/VirtualApp/launcher @@ -1 +1 @@ -Subproject commit 3c930960e68aa91a115f6fe8983ab7e91cbf3d2e +Subproject commit 3da4958a664936a981c528e43544a5082f714a0c diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/account/AccountManagerStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/account/AccountManagerStub.java index 144630917..455be4e25 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/account/AccountManagerStub.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/account/AccountManagerStub.java @@ -62,6 +62,8 @@ protected void onBindMethods() { addMethodProxy(new renameAccount()); addMethodProxy(new getPreviousName()); addMethodProxy(new renameSharedAccountAsUser()); + + addMethodProxy(new setAccountVisibility()); } private static class getPassword extends MethodProxy { @@ -594,4 +596,17 @@ public Object call(Object who, Method method, Object... args) throws Throwable { return method.invoke(who, args); } } + + private static class setAccountVisibility extends MethodProxy { + + @Override + public String getMethodName() { + return "setAccountVisibility"; + } + + @Override + public Object call(Object who, Method method, Object... args) throws Throwable { + return true; + } + } } From 4f385db2639f8c66065bb307d593319914c6013a Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 24 Feb 2021 12:23:54 +0800 Subject: [PATCH 35/65] [Android 12]: fix crash of atms Signed-off-by: tiann --- .../main/java/android/app/ActivityOptions.java | 9 +++++++++ .../android/app/ClientTransactionHandler.java | 13 +++++++++++++ .../java/android/app/TransactionHandlerProxy.java | 15 +++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 VirtualApp/lib/src/main/java/android/app/ActivityOptions.java diff --git a/VirtualApp/lib/src/main/java/android/app/ActivityOptions.java b/VirtualApp/lib/src/main/java/android/app/ActivityOptions.java new file mode 100644 index 000000000..d8a416efd --- /dev/null +++ b/VirtualApp/lib/src/main/java/android/app/ActivityOptions.java @@ -0,0 +1,9 @@ +package android.app; + +/** + * @author weishu + * @date 2021/2/24. + */ + +class ActivityOptions { +} diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index e8d2f22f2..72a907825 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -78,6 +78,11 @@ public abstract void handlePauseActivity(IBinder token, boolean finished, boolea */ public abstract void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason); + + // Android 12 + public abstract void handleResumeActivity(ActivityThread.ActivityClientRecord record, boolean finalStateRequest, + boolean isForward, String reason); + /** * Stop the activity. * @param token Target activity token. @@ -127,6 +132,11 @@ public abstract Activity handleLaunchActivity(ActivityThread.ActivityClientRecor public abstract void handleStartActivity(ActivityThread.ActivityClientRecord r, PendingTransactionActions pendingActions); + // Android 12 + /** Perform activity start. */ + public abstract void handleStartActivity(ActivityThread.ActivityClientRecord r, + PendingTransactionActions pendingActions, ActivityOptions options); + // Android 11 public abstract void handleStartActivity(IBinder binder, PendingTransactionActions pendingActions); @@ -184,6 +194,9 @@ public abstract void handleRelaunchActivity(ActivityThread.ActivityClientRecord public abstract void handleTopResumedActivityChanged(IBinder arg1, boolean arg2, String arg3); + public abstract void handleTopResumedActivityChanged(ActivityThread.ActivityClientRecord record, boolean arg2, String arg3); + + /** Count how many activities are launching. */ public abstract void countLaunchingActivities(int num); diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index 019d0b14e..5d1c10701 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -77,6 +77,11 @@ public void handleResumeActivity(IBinder token, boolean finalStateRequest, boole originalHandler.handleResumeActivity(token, finalStateRequest, isForward, reason); } + @Override + public void handleResumeActivity(ActivityClientRecord record, boolean finalStateRequest, boolean isForward, String reason) { + originalHandler.handleResumeActivity(record, finalStateRequest, isForward, reason); + } + @Override public void handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { originalHandler.handleStopActivity(token, show, configChanges, pendingActions, finalStateRequest, reason); @@ -181,6 +186,11 @@ public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactionA return originalHandler.handleLaunchActivity(r, pendingActions, customIntent); } + @Override + public void handleStartActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, ActivityOptions options) { + originalHandler.handleStartActivity(r, pendingActions, options); + } + @Override public void handleStartActivity(ActivityClientRecord r, PendingTransactionActions pendingActions) { originalHandler.handleStartActivity(r, pendingActions); @@ -247,6 +257,11 @@ public void handleTopResumedActivityChanged(IBinder arg1, boolean arg2, String a originalHandler.handleTopResumedActivityChanged(arg1, arg2, arg3); } + @Override + public void handleTopResumedActivityChanged(ActivityClientRecord record, boolean arg2, String arg3) { + originalHandler.handleTopResumedActivityChanged(record, arg2, arg3); + } + @Override public void countLaunchingActivities(int num) { originalHandler.countLaunchingActivities(num); From f5b1174b8b0963e20c2d087fe318b8ffa9ee0af7 Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 24 Feb 2021 12:40:23 +0800 Subject: [PATCH 36/65] [Android 12]: Fix launcher icon Signed-off-by: tiann --- VirtualApp/launcher | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VirtualApp/launcher b/VirtualApp/launcher index 3da4958a6..666d274d8 160000 --- a/VirtualApp/launcher +++ b/VirtualApp/launcher @@ -1 +1 @@ -Subproject commit 3da4958a664936a981c528e43544a5082f714a0c +Subproject commit 666d274d8a0d29101328552b5ce018d90e4deee6 From dfa1862525c76894e9b2526ceccdaf4f646756a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E4=B8=BD=E6=AC=A3?= Date: Thu, 25 Feb 2021 05:15:34 +0800 Subject: [PATCH 37/65] Fix Android 11 broken obb Fix obb directory fetching and crash. Add a mount point. --- .../java/com/lody/virtual/client/VClientImpl.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index 055721283..4c5d5eab4 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -507,7 +507,11 @@ private void setupVirtualStorage(ApplicationInfo info, int userId) { whiteList.add(Environment.DIRECTORY_MOVIES); whiteList.add(Environment.DIRECTORY_DOWNLOADS); whiteList.add(Environment.DIRECTORY_DCIM); - whiteList.add("Android/obb"); + // Android 11, do not tryna fetch this directory directly or crash. + // See docs below... + if (Build.VERSION.SDK_INT < 30) { + whiteList.add("Android/obb"); + } if (Build.VERSION.SDK_INT >= 19) { whiteList.add(Environment.DIRECTORY_DOCUMENTS); } @@ -535,8 +539,13 @@ private void setupVirtualStorage(ApplicationInfo info, int userId) { NativeEngine.whitelist(whitePath, true); } + // Android 11 -> see https://developer.android.com/training/data-storage#scoped-storage + // 安卓11 打开这个链接看看 https://developer.android.google.cn/training/data-storage#scoped-storage + // see https://android-opengrok.bangnimang.net/android-11.0.0_r8/xref/frameworks/base/core/java/android/os/Environment.java // redirect xxx/Android/data/ -> /xxx/Android/data//virtual/ NativeEngine.redirectDirectory(new File(storageRoot, "Android/data/").getAbsolutePath(), privatePath); + // redirect xxx/Android/obb/ -> /xxx/Android/data//virtual/ + NativeEngine.redirectDirectory(new File(storageRoot, "Android/obb/").getAbsolutePath(), privatePath); // redirect /sdcard/ -> vsdcard NativeEngine.redirectDirectory(storageRoot, vsPath); } @@ -547,6 +556,9 @@ private HashSet getMountPoints() { HashSet mountPoints = new HashSet<>(3); mountPoints.add("/mnt/sdcard/"); mountPoints.add("/sdcard/"); + // Redmi 10X Pro, Pixel 5... More mount points? + // 1@die.lu + mountPoints.add("/storage/self/primary/"); String[] points = StorageManagerCompat.getAllPoints(VirtualCore.get().getContext()); if (points != null) { Collections.addAll(mountPoints, points); From 13e6157cb228cdf5611979bbfcdd712051333a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E4=B8=BD=E6=AC=A3?= Date: Thu, 25 Feb 2021 05:29:50 +0800 Subject: [PATCH 38/65] Fix Android 11 storage redirect Android 11 must enable storage redirect or crash --- .../lib/src/main/java/com/lody/virtual/client/VClientImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index 4c5d5eab4..7e16423b0 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -484,7 +484,8 @@ private void startIOUniformer() { private void setupVirtualStorage(ApplicationInfo info, int userId) { VirtualStorageManager vsManager = VirtualStorageManager.get(); boolean enable = vsManager.isVirtualStorageEnable(info.packageName, userId); - if (!enable) { + // Android 11, force enable storage redirect. + if (!enable && !(Build.VERSION.SDK_INT >= 30)) { // There are lots of situation to deal, I am tired, disable it now. // such as: FileProvider. return; From 015764e2c7654be2cef16f859b9c2ac0cd8b9df0 Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 18 Aug 2021 23:00:22 +0800 Subject: [PATCH 39/65] [Android 11]: Fix registerReceiverWithFeature on Android 11. Signed-off-by: tiann --- .../client/hook/proxies/am/MethodProxies.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java index 1d42d0962..da6c04570 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java @@ -1228,14 +1228,14 @@ public boolean isEnable() { static class RegisterReceiver extends MethodProxy { - private static final int IDX_IIntentReceiver = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 + protected int mIIntentReceiverIndex = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 ? 2 : 1; - private static final int IDX_RequiredPermission = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 + protected int mRequiredPermissionIndex = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 ? 4 : 3; - private static final int IDX_IntentFilter = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 + protected int mIntentFilterIndex = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 ? 3 : 2; @@ -1249,11 +1249,11 @@ public String getMethodName() { @Override public Object call(Object who, Method method, Object... args) throws Throwable { MethodParameterUtils.replaceFirstAppPkg(args); - args[IDX_RequiredPermission] = null; - IntentFilter filter = (IntentFilter) args[IDX_IntentFilter]; + args[mRequiredPermissionIndex] = null; + IntentFilter filter = (IntentFilter) args[mIntentFilterIndex]; SpecialComponentList.protectIntentFilter(filter); - if (args.length > IDX_IIntentReceiver && IIntentReceiver.class.isInstance(args[IDX_IIntentReceiver])) { - final IInterface old = (IInterface) args[IDX_IIntentReceiver]; + if (args.length > mIIntentReceiverIndex && IIntentReceiver.class.isInstance(args[mIIntentReceiverIndex])) { + final IInterface old = (IInterface) args[mIIntentReceiverIndex]; if (!IIntentReceiverProxy.class.isInstance(old)) { final IBinder token = old.asBinder(); if (token != null) { @@ -1272,7 +1272,7 @@ public void binderDied() { WeakReference mDispatcher = LoadedApk.ReceiverDispatcher.InnerReceiver.mDispatcher.get(old); if (mDispatcher != null) { LoadedApk.ReceiverDispatcher.mIIntentReceiver.set(mDispatcher.get(), proxyIIntentReceiver); - args[IDX_IIntentReceiver] = proxyIIntentReceiver; + args[mIIntentReceiverIndex] = proxyIIntentReceiver; } } } @@ -1762,4 +1762,19 @@ public GetPackageProcessState() { super("getPackageProcessState"); } } + + // For Android 11 + static class RegisterReceiverWithFeature extends RegisterReceiver { + public RegisterReceiverWithFeature() { + // http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/core/java/android/app/IActivityManager.aidl?fi=IActivityManager#124 + mIIntentReceiverIndex = 3; + mIntentFilterIndex = 4; + mRequiredPermissionIndex = 5; + } + + @Override + public String getMethodName() { + return "registerReceiverWithFeature"; + } + } } From 067f21e34998b23eb5063ff5173570cadc8c27a9 Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 18 Aug 2021 23:45:41 +0800 Subject: [PATCH 40/65] FIX getDeviceIdWithFeature Signed-off-by: tiann --- .../hook/proxies/telephony/TelephonyStub.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyStub.java index ebdbbef34..bde03c6a3 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyStub.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyStub.java @@ -1,12 +1,20 @@ package com.lody.virtual.client.hook.proxies.telephony; +import android.Manifest; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.os.Build; -import com.lody.virtual.client.hook.base.Inject; +import com.lody.virtual.client.VClientImpl; +import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.hook.base.BinderInvocationProxy; +import com.lody.virtual.client.hook.base.Inject; import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy; import com.lody.virtual.client.hook.base.ReplaceLastPkgMethodProxy; +import java.lang.reflect.Method; + import mirror.com.android.internal.telephony.ITelephony; /** @@ -51,5 +59,28 @@ protected void onBindMethods() { addMethodProxy(new ReplaceCallingPkgMethodProxy("getMergedSubscriberIds")); addMethodProxy(new ReplaceLastPkgMethodProxy("getRadioAccessFamily")); addMethodProxy(new ReplaceCallingPkgMethodProxy("isVideoCallingEnabled")); + + addMethodProxy(new ReplaceCallingPkgMethodProxy("getDeviceIdWithFeature") { + @Override + public Object call(Object who, Method method, Object... args) throws Throwable{ + try { + return super.call(who, method, args); + } catch (SecurityException e) { + ApplicationInfo ai = VClientImpl.get().getCurrentApplicationInfo(); + if (ai.targetSdkVersion >= 29) { + throw e; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Context context = VirtualCore.get().getContext(); + if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) + != PackageManager.PERMISSION_GRANTED) { + // 不排除不检查权限直接使用 try-catch 判断的情况 + throw e; + } + } + return null; + } + } + }); } } From 3fb999cd847b2c02ad8b10da5b1f64660c096880 Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 18 Aug 2021 23:46:08 +0800 Subject: [PATCH 41/65] [Android 11]: Fix Android 11 window session Signed-off-by: tiann --- .../hook/proxies/window/session/WindowSessionPatch.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/session/WindowSessionPatch.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/session/WindowSessionPatch.java index 1ad50fa74..ed0ff452d 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/session/WindowSessionPatch.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/session/WindowSessionPatch.java @@ -1,10 +1,10 @@ package com.lody.virtual.client.hook.proxies.window.session; +import android.os.Build; import android.os.IInterface; import com.lody.virtual.client.hook.base.MethodInvocationProxy; import com.lody.virtual.client.hook.base.MethodInvocationStub; -import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy; /** * @author Lody @@ -22,6 +22,12 @@ public void onBindMethods() { addMethodProxy(new BaseMethodProxy("addToDisplayWithoutInputChannel")); addMethodProxy(new BaseMethodProxy("addWithoutInputChannel")); addMethodProxy(new BaseMethodProxy("relayout")); + + // http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/core/java/android/view/IWindowSession.aidl#51 + if (Build.VERSION.SDK_INT >= 30) { + addMethodProxy(new BaseMethodProxy("addToDisplayAsUser")); + addMethodProxy(new BaseMethodProxy("grantInputChannel")); + } } From 3874cc9f130bec971f30a84e4eb32e5e91270d75 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 19 Aug 2021 11:38:04 +0800 Subject: [PATCH 42/65] [Android 11]: fix getIntentWithFeature & getAppTasks in AMS. Signed-off-by: tiann --- .../proxies/am/ActivityTaskManagerStub.java | 6 +++++ .../client/hook/proxies/am/MethodProxies.java | 27 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityTaskManagerStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityTaskManagerStub.java index 1aba2d190..d858da006 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityTaskManagerStub.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityTaskManagerStub.java @@ -4,8 +4,10 @@ import com.lody.virtual.client.hook.base.BinderInvocationProxy; import com.lody.virtual.client.hook.base.Inject; +import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy; import com.lody.virtual.client.hook.base.StaticMethodProxy; import com.lody.virtual.client.ipc.VActivityManager; +import com.lody.virtual.helper.compat.BuildCompat; import java.lang.reflect.Method; @@ -49,5 +51,9 @@ public Object call(Object who, Method method, Object... args) throws Throwable { return super.call(who, method, args); } }); + + if (BuildCompat.isQ()) { + addMethodProxy(new ReplaceCallingPkgMethodProxy("getAppTasks")); + } } } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java index da6c04570..b2f3c0355 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java @@ -289,6 +289,10 @@ public boolean isEnable() { static class GetIntentSender extends MethodProxy { + protected int mIntentIndex = 5; + protected int mResolvedTypesIndex = 6; + protected int mFlagsIndex = 7; + @Override public String getMethodName() { return "getIntentSender"; @@ -297,11 +301,11 @@ public String getMethodName() { @Override public Object call(Object who, Method method, Object... args) throws Throwable { String creator = (String) args[1]; - String[] resolvedTypes = (String[]) args[6]; + String[] resolvedTypes = (String[]) args[mResolvedTypesIndex]; int type = (int) args[0]; - int flags = (int) args[7]; + int flags = (int) args[mFlagsIndex]; if (args[5] instanceof Intent[]) { - Intent[] intents = (Intent[]) args[5]; + Intent[] intents = (Intent[]) args[mIntentIndex]; for (int i = 0; i < intents.length; i++) { Intent intent = intents[i]; if (resolvedTypes != null && i < resolvedTypes.length) { @@ -313,7 +317,7 @@ public Object call(Object who, Method method, Object... args) throws Throwable { } } } - args[7] = flags; + args[mFlagsIndex] = flags; args[1] = getHostPkg(); // Force userId to 0 if (args[args.length - 1] instanceof Integer) { @@ -1777,4 +1781,19 @@ public String getMethodName() { return "registerReceiverWithFeature"; } } + + static class GetIntentSenderWithFeature extends GetIntentSender { + + public GetIntentSenderWithFeature() { + // http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/core/java/android/app/IActivityManager.aidl?fi=IActivityManager#245 + mIntentIndex = 6; + mResolvedTypesIndex = 7; + mFlagsIndex = 8; + } + + @Override + public String getMethodName() { + return "getIntentSenderWithFeature"; + } + } } From 317727b4a9d8db2cb7bf87e8292c6eaaee600733 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 19 Aug 2021 11:39:08 +0800 Subject: [PATCH 43/65] [Android 11]: Fix junit libraries Signed-off-by: tiann --- .../lody/virtual/client/ipc/VPackageManager.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java index 90656cdf0..e647b75b9 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java @@ -15,6 +15,7 @@ import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.env.VirtualRuntime; +import com.lody.virtual.helper.compat.BuildCompat; import com.lody.virtual.server.IPackageInstaller; import com.lody.virtual.server.IPackageManager; @@ -205,6 +206,20 @@ public ApplicationInfo getApplicationInfo(String packageName, int flags, int use } info.sharedLibraryFiles = newSharedLibraryFiles; } + + String TEST_BASE = "/system/framework/android.test.base.jar"; + if (BuildCompat.isR() && new File(TEST_BASE).exists()) { + String[] newSharedLibraryFiles; + if (info.sharedLibraryFiles == null) { + newSharedLibraryFiles = new String[]{TEST_BASE}; + } else { + int newLength = info.sharedLibraryFiles.length + 1; + newSharedLibraryFiles = new String[newLength]; + System.arraycopy(info.sharedLibraryFiles, 0, newSharedLibraryFiles, 0, newLength - 1); + newSharedLibraryFiles[newLength - 1] = TEST_BASE; + } + info.sharedLibraryFiles = newSharedLibraryFiles; + } return info; } catch (RemoteException e) { return VirtualRuntime.crash(e); From 406925b5ea39e145dc610cd4f67caa0522948497 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 19 Aug 2021 11:52:29 +0800 Subject: [PATCH 44/65] [Android 10]: Add getSerialForPackage hook Signed-off-by: tiann --- .../client/core/InvocationStubManager.java | 4 ++ .../DeviceIdentifiersPolicyServiceStub.java | 37 +++++++++++++++++++ .../os/IDeviceIdentifiersPolicyService.java | 24 ++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/os/DeviceIdentifiersPolicyServiceStub.java create mode 100644 VirtualApp/lib/src/main/java/mirror/android/os/IDeviceIdentifiersPolicyService.java diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java index 27462a8f7..cbed63796 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java @@ -38,6 +38,7 @@ import com.lody.virtual.client.hook.proxies.mount.MountServiceStub; import com.lody.virtual.client.hook.proxies.network.NetworkManagementStub; import com.lody.virtual.client.hook.proxies.notification.NotificationManagerStub; +import com.lody.virtual.client.hook.proxies.os.DeviceIdentifiersPolicyServiceStub; import com.lody.virtual.client.hook.proxies.persistent_data_block.PersistentDataBlockServiceStub; import com.lody.virtual.client.hook.proxies.phonesubinfo.PhoneSubInfoStub; import com.lody.virtual.client.hook.proxies.pm.LauncherAppsStub; @@ -196,6 +197,9 @@ private void injectInternal() throws Throwable { } if (BuildCompat.isQ()) { addInjector(new ActivityTaskManagerStub()); + + // http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/core/java/android/os/IDeviceIdentifiersPolicyService.aidl#24 + addInjector(new DeviceIdentifiersPolicyServiceStub()); } } } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/os/DeviceIdentifiersPolicyServiceStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/os/DeviceIdentifiersPolicyServiceStub.java new file mode 100644 index 000000000..3baf90928 --- /dev/null +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/os/DeviceIdentifiersPolicyServiceStub.java @@ -0,0 +1,37 @@ +package com.lody.virtual.client.hook.proxies.os; + +import android.content.pm.ApplicationInfo; + +import com.lody.virtual.client.VClientImpl; +import com.lody.virtual.client.hook.base.BinderInvocationProxy; +import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy; +import com.lody.virtual.helper.compat.BuildCompat; + +import java.lang.reflect.Method; + +import mirror.android.os.IDeviceIdentifiersPolicyService; + +/** + * @author weishu + * @date 2021/8/19. + */ +public class DeviceIdentifiersPolicyServiceStub extends BinderInvocationProxy { + public DeviceIdentifiersPolicyServiceStub() { + super(IDeviceIdentifiersPolicyService.Stub.TYPE, "device_identifiers"); + } + + @Override + protected void onBindMethods() { + + addMethodProxy(new ReplaceCallingPkgMethodProxy("getSerialForPackage") { + @Override + public Object call(Object who, Method method, Object... args) throws Throwable { + ApplicationInfo info = VClientImpl.get().getCurrentApplicationInfo(); + if (info != null && info.targetSdkVersion >= 29 && BuildCompat.isQ()) { + return "unknown"; + } + return super.call(who, method, args); + } + }); + } +} diff --git a/VirtualApp/lib/src/main/java/mirror/android/os/IDeviceIdentifiersPolicyService.java b/VirtualApp/lib/src/main/java/mirror/android/os/IDeviceIdentifiersPolicyService.java new file mode 100644 index 000000000..b06293f29 --- /dev/null +++ b/VirtualApp/lib/src/main/java/mirror/android/os/IDeviceIdentifiersPolicyService.java @@ -0,0 +1,24 @@ +package mirror.android.os; + +import android.annotation.TargetApi; +import android.os.IBinder; +import android.os.IInterface; + +import mirror.MethodParams; +import mirror.RefClass; +import mirror.RefStaticMethod; + +/** + * @author weishu + * @date 2021/8/19. + */ +@TargetApi(29) +public class IDeviceIdentifiersPolicyService { + public static Class TYPE = RefClass.load(IDeviceIdentifiersPolicyService.class, "android.os.IDeviceIdentifiersPolicyService"); + + public static class Stub { + public static Class TYPE = RefClass.load(IDeviceIdentifiersPolicyService.Stub.class, "android.os.IDeviceIdentifiersPolicyService$Stub"); + @MethodParams({IBinder.class}) + public static RefStaticMethod asInterface; + } +} From 9c20336a83154c423a4030053fcb77b559ba0ff6 Mon Sep 17 00:00:00 2001 From: weishu Date: Thu, 19 Aug 2021 12:15:09 +0800 Subject: [PATCH 45/65] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d1d37b158..09f18544f 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ For Developers - [File a bug](https://github.com/android-hacker/exposed/issues) - [Wiki](https://github.com/android-hacker/VirtualXposed/wiki) +- [Telegram](https://t.me/vxp_devs) Credits ------- From e46e4d7e1f850f08ce23342b328d29a4818513d9 Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Thu, 25 Nov 2021 15:35:26 -0800 Subject: [PATCH 46/65] Create ApplicationConfig.java --- .../android/security/net/config/ApplicationConfig.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 VirtualApp/lib/src/main/java/mirror/mirror/android/security/net/config/ApplicationConfig.java diff --git a/VirtualApp/lib/src/main/java/mirror/mirror/android/security/net/config/ApplicationConfig.java b/VirtualApp/lib/src/main/java/mirror/mirror/android/security/net/config/ApplicationConfig.java new file mode 100644 index 000000000..ada7d2081 --- /dev/null +++ b/VirtualApp/lib/src/main/java/mirror/mirror/android/security/net/config/ApplicationConfig.java @@ -0,0 +1,10 @@ +package mirror.android.security.net.config; + +import mirror.RefClass; +import mirror.RefStaticMethod; + +public class ApplicationConfig { + public static Class TYPE = RefClass.load(ApplicationConfig.class, "android.security.net.config.ApplicationConfig"); + + public static RefStaticMethod setDefaultInstance; +} From 877c6aeb36157b9b6438ed2cd4f60e27c1945115 Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Thu, 25 Nov 2021 15:37:59 -0800 Subject: [PATCH 47/65] Update VClientImpl.java --- .../lib/src/main/java/com/lody/virtual/client/VClientImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index 7e16423b0..835a093f9 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -76,6 +76,7 @@ import mirror.com.android.internal.content.ReferrerIntent; import mirror.dalvik.system.VMRuntime; import mirror.java.lang.ThreadGroupN; +import mirror.android.security.net.config.ApplicationConfig; import static com.lody.virtual.os.VUserHandle.getUserId; @@ -344,6 +345,7 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond VLog.w(TAG, "Xposed is disable.."); } + ApplicationConfig.setDefaultInstance.call(new Object[] { null }); mInitialApplication = LoadedApk.makeApplication.call(data.info, false, null); // ExposedBridge.patchAppClassLoader(context); From f33ceb621a2bc0b66bad1f1f7bc149c95f64d456 Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Fri, 26 Nov 2021 15:37:48 +0300 Subject: [PATCH 48/65] set network configuration only for API30 --- .../src/main/java/com/lody/virtual/client/VClientImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index 835a093f9..aa8cedca1 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -344,8 +344,8 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond } else { VLog.w(TAG, "Xposed is disable.."); } - - ApplicationConfig.setDefaultInstance.call(new Object[] { null }); + if (Build.VERSION.SDK_INT >= 30) + ApplicationConfig.setDefaultInstance.call(new Object[] { null }); mInitialApplication = LoadedApk.makeApplication.call(data.info, false, null); // ExposedBridge.patchAppClassLoader(context); From 9516bd4b41db6373e5aaa14a07c4b8eda38d29f7 Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Fri, 26 Nov 2021 06:19:35 -0800 Subject: [PATCH 49/65] Android 11: Fix SecurityException on requestLocationUpdates call --- .../virtual/client/hook/proxies/location/MethodProxies.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java index e768c369a..8199cbe3a 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java @@ -4,6 +4,7 @@ import android.location.LocationRequest; import android.os.Build; +import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.hook.base.MethodProxy; import com.lody.virtual.client.hook.base.ReplaceLastPkgMethodProxy; import com.lody.virtual.client.ipc.VirtualLocationManager; @@ -84,6 +85,11 @@ public Object call(final Object who, Method method, Object... args) throws Throw } return 0; } + + if (Build.VERSION.SDK_INT >= 30) { + args[3] = VirtualCore.get().getContext().getPackageName(); + } + return super.call(who, method, args); } } From c0dc3d60e40362de1d35a28cf5370f7b07e6139d Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Fri, 26 Nov 2021 06:25:15 -0800 Subject: [PATCH 50/65] Android 11: Fix crash when calling external activity --- .../lody/virtual/client/hook/proxies/am/MethodProxies.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java index b2f3c0355..2cf5bfeca 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java @@ -463,6 +463,11 @@ public Object call(Object who, Method method, Object... args) throws Throwable { if (intent.getPackage() != null && isAppPkg(intent.getPackage())) { return ActivityManagerCompat.START_INTENT_NOT_RESOLVED; } + + if (Build.VERSION.SDK_INT >= 30) { + args[1] = VirtualCore.get().getContext().getPackageName(); + } + return method.invoke(who, args); } int res = VActivityManager.get().startActivity(intent, activityInfo, resultTo, options, resultWho, requestCode, VUserHandle.myUserId()); From 529e1bbe3b4aad28876f80f9f9592b69bb7d930c Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Fri, 26 Nov 2021 06:32:43 -0800 Subject: [PATCH 51/65] Android 11: Fix crash on getContentProvider SecurityException on call getContentProvider, wrong packageName. --- .../lody/virtual/client/hook/proxies/am/MethodProxies.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java index 2cf5bfeca..0284f5eb7 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java @@ -1391,6 +1391,11 @@ public Object call(Object who, Method method, Object... args) throws Throwable { return null; } args[nameIdx] = VASettings.getStubAuthority(targetVPid); + + if (Build.VERSION.SDK_INT >= 30) { + args[1] = VirtualCore.get().getContext().getPackageName(); + } + Object holder = method.invoke(who, args); if (holder == null) { return null; From 7623a407a0c32738760e4f6b374f18771652562b Mon Sep 17 00:00:00 2001 From: LittleAngry <24435249+so-lli@users.noreply.github.com> Date: Fri, 26 Nov 2021 06:42:01 -0800 Subject: [PATCH 52/65] Android 11: Fix cancelNotificationWithTag signature --- .../proxies/notification/MethodProxies.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/MethodProxies.java index f4975a391..ce88f6fd3 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/MethodProxies.java @@ -105,13 +105,23 @@ public Object call(Object who, Method method, Object... args) throws Throwable { if (getHostPkg().equals(pkg)) { return method.invoke(who, args); } - String tag = (String) args[1]; - int id = (int) args[2]; + + int index_tag = 1; + int index_id = 2; + + if (Build.VERSION.SDK_INT >= 30) { + index_tag = 2; + index_id = 3; + } + + String tag = (String) args[index_tag]; + int id = (int) args[index_id]; + id = VNotificationManager.get().dealNotificationId(id, pkg, tag, getAppUserId()); tag = VNotificationManager.get().dealNotificationTag(id, pkg, tag, getAppUserId()); - args[1] = tag; - args[2] = id; + args[index_tag] = tag; + args[index_id] = id; return method.invoke(who, args); } } From fa868867f48d7d57d7c7744a7b1b3942d958abb3 Mon Sep 17 00:00:00 2001 From: tiann Date: Thu, 19 Aug 2021 11:56:33 +0800 Subject: [PATCH 53/65] Restore getCallingUid Hook Signed-off-by: tiann --- VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp | 5 +---- VirtualApp/lib/src/main/jni/fb/jni/Environment.cpp | 5 ----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp index c729ea0ec..6cdef6cf6 100644 --- a/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp +++ b/VirtualApp/lib/src/main/jni/Foundation/VMPatch.cpp @@ -441,10 +441,7 @@ void hookAndroidVM(JArrayClass javaMethods, } } measureNativeOffset(isArt); - // Crash on Q if hook directly by modify entrypoint of function. - // Just skip this step on Q and get never crash - if(apiLevel <= 28) - replaceGetCallingUid(isArt); + replaceGetCallingUid(isArt); replaceOpenDexFileMethod(javaMethods.getElement(OPEN_DEX).get(), isArt, apiLevel); diff --git a/VirtualApp/lib/src/main/jni/fb/jni/Environment.cpp b/VirtualApp/lib/src/main/jni/fb/jni/Environment.cpp index 48060107e..ee51f4fc1 100644 --- a/VirtualApp/lib/src/main/jni/fb/jni/Environment.cpp +++ b/VirtualApp/lib/src/main/jni/fb/jni/Environment.cpp @@ -90,10 +90,6 @@ void Environment::detachCurrentThread() { /* static */ JNIEnv* Environment::ensureCurrentThreadIsAttached() { - auto scope = currentScope(); - if (scope && scope->env_) { - return scope->env_; - } JNIEnv* env; // We should be able to just get the JNIEnv* by just calling @@ -104,7 +100,6 @@ JNIEnv* Environment::ensureCurrentThreadIsAttached() { FBASSERT(result == JNI_OK || result == JNI_EDETACHED); if (result == JNI_EDETACHED) { // The thread should not be detached while a ThreadScope is in the stack. - FBASSERT(!scope); env = attachCurrentThread(); } FBASSERT(env); From 4d43f3cc93cdc641eec57d62b3785048c55305c2 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 11:43:28 +0800 Subject: [PATCH 54/65] Android 12: Fix launching activity https://cs.android.com/android/_/android/platform/frameworks/base/+/8f3a6caab8481d66be8e1f915aee7969971c9cce Signed-off-by: tiann --- VirtualApp/app/build.gradle | 4 ++-- .../android/app/ClientTransactionHandler.java | 20 +++++++++++++++++++ .../android/app/TransactionHandlerProxy.java | 15 ++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/VirtualApp/app/build.gradle b/VirtualApp/app/build.gradle index 71639dbf9..ce5213024 100644 --- a/VirtualApp/app/build.gradle +++ b/VirtualApp/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "io.va.exposed64" minSdkVersion 21 targetSdkVersion 23 - versionCode 203 - versionName "0.20.3" + versionCode 210 + versionName "0.21.0" multiDexEnabled false android { defaultConfig { diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index 72a907825..95a6a9c9b 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -149,6 +149,26 @@ public abstract LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, public abstract void handleFixedRotationAdjustments(IBinder token, DisplayAdjustments.FixedRotationAdjustments fixedRotationAdjustments); + /** + * Add {@link ActivityThread.ActivityClientRecord} that is preparing to be launched. + * @param token Activity token. + * @param activity An initialized instance of {@link ActivityThread.ActivityClientRecord} to use during launch. + */ + public abstract void addLaunchingActivity(IBinder token, ActivityThread.ActivityClientRecord activity); + + /** + * Get {@link ActivityThread.ActivityClientRecord} that is preparing to be launched. + * @param token Activity token. + * @return An initialized instance of {@link ActivityThread.ActivityClientRecord} to use during launch. + */ + public abstract ActivityThread.ActivityClientRecord getLaunchingActivity(IBinder token); + + /** + * Remove {@link ActivityThread.ActivityClientRecord} from the launching activity list. + * @param token Activity token. + */ + public abstract void removeLaunchingActivity(IBinder token); + /** * Get {@link ActivityThread.ActivityClientRecord} instance that corresponds to the * provided token. diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index 5d1c10701..a6c25e4d4 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -216,6 +216,21 @@ public void handleFixedRotationAdjustments(IBinder token, DisplayAdjustments.Fix originalHandler.handleFixedRotationAdjustments(token, fixedRotationAdjustments); } + @Override + public void addLaunchingActivity(IBinder token, ActivityClientRecord activity) { + originalHandler.addLaunchingActivity(token, activity); + } + + @Override + public ActivityClientRecord getLaunchingActivity(IBinder token) { + return originalHandler.getLaunchingActivity(token); + } + + @Override + public void removeLaunchingActivity(IBinder token) { + originalHandler.removeLaunchingActivity(token); + } + @Override public ActivityClientRecord getActivityClient(IBinder token) { Log.i(TAG, "getActivityClient : " + token); From fb0a6548e25a2b7085d33d48e689449bdadbf7ac Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 11:51:09 +0800 Subject: [PATCH 55/65] Android 12: Fix provider call https://cs.android.com/android/platform/superproject/+/android-12.0.0_r1:frameworks/base/core/java/android/content/IContentProvider.java;l=123 Signed-off-by: tiann --- .../lody/virtual/client/hook/providers/ProviderHook.java | 6 +++++- .../java/com/lody/virtual/helper/compat/BuildCompat.java | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index f1db2ecd7..c697af153 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -158,7 +158,11 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab try { String name = method.getName(); if ("call".equals(name)) { - if (BuildCompat.isR()) { + if (BuildCompat.isS()) { + // What's the fuck with Google??? + // https://cs.android.com/android/platform/superproject/+/android-12.0.0_r1:frameworks/base/core/java/android/content/IContentProvider.java;l=123 + start = 2; + } else if (BuildCompat.isR()) { start = 3; } else if (BuildCompat.isQ()) { start = 2; diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java index 1653ed2a0..b788dbe5a 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java @@ -35,6 +35,10 @@ public static boolean isR() { return isAndroidLevel(30); } + public static boolean isS() { + return isAndroidLevel(31); + } + private static boolean isAndroidLevelPreview(int level) { return (Build.VERSION.SDK_INT == level && getPreviewSDKInt() > 0) || Build.VERSION.SDK_INT > level; From 065eea3cdffd8ea810cb97505ffa62c3e6722dfe Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 12:40:30 +0800 Subject: [PATCH 56/65] Android 12: Fix splash screen Signed-off-by: tiann --- .../android/app/ClientTransactionHandler.java | 15 +++++++++++++ .../android/app/TransactionHandlerProxy.java | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index 95a6a9c9b..ba0179ea8 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -23,6 +23,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.os.IBinder; +import android.os.Parcelable; import android.util.MergedConfiguration; import android.view.DisplayAdjustments; @@ -123,6 +124,20 @@ public abstract void handlePictureInPictureModeChanged(IBinder token, boolean is // Android 11 public abstract void handlePictureInPictureRequested(IBinder token); + /** Signal to an activity (that is currently in PiP) of PiP state changes. */ + public abstract void handlePictureInPictureStateChanged(ActivityThread.ActivityClientRecord r, + Parcelable pipState); + + /** Whether the activity want to handle splash screen exit animation */ + public abstract boolean isHandleSplashScreenExit(IBinder token); + + /** Attach a splash screen window view to the top of the activity */ + public abstract void handleAttachSplashScreenView(ActivityThread.ActivityClientRecord r, + Parcelable parcelable); + + /** Hand over the splash screen window view to the activity */ + public abstract void handOverSplashScreenView(ActivityThread.ActivityClientRecord r); + /** Update window visibility. */ public abstract void handleWindowVisibility(IBinder token, boolean show); /** Perform activity launch. */ diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index a6c25e4d4..94cc600b9 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -10,6 +10,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.os.IBinder; +import android.os.Parcelable; import android.util.Log; import android.util.MergedConfiguration; import android.view.DisplayAdjustments; @@ -132,6 +133,26 @@ public void handlePictureInPictureRequested(IBinder token) { originalHandler.handlePictureInPictureRequested(token); } + @Override + public void handlePictureInPictureStateChanged(ActivityClientRecord r, Parcelable pipState) { + originalHandler.handlePictureInPictureStateChanged(r, pipState); + } + + @Override + public boolean isHandleSplashScreenExit(IBinder token) { + return originalHandler.isHandleSplashScreenExit(token); + } + + @Override + public void handleAttachSplashScreenView(ActivityClientRecord r, Parcelable parcelable) { + originalHandler.handleAttachSplashScreenView(r, parcelable); + } + + @Override + public void handOverSplashScreenView(ActivityClientRecord r) { + originalHandler.handOverSplashScreenView(r); + } + @Override public void handleWindowVisibility(IBinder token, boolean show) { originalHandler.handleWindowVisibility(token, show); From 6bb556dc7a76e59fa9cb0fc77064130fc4033f1a Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 12:41:13 +0800 Subject: [PATCH 57/65] Android 12: Fix provider hook Signed-off-by: tiann --- .../client/hook/providers/ProviderHook.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index c697af153..77b67428f 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -9,8 +9,10 @@ import android.os.IInterface; import android.os.ParcelFileDescriptor; +import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.hook.base.MethodBox; import com.lody.virtual.helper.compat.BuildCompat; +import com.lody.virtual.helper.utils.Reflect; import com.lody.virtual.helper.utils.VLog; import java.lang.reflect.InvocationHandler; @@ -153,8 +155,13 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab } MethodBox methodBox = new MethodBox(method, mBase, args); int start = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? 1 : 0; - // Android 11: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/IContentProvider.java?q=IContentProvider&ss=android%2Fplatform%2Fsuperproject - if(Build.VERSION.SDK_INT >= 30) start = 2; + if (BuildCompat.isS()) { + // https://cs.android.com/android/platform/superproject/+/android-12.0.0_r16:frameworks/base/core/java/android/content/IContentProvider.java + start = 1; + } else if (BuildCompat.isR()) { + // Android 11: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/IContentProvider.java?q=IContentProvider&ss=android%2Fplatform%2Fsuperproject + start = 2; + } try { String name = method.getName(); if ("call".equals(name)) { @@ -207,6 +214,9 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab String[] selectionArgs = null; String sortOrder = null; Bundle queryArgs = null; + if (BuildCompat.isS()) { + fixAttributionSource(args[0]); + } if (Build.VERSION.SDK_INT >= 26) { queryArgs = (Bundle) args[start + 2]; if (queryArgs != null) { @@ -238,4 +248,14 @@ protected void processArgs(Method method, Object... args) { public interface HookFetcher { ProviderHook fetch(boolean external, IInterface provider); } + + private void fixAttributionSource(Object attribution) { + try { + Object mAttributionSourceState = Reflect.on(attribution).get("mAttributionSourceState"); + Reflect.on(mAttributionSourceState).set("uid", VirtualCore.get().myUid()); + Reflect.on(mAttributionSourceState).set("packageName", VirtualCore.get().getHostPkg()); + } catch (Throwable e) { + e.printStackTrace(); + } + } } From 056dc682e5228bd4e8ba938bb9b9f5305a4a2a1e Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 13:10:48 +0800 Subject: [PATCH 58/65] Android 12: Fix ClientTransactionHandler Signed-off-by: tiann --- .../android/app/ClientTransactionHandler.java | 29 +++++++++++++ .../android/app/TransactionHandlerProxy.java | 42 +++++++++++++++++++ .../com/lody/virtual/client/VClientImpl.java | 5 +++ 3 files changed, 76 insertions(+) diff --git a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java index ba0179ea8..7047e547e 100644 --- a/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java +++ b/VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java @@ -30,6 +30,8 @@ import java.util.List; import java.util.Map; +import mirror.com.android.internal.content.ReferrerIntent; + /** * Defines operations that a {@link ClientTransaction} or its items * can perform on client. @@ -69,6 +71,15 @@ public abstract void handleDestroyActivity(IBinder token, boolean finishing, int /** Pause the activity. */ public abstract void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, int configChanges, PendingTransactionActions pendingActions, String reason); + + // Android 12 + /** Destroy the activity. */ + public abstract void handleDestroyActivity(ActivityThread.ActivityClientRecord r, boolean finishing, + int configChanges, boolean getNonConfigInstance, String reason); + + /** Pause the activity. */ + public abstract void handlePauseActivity(ActivityThread.ActivityClientRecord r, boolean finished, boolean userLeaving, + int configChanges, PendingTransactionActions pendingActions, String reason); /** * Resume the activity. * @param token Target activity token. @@ -102,27 +113,45 @@ public abstract void handleStopActivity(IBinder token, boolean show, int configC public abstract void handleStopActivity(IBinder token, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); + // Android 12 + public abstract void handleStopActivity(ActivityThread.ActivityClientRecord r, int configChanges, + PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); + /** Report that activity was stopped to server. */ public abstract void reportStop(PendingTransactionActions pendingActions); /** Restart the activity after it was stopped. */ public abstract void performRestartActivity(IBinder token, boolean start); + /** Restart the activity after it was stopped. */ + public abstract void performRestartActivity(ActivityThread.ActivityClientRecord r, boolean start); + /** Deliver activity (override) configuration change. */ public abstract void handleActivityConfigurationChanged(IBinder activityToken, Configuration overrideConfig, int displayId); + public abstract void handleActivityConfigurationChanged(ActivityThread.ActivityClientRecord r, + Configuration overrideConfig, int displayId); + /** Deliver result from another activity. */ public abstract void handleSendResult(IBinder token, List results, String reason); + + /** Deliver result from another activity. */ + public abstract void handleSendResult( + ActivityThread.ActivityClientRecord r, List results, String reason); + /** Deliver multi-window mode change notification. */ public abstract void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, Configuration overrideConfig); /** Deliver new intent. */ public abstract void handleNewIntent(IBinder token, List intents, boolean andPause); + public abstract void handleNewIntent( + ActivityThread.ActivityClientRecord r, List intents); /** Deliver picture-in-picture mode change notification. */ public abstract void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, Configuration overrideConfig); // Android 11 public abstract void handlePictureInPictureRequested(IBinder token); + public abstract void handlePictureInPictureRequested(ActivityThread.ActivityClientRecord r); /** Signal to an activity (that is currently in PiP) of PiP state changes. */ public abstract void handlePictureInPictureStateChanged(ActivityThread.ActivityClientRecord r, diff --git a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java index 94cc600b9..51a592528 100644 --- a/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java +++ b/VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java @@ -27,6 +27,7 @@ import mirror.android.app.ActivityManagerNative; import mirror.android.app.IActivityManager; +import mirror.com.android.internal.content.ReferrerIntent; /** @@ -73,6 +74,16 @@ public void handlePauseActivity(IBinder token, boolean finished, boolean userLea originalHandler.handlePauseActivity(token, finished, userLeaving, configChanges, pendingActions, reason); } + @Override + public void handleDestroyActivity(ActivityClientRecord r, boolean finishing, int configChanges, boolean getNonConfigInstance, String reason) { + originalHandler.handleDestroyActivity(r, finishing, configChanges, getNonConfigInstance, reason); + } + + @Override + public void handlePauseActivity(ActivityClientRecord r, boolean finished, boolean userLeaving, int configChanges, PendingTransactionActions pendingActions, String reason) { + originalHandler.handlePauseActivity(r, finished, userLeaving, configChanges, pendingActions, reason); + } + @Override public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { originalHandler.handleResumeActivity(token, finalStateRequest, isForward, reason); @@ -93,6 +104,11 @@ public void handleStopActivity(IBinder token, int configChanges, PendingTransact originalHandler.handleStopActivity(token, configChanges, pendingActions, finalStateRequest, reason); } + @Override + public void handleStopActivity(ActivityClientRecord r, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) { + originalHandler.handleStopActivity(r, configChanges, pendingActions, finalStateRequest, reason); + } + @Override public void reportStop(PendingTransactionActions pendingActions) { originalHandler.reportStop(pendingActions); @@ -103,16 +119,31 @@ public void performRestartActivity(IBinder token, boolean start) { originalHandler.performRestartActivity(token, start); } + @Override + public void performRestartActivity(ActivityClientRecord r, boolean start) { + originalHandler.performRestartActivity(r, start); + } + @Override public void handleActivityConfigurationChanged(IBinder activityToken, Configuration overrideConfig, int displayId) { originalHandler.handleActivityConfigurationChanged(activityToken, overrideConfig, displayId); } + @Override + public void handleActivityConfigurationChanged(ActivityClientRecord r, Configuration overrideConfig, int displayId) { + originalHandler.handleActivityConfigurationChanged(r, overrideConfig, displayId); + } + @Override public void handleSendResult(IBinder token, List results, String reason) { originalHandler.handleSendResult(token, results, reason); } + @Override + public void handleSendResult(ActivityClientRecord r, List results, String reason) { + originalHandler.handleSendResult(r, results, reason); + } + @Override public void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, Configuration overrideConfig) { originalHandler.handleMultiWindowModeChanged(token, isInMultiWindowMode, overrideConfig); @@ -133,6 +164,11 @@ public void handlePictureInPictureRequested(IBinder token) { originalHandler.handlePictureInPictureRequested(token); } + @Override + public void handlePictureInPictureRequested(ActivityClientRecord r) { + originalHandler.handlePictureInPictureRequested(r); + } + @Override public void handlePictureInPictureStateChanged(ActivityClientRecord r, Parcelable pipState) { originalHandler.handlePictureInPictureStateChanged(r, pipState); @@ -307,4 +343,10 @@ public void countLaunchingActivities(int num) { public void handleNewIntent(IBinder token, List intents) { originalHandler.handleNewIntent(token, intents); } + + @Override + public void handleNewIntent(ActivityClientRecord r, List intents) { + originalHandler.handleNewIntent(r, intents); + } + } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index aa8cedca1..a09843b9f 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -26,6 +26,7 @@ import android.os.StrictMode; import android.system.ErrnoException; import android.system.Os; +import android.util.Log; import com.lody.virtual.client.core.CrashHandler; import com.lody.virtual.client.core.InvocationStubManager; @@ -344,6 +345,10 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond } else { VLog.w(TAG, "Xposed is disable.."); } + + ClassLoader call = LoadedApk.getClassLoader.call(data.info); + Log.i("mylog", "classloader: " + call + " parent: " + call.getParent()); + if (Build.VERSION.SDK_INT >= 30) ApplicationConfig.setDefaultInstance.call(new Object[] { null }); mInitialApplication = LoadedApk.makeApplication.call(data.info, false, null); From c38673ab9d1f21ea907e354ed1adb2f40b4c231b Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 13:16:41 +0800 Subject: [PATCH 59/65] Android 12: Fix registerReciverWithFeature Signed-off-by: tiann --- .../client/hook/proxies/am/MethodProxies.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java index 0284f5eb7..a3ce5ff36 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java @@ -1780,10 +1780,17 @@ public GetPackageProcessState() { // For Android 11 static class RegisterReceiverWithFeature extends RegisterReceiver { public RegisterReceiverWithFeature() { - // http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/core/java/android/app/IActivityManager.aidl?fi=IActivityManager#124 - mIIntentReceiverIndex = 3; - mIntentFilterIndex = 4; - mRequiredPermissionIndex = 5; + if (BuildCompat.isS()) { + // http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/core/java/android/app/IActivityManager.aidl?fi=IActivityManager#127 + mIIntentReceiverIndex = 4; + mIntentFilterIndex = 5; + mRequiredPermissionIndex = 6; + } else { + // http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/core/java/android/app/IActivityManager.aidl?fi=IActivityManager#124 + mIIntentReceiverIndex = 3; + mIntentFilterIndex = 4; + mRequiredPermissionIndex = 5; + } } @Override From f224868910694fe9e161f36f496fc4443aecee15 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 15:03:19 +0800 Subject: [PATCH 60/65] Android 12: Fix listenWithEventList Signed-off-by: tiann --- .../client/hook/proxies/telephony/TelephonyRegistryStub.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyRegistryStub.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyRegistryStub.java index e0dbe2a86..25c14852a 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyRegistryStub.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyRegistryStub.java @@ -5,6 +5,7 @@ import com.lody.virtual.client.hook.base.BinderInvocationProxy; import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy; import com.lody.virtual.client.hook.base.ReplaceSequencePkgMethodProxy; +import com.lody.virtual.helper.compat.BuildCompat; import java.lang.reflect.Method; @@ -39,5 +40,9 @@ public boolean beforeCall(Object who, Method method, Object... args) { return super.beforeCall(who, method, args); } }); + + if (BuildCompat.isS()) { + addMethodProxy(new ReplaceCallingPkgMethodProxy("listenWithEventList")); + } } } From a2a5244c0c29ae42502f5a28f8d63cc8293a1693 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 16:38:50 +0800 Subject: [PATCH 61/65] Android 12: Fix package info Signed-off-by: tiann --- .../com/lody/virtual/server/pm/VPackageManagerService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java index fa8e54106..a7fa9f849 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java @@ -260,7 +260,11 @@ private PackageInfo generatePackageInfo(VPackage p, PackageSetting ps, int flags PackageInfo packageInfo = PackageParserEx.generatePackageInfo(p, flags, ps.firstInstallTime, ps.lastUpdateTime, ps.readUserState(userId), userId); if (packageInfo != null) { - return packageInfo; + Parcel parcel = Parcel.obtain(); + packageInfo.writeToParcel(parcel, 0); + PackageInfo info = PackageInfo.CREATOR.createFromParcel(parcel); + parcel.recycle(); + return info; } return null; } From 5c9a95ff0cce42dd3ab55aa40c0bd09369d1ca09 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 16:39:02 +0800 Subject: [PATCH 62/65] Android 12: Fix junit Signed-off-by: tiann --- .../java/com/lody/virtual/client/VClientImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index a09843b9f..0b5ee33d6 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -26,7 +26,6 @@ import android.os.StrictMode; import android.system.ErrnoException; import android.system.Os; -import android.util.Log; import com.lody.virtual.client.core.CrashHandler; import com.lody.virtual.client.core.InvocationStubManager; @@ -45,6 +44,7 @@ import com.lody.virtual.client.stub.VASettings; import com.lody.virtual.helper.compat.BuildCompat; import com.lody.virtual.helper.compat.StorageManagerCompat; +import com.lody.virtual.helper.utils.Reflect; import com.lody.virtual.helper.utils.VLog; import com.lody.virtual.os.VEnvironment; import com.lody.virtual.os.VUserHandle; @@ -62,6 +62,7 @@ import java.util.Map; import java.util.Set; +import dalvik.system.DelegateLastClassLoader; import me.weishu.exposed.ExposedBridge; import mirror.android.app.ActivityThread; import mirror.android.app.ActivityThreadNMR1; @@ -71,13 +72,13 @@ import mirror.android.content.ContentProviderHolderOreo; import mirror.android.providers.Settings; import mirror.android.renderscript.RenderScriptCacheDir; +import mirror.android.security.net.config.ApplicationConfig; import mirror.android.view.HardwareRenderer; import mirror.android.view.RenderScript; import mirror.android.view.ThreadedRenderer; import mirror.com.android.internal.content.ReferrerIntent; import mirror.dalvik.system.VMRuntime; import mirror.java.lang.ThreadGroupN; -import mirror.android.security.net.config.ApplicationConfig; import static com.lody.virtual.os.VUserHandle.getUserId; @@ -346,8 +347,11 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond VLog.w(TAG, "Xposed is disable.."); } - ClassLoader call = LoadedApk.getClassLoader.call(data.info); - Log.i("mylog", "classloader: " + call + " parent: " + call.getParent()); + ClassLoader cl = LoadedApk.getClassLoader.call(data.info); + if (BuildCompat.isS()) { + ClassLoader parent = cl.getParent(); + Reflect.on(cl).set("parent", new DelegateLastClassLoader("/system/framework/android.test.base.jar", parent)); + } if (Build.VERSION.SDK_INT >= 30) ApplicationConfig.setDefaultInstance.call(new Object[] { null }); From 6978d7b2ee0951bb8f3f03e25eb50904de8b7407 Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 12 Apr 2022 17:04:38 +0800 Subject: [PATCH 63/65] Android 12: make component lazy load Signed-off-by: tiann --- .../com/lody/virtual/client/VClientImpl.java | 3 +- .../client/env/SpecialComponentList.java | 62 ++++++++++++------- .../virtual/helper/utils/ComponentUtils.java | 2 +- 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java index 0b5ee33d6..5afffe4a1 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java @@ -322,7 +322,7 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond mirror.android.app.ActivityThread.AppBindData.info.set(boundApp, data.info); VMRuntime.setTargetSdkVersion.call(VMRuntime.getRuntime.call(), data.appInfo.targetSdkVersion); - boolean conflict = SpecialComponentList.isConflictingInstrumentation(packageName); + boolean conflict = SpecialComponentList.ConflictInstrumentation.isConflictingInstrumentation(packageName); if (!conflict) { InvocationStubManager.getInstance().checkEnv(AppInstrumentation.class); } @@ -361,6 +361,7 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond mirror.android.app.ActivityThread.mInitialApplication.set(mainThread, mInitialApplication); ContextFixer.fixContext(mInitialApplication); + if (Build.VERSION.SDK_INT >= 24 && "com.tencent.mm:recovery".equals(processName)) { fixWeChatRecovery(mInitialApplication); } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java index 9d1872b22..96fa87142 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java @@ -22,11 +22,47 @@ */ public final class SpecialComponentList { + public static class ConflictInstrumentation { + private static final HashSet INSTRUMENTATION_CONFLICTING = new HashSet<>(2); + + static { + INSTRUMENTATION_CONFLICTING.add("com.qihoo.magic"); + INSTRUMENTATION_CONFLICTING.add("com.qihoo.magic_mutiple"); + INSTRUMENTATION_CONFLICTING.add("com.facebook.katana"); + } + + public static boolean isConflictingInstrumentation(String packageName) { + return INSTRUMENTATION_CONFLICTING.contains(packageName); + } + } + + public static class SpecSystemComponent { + + private static final HashSet SPEC_SYSTEM_APP_LIST = new HashSet<>(3); + + static { + SPEC_SYSTEM_APP_LIST.add("android"); + SPEC_SYSTEM_APP_LIST.add("com.google.android.webview"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + try { + String webViewPkgN = IWebViewUpdateService.getCurrentWebViewPackageName.call(WebViewFactory.getUpdateService.call()); + if (webViewPkgN != null) { + SPEC_SYSTEM_APP_LIST.add(webViewPkgN); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + } + + public static boolean isSpecSystemPackage(String pkg) { + return SPEC_SYSTEM_APP_LIST.contains(pkg); + } + } + private static final List ACTION_BLACK_LIST = new ArrayList(1); private static final Map PROTECTED_ACTION_MAP = new HashMap<>(5); private static final HashSet WHITE_PERMISSION = new HashSet<>(3); - private static final HashSet INSTRUMENTATION_CONFLICTING = new HashSet<>(2); - private static final HashSet SPEC_SYSTEM_APP_LIST = new HashSet<>(3); private static final Set SYSTEM_BROADCAST_ACTION = new HashSet<>(7); private static String PROTECT_ACTION_PREFIX = "_VA_protected_"; @@ -66,31 +102,9 @@ public final class SpecialComponentList { PROTECTED_ACTION_MAP.put("android.intent.action.USER_ADDED", Constants.ACTION_USER_ADDED); PROTECTED_ACTION_MAP.put("android.intent.action.USER_REMOVED", Constants.ACTION_USER_REMOVED); - INSTRUMENTATION_CONFLICTING.add("com.qihoo.magic"); - INSTRUMENTATION_CONFLICTING.add("com.qihoo.magic_mutiple"); - INSTRUMENTATION_CONFLICTING.add("com.facebook.katana"); - - SPEC_SYSTEM_APP_LIST.add("android"); - SPEC_SYSTEM_APP_LIST.add("com.google.android.webview"); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - try { - String webViewPkgN = IWebViewUpdateService.getCurrentWebViewPackageName.call(WebViewFactory.getUpdateService.call()); - if (webViewPkgN != null) { - SPEC_SYSTEM_APP_LIST.add(webViewPkgN); - } - } catch (Throwable e) { - e.printStackTrace(); - } - } } - public static boolean isSpecSystemPackage(String pkg) { - return SPEC_SYSTEM_APP_LIST.contains(pkg); - } - public static boolean isConflictingInstrumentation(String packageName) { - return INSTRUMENTATION_CONFLICTING.contains(packageName); - } /** * Check if the action in the BlackList. diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/utils/ComponentUtils.java b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/utils/ComponentUtils.java index 520b64030..ef32f9d42 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/helper/utils/ComponentUtils.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/helper/utils/ComponentUtils.java @@ -96,7 +96,7 @@ public static ComponentName toComponentName(ComponentInfo componentInfo) { public static boolean isSystemApp(ApplicationInfo applicationInfo) { return !GmsSupport.isGmsFamilyPackage(applicationInfo.packageName) && ((ApplicationInfo.FLAG_SYSTEM & applicationInfo.flags) != 0 - || SpecialComponentList.isSpecSystemPackage(applicationInfo.packageName)); + || SpecialComponentList.SpecSystemComponent.isSpecSystemPackage(applicationInfo.packageName)); } public static boolean isStubComponent(Intent intent) { From 1e94179ddf622d53e268fab1d8ae5dc9f44db639 Mon Sep 17 00:00:00 2001 From: tiann Date: Wed, 25 May 2022 10:54:01 +0800 Subject: [PATCH 64/65] minor fixes Signed-off-by: tiann --- .../virtual/client/fixer/ContextFixer.java | 21 ++++++++++++++ .../client/hook/providers/ProviderHook.java | 28 +++++++++++-------- .../server/pm/parser/PackageParserEx.java | 14 ++++++++++ .../java/mirror/android/app/ContextImpl.java | 2 ++ 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java index 121d0d41a..bc50cbc37 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java @@ -5,6 +5,7 @@ import android.os.Build; import android.os.DropBoxManager; +import com.lody.virtual.client.VClientImpl; import com.lody.virtual.client.core.InvocationStubManager; import com.lody.virtual.client.core.VirtualCore; import com.lody.virtual.client.hook.base.BinderInvocationStub; @@ -70,6 +71,26 @@ public static void fixContext(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { ContentResolverJBMR2.mPackageName.set(context.getContentResolver(), hostPkg); } + + if (ContextImpl.getAttributionSource != null) { + fixAttributionSource(ContextImpl.getAttributionSource.call(context), hostPkg, VClientImpl.get().getVUid()); + } + } + + public static void fixAttributionSource(Object attr, String pkg, int uid) { + if (attr == null) { + return; + } + try { + Object mAttributionSourceState = Reflect.on(attr).get("mAttributionSourceState"); + Reflect.on(mAttributionSourceState).set("uid", uid); + Reflect.on(mAttributionSourceState).set("packageName", pkg); + + Object next = Reflect.on(attr).call("getNext").get(); + fixAttributionSource(next, pkg, uid); + } catch (Throwable e) { + e.printStackTrace(); + } } } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java index 77b67428f..ffb032e04 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java @@ -10,9 +10,9 @@ import android.os.ParcelFileDescriptor; import com.lody.virtual.client.core.VirtualCore; +import com.lody.virtual.client.fixer.ContextFixer; import com.lody.virtual.client.hook.base.MethodBox; import com.lody.virtual.helper.compat.BuildCompat; -import com.lody.virtual.helper.utils.Reflect; import com.lody.virtual.helper.utils.VLog; import java.lang.reflect.InvocationHandler; @@ -162,6 +162,9 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab // Android 11: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/IContentProvider.java?q=IContentProvider&ss=android%2Fplatform%2Fsuperproject start = 2; } + if (BuildCompat.isS() ) { + tryFixAttributionSource(args); + } try { String name = method.getName(); if ("call".equals(name)) { @@ -214,9 +217,7 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab String[] selectionArgs = null; String sortOrder = null; Bundle queryArgs = null; - if (BuildCompat.isS()) { - fixAttributionSource(args[0]); - } + if (Build.VERSION.SDK_INT >= 26) { queryArgs = (Bundle) args[start + 2]; if (queryArgs != null) { @@ -249,13 +250,18 @@ public interface HookFetcher { ProviderHook fetch(boolean external, IInterface provider); } - private void fixAttributionSource(Object attribution) { - try { - Object mAttributionSourceState = Reflect.on(attribution).get("mAttributionSourceState"); - Reflect.on(mAttributionSourceState).set("uid", VirtualCore.get().myUid()); - Reflect.on(mAttributionSourceState).set("packageName", VirtualCore.get().getHostPkg()); - } catch (Throwable e) { - e.printStackTrace(); + private void tryFixAttributionSource(Object[] args) { + if (args == null || args.length == 0) { + return; + } + Object attribution = args[0]; + if (attribution == null) { + return; } + if (!attribution.getClass().getName().equals("android.content.AttributionSource")) { + return; + } + + ContextFixer.fixAttributionSource(attribution, VirtualCore.get().getHostPkg(), VirtualCore.get().myUid()); } } diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java index 47cb837df..e1d69702c 100644 --- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java +++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java @@ -450,6 +450,15 @@ public static PackageInfo generatePackageInfo(VPackage p, int flags, long firstI return pi; } + private static boolean copyNeeded(int flags, VPackage p, + PackageUserState state, Bundle metaData, int userId) { + if (!state.installed || state.hidden) { + return true; + } + return (flags & PackageManager.GET_META_DATA) != 0 + && (metaData != null || p.mAppMetaData != null); + } + public static ApplicationInfo generateApplicationInfo(VPackage p, int flags, PackageUserState state, int userId) { if (p == null) return null; @@ -457,6 +466,11 @@ public static ApplicationInfo generateApplicationInfo(VPackage p, int flags, return null; } + if (!copyNeeded(flags, p, state, null, userId)) { + initApplicationAsUser(p.applicationInfo, userId); + return p.applicationInfo; + } + // Make shallow copy so we can store the metadata/libraries safely ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); if ((flags & PackageManager.GET_META_DATA) != 0) { diff --git a/VirtualApp/lib/src/main/java/mirror/android/app/ContextImpl.java b/VirtualApp/lib/src/main/java/mirror/android/app/ContextImpl.java index fd495fb39..8718c3247 100644 --- a/VirtualApp/lib/src/main/java/mirror/android/app/ContextImpl.java +++ b/VirtualApp/lib/src/main/java/mirror/android/app/ContextImpl.java @@ -17,4 +17,6 @@ public class ContextImpl { public static RefObject mPackageManager; public static RefMethod getReceiverRestrictedContext; + + public static RefMethod getAttributionSource; } From 122beb371519cb2d221ce06756361aaa30e2674f Mon Sep 17 00:00:00 2001 From: tiann Date: Tue, 7 Jun 2022 11:10:37 +0800 Subject: [PATCH 65/65] 0.22.0 Signed-off-by: tiann --- VirtualApp/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VirtualApp/app/build.gradle b/VirtualApp/app/build.gradle index ce5213024..341de4ee2 100644 --- a/VirtualApp/app/build.gradle +++ b/VirtualApp/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "io.va.exposed64" minSdkVersion 21 targetSdkVersion 23 - versionCode 210 - versionName "0.21.0" + versionCode 220 + versionName "0.22.0" multiDexEnabled false android { defaultConfig {