Skip to content

Commit

Permalink
补全缺失的hook
Browse files Browse the repository at this point in the history
  • Loading branch information
nnjun committed May 23, 2021
1 parent ddec6d2 commit 3b1f671
Show file tree
Hide file tree
Showing 17 changed files with 507 additions and 51 deletions.
140 changes: 95 additions & 45 deletions Bcore/black-fake/src/main/java/mirror/MirrorReflection.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,47 +12,47 @@
*/
@SuppressWarnings({"unchecked", "unused", "WeakerAccess"})
public final class MirrorReflection {

private Class<?> clazz;

private MirrorReflection( Class<?> clazz) {
private MirrorReflection(Class<?> clazz) {
this.clazz = clazz;
}


public Class<?> getClazz() {
return clazz;
}

public static MirrorReflection on( String name) {
public static MirrorReflection on(String name) {
return new MirrorReflection(findClass(name));
}

public static MirrorReflection on( String name, ClassLoader loader) {
public static MirrorReflection on(String name, ClassLoader loader) {
return new MirrorReflection(findClass(name, loader));
}

public static <T> MirrorReflection on( Class<T> clazz) {
public static <T> MirrorReflection on(Class<T> clazz) {
return new MirrorReflection(clazz);
}

public static <T> MethodWrapper<T> wrap( Method method) {
public static <T> MethodWrapper<T> wrap(Method method) {
return new MethodWrapper<T>(method);
}

public static <T> StaticMethodWrapper<T> wrapStatic( Method method) {
public static <T> StaticMethodWrapper<T> wrapStatic(Method method) {
return new StaticMethodWrapper<T>(method);
}

public <T> MethodWrapper<T> method( String name, Class<?>... parameterTypes) {
public <T> MethodWrapper<T> method(String name, Class<?>... parameterTypes) {
return method(clazz, name, parameterTypes);
}

public static <T> MethodWrapper<T> method( String className, String name, Class<?>... parameterTypes) {
public static <T> MethodWrapper<T> method(String className, String name, Class<?>... parameterTypes) {
return method(findClass(className), name, parameterTypes);
}

public static <T> MethodWrapper<T> method( Class<?> clazz, String name, Class<?>... parameterTypes) {
public static <T> MethodWrapper<T> method(Class<?> clazz, String name, Class<?>... parameterTypes) {
Method method = getMethod(clazz, name, parameterTypes);
if ((parameterTypes == null || parameterTypes.length == 0) && method == null) {
method = findMethodNoChecks(clazz, name);
Expand All @@ -61,67 +61,74 @@ public static <T> MethodWrapper<T> method( Class<?> clazz, String name, Class<
}


public <T> StaticMethodWrapper<T> staticMethod( String name, Class<?>... parameterTypes) {
public <T> StaticMethodWrapper<T> staticMethod(String name, Class<?>... parameterTypes) {
return staticMethod(clazz, name, parameterTypes);
}

public static <T> StaticMethodWrapper<T> staticMethod( String className, String name, Class<?>... parameterTypes) {
public static <T> StaticMethodWrapper<T> staticMethod(String className, String name, Class<?>... parameterTypes) {
return staticMethod(findClass(className), name, parameterTypes);
}

public static <T> StaticMethodWrapper<T> staticMethod( Class<?> clazz, String name, Class<?>... parameterTypes) {
public static <T> StaticMethodWrapper<T> staticMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
Method method = getMethod(clazz, name, parameterTypes);
if ((parameterTypes == null || parameterTypes.length == 0) && method == null) {
method = findMethodNoChecks(clazz, name);
}
return wrapStatic(method);
}

public static <T> FieldWrapper<T> wrap( Field field) {
public static <T> FieldWrapper<T> wrap(Field field) {
return new FieldWrapper<>(field);
}

public <T> FieldWrapper<T> field( String name) {
public <T> FieldWrapper<T> field(String name) {
return field(clazz, name);
}

public static <T> FieldWrapper<T> field( String className, String name) {
public static <T> FieldWrapper<T> field(String className, String name) {
return field(findClass(className), name);
}

public static <T> FieldWrapper<T> field( Class<?> clazz, String name) {
public static <T> FieldWrapper<T> field(Class<?> clazz, String name) {
return wrap(getField(clazz, name));
}

public static <T> ConstructorWrapper<T> wrap( Constructor<T> constructor) {
public static <T> ConstructorWrapper<T> wrap(Constructor<T> constructor) {
return new ConstructorWrapper<>(constructor);
}

public <T> ConstructorWrapper<T> constructor( Class<?>... parameterTypes) {
public <T> ConstructorWrapper<T> constructor(Class<?>... parameterTypes) {
return wrap(getConstructor(clazz, parameterTypes));
}

public <T> ConstructorWrapper<T> constructorStringClass(String... parameterTypes) {
Class<?>[] classes = new Class<?>[parameterTypes.length];
for (int i = 0; i < parameterTypes.length; i++) {
classes[i] = getClassFormString(parameterTypes[i]);
}
return constructor(classes);
}



public static Class<?> findClassOrNull( String name) {
public static Class<?> findClassOrNull(String name) {
try {
return Class.forName(name);
} catch (ClassNotFoundException ignored) {
return null;
}
}

public static Class<?> findClassOrNull( String name, ClassLoader loader) {

public static Class<?> findClassOrNull(String name, ClassLoader loader) {
try {
return Class.forName(name, true, loader);
} catch (ClassNotFoundException ignored) {
return null;
}
}

public static Class<?> findClass( String name) {

public static Class<?> findClass(String name) {
try {
return Class.forName(name);
} catch (ClassNotFoundException e) {
Expand All @@ -130,8 +137,8 @@ public static Class<?> findClass( String name) {
return null;
}

public static Class<?> findClass( String name, ClassLoader loader) {

public static Class<?> findClass(String name, ClassLoader loader) {
try {
return Class.forName(name, true, loader);
} catch (ClassNotFoundException e) {
Expand All @@ -140,15 +147,15 @@ public static Class<?> findClass( String name, ClassLoader loader) {
return null;
}

public static Method getMethod( Class<?> clazz, String name, Class<?>... parameterTypes) {
public static Method getMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
return findMethod(clazz, name, parameterTypes);
}

public static Method getMethod( Class<?> clazz, String name) {
public static Method getMethod(Class<?> clazz, String name) {
return findMethod(clazz, name);
}

private static String getParameterTypesMessage( Class<?>[] parameterTypes) {
private static String getParameterTypesMessage(Class<?>[] parameterTypes) {
if (parameterTypes == null || parameterTypes.length == 0) {
return "()";
}
Expand All @@ -165,13 +172,13 @@ private static String getParameterTypesMessage( Class<?>[] parameterTypes) {
return sb.append(')').toString();
}

public static Method findMethod( Class<?> clazz, String name, Class<?>... parameterTypes) {

public static Method findMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
checkForFindMethod(clazz, name, parameterTypes);
return findMethodNoChecks(clazz, name, parameterTypes);
}


public static Method findMethodNoChecks(Class<?> clazz, String name, Class<?>... parameterTypes) {
while (clazz != null) {
try {
Expand All @@ -185,7 +192,7 @@ public static Method findMethodNoChecks(Class<?> clazz, String name, Class<?>...
return null;
}


public static Method findMethodNoChecks(Class<?> clazz, String name) {
try {
Method[] methods = clazz.getDeclaredMethods();
Expand All @@ -211,18 +218,18 @@ private static void checkForFindMethod(Class<?> clazz, String name, Class<?>...

}

public static Field getField( Class<?> clazz, String name) {

public static Field getField(Class<?> clazz, String name) {
return findField(clazz, name);
}


public static Field findField(Class<?> clazz, String name) {
return findFieldNoChecks(clazz, name);
}

public static Field findFieldNoChecks( Class<?> clazz, String name) {

public static Field findFieldNoChecks(Class<?> clazz, String name) {
while (clazz != null) {
try {
Field field = clazz.getDeclaredField(name);
Expand All @@ -235,16 +242,16 @@ public static Field findFieldNoChecks( Class<?> clazz, String name) {
return null;
}

public static <T> Constructor<T> getConstructor( Class<?> clazz, Class<?>... parameterTypes) {
public static <T> Constructor<T> getConstructor(Class<?> clazz, Class<?>... parameterTypes) {
return findConstructor(clazz, parameterTypes);
}

public static <T> Constructor<T> findConstructor( Class<?> clazz, Class<?>... parameterTypes) {
public static <T> Constructor<T> findConstructor(Class<?> clazz, Class<?>... parameterTypes) {
checkForFindConstructor(clazz, parameterTypes);
return findConstructorNoChecks(clazz, parameterTypes);
}

public static <T> Constructor<T> findConstructorNoChecks( Class<?> clazz, Class<?>... parameterTypes) {
public static <T> Constructor<T> findConstructorNoChecks(Class<?> clazz, Class<?>... parameterTypes) {
try {
Constructor<T> constructor = (Constructor<T>) clazz.getDeclaredConstructor(parameterTypes);
constructor.setAccessible(true);
Expand All @@ -264,7 +271,7 @@ private static void checkForFindConstructor(Class<?> clazz, Class<?>... paramete
}
}

public boolean isInstance( Object instance) {
public boolean isInstance(Object instance) {
return clazz.isInstance(instance);
}

Expand Down Expand Up @@ -299,7 +306,7 @@ public static class MemberWrapper<M extends AccessibleObject & Member> {
this.member = member;
}


public final M unwrap() {
return member;
}
Expand Down Expand Up @@ -395,4 +402,47 @@ public T newInstance(Object... args) {
}
}
}

static Class<?> getClassFormString(String clazz) {
Class<?> type = getProtoType(clazz);
if (type == null) {
try {
type = Class.forName(clazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return type;
}

static Class<?> getProtoType(String typeName) {
if (typeName.equals("int")) {
return Integer.TYPE;
}
if (typeName.equals("long")) {
return Long.TYPE;
}
if (typeName.equals("boolean")) {
return Boolean.TYPE;
}
if (typeName.equals("byte")) {
return Byte.TYPE;
}
if (typeName.equals("short")) {
return Short.TYPE;
}
if (typeName.equals("char")) {
return Character.TYPE;
}
if (typeName.equals("float")) {
return Float.TYPE;
}
if (typeName.equals("double")) {
return Double.TYPE;
}
if (typeName.equals("void")) {
return Void.TYPE;
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;
import android.util.ArrayMap;

import java.util.List;

Expand All @@ -33,6 +34,7 @@ public class ActivityThread {
public static MirrorReflection.FieldWrapper<Object> mBoundApplication = REF.field("mBoundApplication");
public static MirrorReflection.FieldWrapper<Handler> mH = REF.field("mH");
public static MirrorReflection.FieldWrapper<Application> mInitialApplication = REF.field("mInitialApplication");
public static MirrorReflection.FieldWrapper<ArrayMap<Object, Object>> mProviderMap = REF.field("mProviderMap");
public static MirrorReflection.FieldWrapper<Instrumentation> mInstrumentation = REF.field("mInstrumentation");
public static MirrorReflection.FieldWrapper<IInterface> sPackageManager = REF.field("sPackageManager");
public static MirrorReflection.MethodWrapper<IBinder> getApplicationThread = REF.method("getApplicationThread");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package mirror.android.app;

import android.content.pm.ProviderInfo;
import android.os.IInterface;

import mirror.MirrorReflection;

public class IActivityManager {
public static final MirrorReflection REF = MirrorReflection.on("android.app.IActivityManager");

public static MirrorReflection.MethodWrapper<Integer> startActivity = REF.method("startActivity");

public static class ContentProviderHolder {
public static final MirrorReflection REF = MirrorReflection.on("android.app.IActivityManager$ContentProviderHolder");
public static MirrorReflection.FieldWrapper<ProviderInfo> info = REF.field("info");
public static MirrorReflection.FieldWrapper<IInterface> provider = REF.field("provider");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package mirror.android.app;

import android.os.IBinder;
import android.os.IInterface;

import mirror.MirrorReflection;

public class IAlarmManager {
public static class Stub {
public static final MirrorReflection REF = MirrorReflection.on("android.app.IAlarmManager$Stub");
public static MirrorReflection.StaticMethodWrapper<IInterface> asInterface = REF.staticMethod("asInterface", IBinder.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package mirror.android.content;

import android.content.pm.ProviderInfo;
import android.os.IInterface;

import mirror.MirrorReflection;

public class ContentProviderHolderOreo {
public static final MirrorReflection REF = MirrorReflection.on("android.app.ContentProviderHolder");

public static MirrorReflection.FieldWrapper<ProviderInfo> info = REF.field("info");
public static MirrorReflection.FieldWrapper<IInterface> provider = REF.field("provider");
}
Loading

0 comments on commit 3b1f671

Please sign in to comment.