JAVA试图访问Android内部应用程序的静态功能时出现lang.IllegalAccessError
我正在尝试编写一个能够访问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.安卓.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);
...
}
此代码在服务中实例化的类中运行
我试图调用的方法的签名是public static KeyguardUpdateMonitor getInstance(Context context)
- 我可以按照我想要的方式使用反射吗?或者我需要拥有自己的
KeyguardUpdateMonitor
实例吗李> - 我需要特殊权限吗李>
- 我的想法有没有根本性的错误?如果是,我如何访问Android(KitKat及以上)中的键盘护卫李>
# 1 楼答案
你的想法有一个根本性的错误。KeyguardUpdateMonitor是在主进程内实例化的类。对于您的代码(作为服务运行),它是进程外的,因此通过正常的Linux(Unix)进程内存保护对您进行保护。您试图创建包上下文,但它是在您的进程中创建的,与Home app无关。最重要的是,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(键盘保护_服务)
希望对你有点帮助