Closed yimq closed 7 years ago
1.请教下怎么直接编译一个全量的base.art,是在调用dex2oat的时候加某个参数吗,这个等待时间很耽误测试 2.刚看了AndroidNClassloader的实现,它的parent是原始的PathClassLoader,而原始的PathClassLoader的parcent就是bootclassloader,那这样的话是不是也会遇到上面说的问题
修改pm.dexopt.install好像不能生成全量的base.art,如果修改为 speed_profile然后在覆盖安装,倒是可以生成一部分base.art,请问有什么别的方法生成全量的base.art
按照AndroidNClassloader的做法确实可以规避混合编译带来的影响,多谢。
系统生成的base.art里面的class会加到BootClassLoader里去,调用的函数是ClassLinker::InitFromBootImage
每个应用单独生成的base.art里面的class会添加到自己应用的PathClassLoader里去,调用的函数是OatFileManager::OpenDexFilesFromOat
AndroidNClassloader里面实例DexFile的时候传递了一个Null的ClassLoader。导致ClassLinker::AddImageSpace函数里面的app_image变量为False,最终的结果是这些base.art里面的类没有插入到AndroidNClassLoader里。
可以使用下面的命令进行全量的编译 adb shell cmd package compile -m speed -f my-package 详细链接 https://source.android.com/devices/tech/dalvik/jit-compiler.html#tuning
您在Android N混合编译与对热补丁影响深度解析一文提到,为了规避混合编译带来的影响,采用运行时替换PathClassLoader方案,因为App image中的class是插入到PathClassloader中的ClassTable中。
但是最近我们测试这个方案没有成功(程序刚开始运行正常,等过了两三天生成base.art之后就开始报错) 而且从下列代码上看 这些class好像时直接放到了bootclassloader的table里
class_linker.cc#1048
class_linker.cc#5069
不知道我们哪里出错了?