纯反射加载
AS 可以将一个apk,arr,aab,jar 文件导入,加载并执行APK文件中的类
apk中包含arr?
如果您加载的apk中包含arr,arr中包含so 那么需要将arr中的so拷贝一份放在apk的libs中即可正常加载.
如果apk,arr中包含so库,也会一并加载.
整个过程通过反射实现 如果您掌握一点java的反射知识,那将更容易上手~
加载
此方法会将apk,arr,jar,aab等文件加载进一个DexLoader中,方便后续通过反射拿到其中的类.
from ascript.android import plug
- 函数
plug.load_apk(file_path:str)
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| file_path | str | 是 | apk文件的绝对路径 |
- 返回值
dalvik.system.DexClassLoader<?> //class 对象.
拿到该对象,我们可以通过java 反射,创建类的实例,并运行其内部方法等等..
- 示例:
from java.lang import Class
from ascript.android import plug
# 加载apk,获取 DexClassLoader 对象
clazz_loader = plug.load_apk("sdcard/my.apk")
# 获取 Apk中的类
clazz = Class.forName("com.aojoy.apkplug.TestPlug", True, clazz_loader);
# 获取 获取公共(无参数)构造
constructor = clazz.getConstructor()
# 创建类的实例
instance = constructor.newInstance();
# 获取成员方法run
method = clazz.getMethod("run");
# 执行成员方法
method.invoke(instance);
反射参数与类型转换
反射参数类型
在通过反射获取java构造函数或某个方法时,通常需要需要写入的参数类型.
在python 中如何写入这些类型呢?
| java参数类型 | Python导入包 | Python反射获取java方法参数类型写法 |
|---|---|---|
| String | from java.lang import String | clazz.getMethod("java方法名称", String) |
| int | from java.lang import Integer | clazz.getMethod("java方法名称", Integer.TYPE) |
| float | from java.lang import Float | clazz.getMethod("java方法名称", Float.TYPE) |
| double | from java.lang import Double | clazz.getMethod("java方法名称", Double.TYPE) |
| long | from java.lang import Long | clazz.getMethod("java方法名称", Long.TYPE) |