WeMobileDev / article

articles by WeChat Mobile Development Team
4.33k stars 654 forks source link

请教下Android N混合编译生成的base.art中的类在运行时最终添加到哪个classloader的问题 #15

Closed yimq closed 7 years ago

yimq commented 7 years ago

您在Android N混合编译与对热补丁影响深度解析一文提到,为了规避混合编译带来的影响,采用运行时替换PathClassLoader方案,因为App image中的class是插入到PathClassloader中的ClassTable中。

但是最近我们测试这个方案没有成功(程序刚开始运行正常,等过了两三天生成base.art之后就开始报错) 而且从下列代码上看 这些class好像时直接放到了bootclassloader的table里

class_linker.cc#1048

// Boot class loader, use a null handle.
    std::vector<std::unique_ptr<const DexFile>> dex_files;
    if (!AddImageSpace(image_space,
                       ScopedNullHandle<mirror::ClassLoader>(),
                       /*dex_elements*/nullptr,
                       /*dex_location*/nullptr,
                       /*out*/&dex_files,
                       error_msg)) {
      return false;
    }

class_linker.cc#5069

  if (class_loader == nullptr) {
    return &boot_class_table_;
  }

不知道我们哪里出错了?

shwenzhang commented 7 years ago
  1. 你可以直接编译一个全量的base.art而不需要等待
  2. 可参考Tinker源码中的AndroidNClassloader
yimq commented 7 years ago

1.请教下怎么直接编译一个全量的base.art,是在调用dex2oat的时候加某个参数吗,这个等待时间很耽误测试 2.刚看了AndroidNClassloader的实现,它的parent是原始的PathClassLoader,而原始的PathClassLoader的parcent就是bootclassloader,那这样的话是不是也会遇到上面说的问题

shwenzhang commented 7 years ago
  1. 可以简单在安装之前在adb shell里打setprop pm.dexopt.install speed
  2. 替换了Classloader,并且同时替换了dexcache
yimq commented 7 years ago

修改pm.dexopt.install好像不能生成全量的base.art,如果修改为 speed_profile然后在覆盖安装,倒是可以生成一部分base.art,请问有什么别的方法生成全量的base.art

yimq commented 7 years ago

按照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里。

yimq commented 7 years ago

可以使用下面的命令进行全量的编译 adb shell cmd package compile -m speed -f my-package 详细链接 https://source.android.com/devices/tech/dalvik/jit-compiler.html#tuning