一、目标
上篇教程我们实现了getPackageManager函数之后,报错:
RuntimeError: Could not find field ('signatures', '[Landroid/content/pm/Signature;') in class android/content/pm/PackageInfo.
二、步骤
field又是一个新玩意
这是需要给PackageInfo类增加一个signatures字段(也就是成员变量),需要注意的是PackageInfo类原作者已经实现了,在 androidemu/java/classes/package_manager.py, 我们只需要在这里面增加signatures字段即可。
字段的定义在 androidemu/java/java_field_def.py中
class JavaFieldDef:
def __init__(self, name, signature, is_static, static_value=None, ignore=False):
- name: 字段的名称
- signature: 字段类型
- is_static: 是否是静态字段
- static_value: 静态字段就需要赋个值,否则可以设置为 None
- ignore: 是否可以忽略(本次教程没有发现这个参数的具体用法,以后遇上再说)
由于signatures字段的类型是[android/content/pm/Signature,也就是Signature类型的数组, [ 代表数组的意思
为了调用方便,我们把之前在runEmu.py里面实现的Signature类挪到package_manager.py中,
class Signature(metaclass=JavaClassDef, jvm_name='android/content/pm/Signature'):
def __init__(self):
pass
class PackageInfo(metaclass=JavaClassDef, jvm_name='android/content/pm/PackageInfo',
jvm_fields=[
JavaFieldDef('applicationInfo', 'Landroid/content/pm/ApplicationInfo;', False),
JavaFieldDef("signatures", "[Landroid/content/pm/Signature;", False),
]):
def __init__(self):
self.applicationInfo = ApplicationInfo()
self.signatures = [Signature(),]
跑起来
RuntimeError: Could not find method ('toByteArray', '()[B') in class android/content/pm/Signature.
继续增加toByteArray, 它的返回值是个字节数组,所以我们用python的bytearray.fromhex先随便返回一个 '1234567890'
具体实际的值后面我们再研究。
class Signature(metaclass=JavaClassDef, jvm_name='android/content/pm/Signature'):
def __init__(self):
pass
@java_method_def(name='toByteArray', signature='()[B')
def toByteArray(self,mu):
logger.info("Im in Signature.toByteArray 3082")
return bytearray.fromhex('1234567890')
继续跑,成功跑过去,明天再继续
关注微信公众号,最新技术干货实时推送