我正在尝试在编译时对框架/ base进行一些代码注入,以获得Oreo(8.1.0)的分支。我的第一步是使用javac(最终,我想使用aspectj编译器...)将框架/ base编译到jar中,然后使用jack将生成的jar转换为类* .dex。我以前在M上做过这个,但是我遇到了一个合并我的变化的问题。类* .dex看起来是正确生成的(它们与没有我更改的那些大小差不多,dexdump表明我的新类没有丢失旧的类,除了package-info.java? ),但生成boot.art时生成失败(有时这会在Context而不是AlarmManager上出错):
检查失败:klass-> IsVerified()引导类路径类 java.lang.Class失败了 完全验证:state = StatusRetryVerificationAtRuntime
我尝试使用dx而不是jack来从我的jar创建类* .dex,但是我得到了同样的错误。作为一个完整性检查,我尝试删除我的更改,只是添加
LOCAL_JACK_ENABLED:= javac_frontend
到frameworks / base / Android.mk中的框架模块,因为build / core / java.mk似乎表明这是使用javac而不是jack的支持方式,但我仍然得到同样的错误。
art / runtime / mirror / classes.h包含有关StatusRetryVerificationAtRuntime的注释:
// kStatusRetryVerificationAtRuntime: The verifier sets a class to
// this state if it encounters a soft failure at compile time. This
// often happens when there are unresolved classes in other dex
// files, and this status marks a class as needing to be verified
// again at runtime.
这似乎表明我的dex文件中引用了一个类或方法,但没有定义?我已经确认我的输入java文件是相同的。似乎缺少的唯一类是package-info类,似乎不重要?
是否有人遇到此错误之前/可以提供一些有关它意味着什么以及如何调试它的见解?