尝试访问Android内部应用程序的静态功能时出现java.lang.IllegalAccessError

时间:2015-01-09 12:31:09

标签: java android keyguard

我正在尝试编写一个能够访问Android Keyguard应用程序的应用程序(拥有“锁定屏幕”的系统应用程序)。我尝试使用反射来获取对正在运行的KeyguardUpdateMonitor实例的引用,但到目前为止,我只收到java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation。 以下是导致问题的代码:

try {
    DexFile df = new DexFile(new File("/system/priv-app/Keyguard.apk"));
    String packageName = "com.android.keyguard";
    Context packageContext = context.createPackageContext(packageName, 
                                 Context.CONTEXT_INCLUDE_CODE
                               | Context.CONTEXT_IGNORE_SECURITY);
    ClassLoader cl = packageContext.getClassLoader();
    Class keyguardUpdateMonitor = df.loadClass(packageName 
                                    + ".KeyguardUpdateMonitor", cl);
    Method getKeyguardUpdateMonitorInstance 
        = keyguardUpdateMonitor.getMethod("getInstance", Context.class);
    Object argumentsForGetInstance[] = new Object[1];
    argumentsForGetInstance[0] = packageContext;
    Object keyguardUpdateMonitorInstance 
        = getKeyguardUpdateMonitorInstance.invoke(null, packageContext);
    ...
}

此代码在Service中实例化的Class中运行。

我试图调用的方法的签名是public static KeyguardUpdateMonitor getInstance(Context context)

  • 我可以按照我打算或做的方式使用反射我需要拥有KeyguardUpdateMonitor的自己的实例吗?
  • 我需要特殊权限吗?
  • 我的想法是否存在根本性错误?如果是,我如何访问Android中的Keyguard(KitKat及以上版本)?

1 个答案:

答案 0 :(得分:0)

恕我直言 - 你的想法存在根本性错误。 KeyguardUpdateMonitor是在Home进程中实例化的类。对于您的代码(作为服务运行),它处于进程之外,因此可以通过正常的Linux(Unix)进程内存保护来保护您。您尝试创建包上下文,但是如果您在流程内部创建它并且与Home应用程序无关,则会创建它。最重要的是,KeyguardUpdateMonitor(下面的链接)的代码似乎没有" getInstance(Context)"静态功能......

然而,好消息是 https://github.com/android/platform_frameworks_policies_base/blob/master/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 是一个广播接收器。

你或许可以"谈话"通过发送意图来实现 http://developer.android.com/reference/android/app/KeyguardManager.html getSystemService(KEYGUARD_SERVICE)

希望它有所帮助。