一、目标

一、目标

上篇教程我们实现了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')

继续跑,成功跑过去,明天再继续

100

关注微信公众号,最新技术干货实时推送

100