Skip to content

Commit 1e94179

Browse files
committed
minor fixes
Signed-off-by: tiann <[email protected]>
1 parent 6978d7b commit 1e94179

File tree

4 files changed

+54
-11
lines changed

4 files changed

+54
-11
lines changed

VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.os.Build;
66
import android.os.DropBoxManager;
77

8+
import com.lody.virtual.client.VClientImpl;
89
import com.lody.virtual.client.core.InvocationStubManager;
910
import com.lody.virtual.client.core.VirtualCore;
1011
import com.lody.virtual.client.hook.base.BinderInvocationStub;
@@ -70,6 +71,26 @@ public static void fixContext(Context context) {
7071
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
7172
ContentResolverJBMR2.mPackageName.set(context.getContentResolver(), hostPkg);
7273
}
74+
75+
if (ContextImpl.getAttributionSource != null) {
76+
fixAttributionSource(ContextImpl.getAttributionSource.call(context), hostPkg, VClientImpl.get().getVUid());
77+
}
78+
}
79+
80+
public static void fixAttributionSource(Object attr, String pkg, int uid) {
81+
if (attr == null) {
82+
return;
83+
}
84+
try {
85+
Object mAttributionSourceState = Reflect.on(attr).get("mAttributionSourceState");
86+
Reflect.on(mAttributionSourceState).set("uid", uid);
87+
Reflect.on(mAttributionSourceState).set("packageName", pkg);
88+
89+
Object next = Reflect.on(attr).call("getNext").get();
90+
fixAttributionSource(next, pkg, uid);
91+
} catch (Throwable e) {
92+
e.printStackTrace();
93+
}
7394
}
7495

7596
}

VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
import android.os.ParcelFileDescriptor;
1111

1212
import com.lody.virtual.client.core.VirtualCore;
13+
import com.lody.virtual.client.fixer.ContextFixer;
1314
import com.lody.virtual.client.hook.base.MethodBox;
1415
import com.lody.virtual.helper.compat.BuildCompat;
15-
import com.lody.virtual.helper.utils.Reflect;
1616
import com.lody.virtual.helper.utils.VLog;
1717

1818
import java.lang.reflect.InvocationHandler;
@@ -162,6 +162,9 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab
162162
// Android 11: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/IContentProvider.java?q=IContentProvider&ss=android%2Fplatform%2Fsuperproject
163163
start = 2;
164164
}
165+
if (BuildCompat.isS() ) {
166+
tryFixAttributionSource(args);
167+
}
165168
try {
166169
String name = method.getName();
167170
if ("call".equals(name)) {
@@ -214,9 +217,7 @@ public Object invoke(Object proxy, Method method, Object... args) throws Throwab
214217
String[] selectionArgs = null;
215218
String sortOrder = null;
216219
Bundle queryArgs = null;
217-
if (BuildCompat.isS()) {
218-
fixAttributionSource(args[0]);
219-
}
220+
220221
if (Build.VERSION.SDK_INT >= 26) {
221222
queryArgs = (Bundle) args[start + 2];
222223
if (queryArgs != null) {
@@ -249,13 +250,18 @@ public interface HookFetcher {
249250
ProviderHook fetch(boolean external, IInterface provider);
250251
}
251252

252-
private void fixAttributionSource(Object attribution) {
253-
try {
254-
Object mAttributionSourceState = Reflect.on(attribution).get("mAttributionSourceState");
255-
Reflect.on(mAttributionSourceState).set("uid", VirtualCore.get().myUid());
256-
Reflect.on(mAttributionSourceState).set("packageName", VirtualCore.get().getHostPkg());
257-
} catch (Throwable e) {
258-
e.printStackTrace();
253+
private void tryFixAttributionSource(Object[] args) {
254+
if (args == null || args.length == 0) {
255+
return;
256+
}
257+
Object attribution = args[0];
258+
if (attribution == null) {
259+
return;
259260
}
261+
if (!attribution.getClass().getName().equals("android.content.AttributionSource")) {
262+
return;
263+
}
264+
265+
ContextFixer.fixAttributionSource(attribution, VirtualCore.get().getHostPkg(), VirtualCore.get().myUid());
260266
}
261267
}

VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/parser/PackageParserEx.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,13 +450,27 @@ public static PackageInfo generatePackageInfo(VPackage p, int flags, long firstI
450450
return pi;
451451
}
452452

453+
private static boolean copyNeeded(int flags, VPackage p,
454+
PackageUserState state, Bundle metaData, int userId) {
455+
if (!state.installed || state.hidden) {
456+
return true;
457+
}
458+
return (flags & PackageManager.GET_META_DATA) != 0
459+
&& (metaData != null || p.mAppMetaData != null);
460+
}
461+
453462
public static ApplicationInfo generateApplicationInfo(VPackage p, int flags,
454463
PackageUserState state, int userId) {
455464
if (p == null) return null;
456465
if (!checkUseInstalledOrHidden(state, flags)) {
457466
return null;
458467
}
459468

469+
if (!copyNeeded(flags, p, state, null, userId)) {
470+
initApplicationAsUser(p.applicationInfo, userId);
471+
return p.applicationInfo;
472+
}
473+
460474
// Make shallow copy so we can store the metadata/libraries safely
461475
ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
462476
if ((flags & PackageManager.GET_META_DATA) != 0) {

VirtualApp/lib/src/main/java/mirror/android/app/ContextImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ public class ContextImpl {
1717
public static RefObject<PackageManager> mPackageManager;
1818

1919
public static RefMethod<Context> getReceiverRestrictedContext;
20+
21+
public static RefMethod<Object> getAttributionSource;
2022
}

0 commit comments

Comments
 (0)