Skip to content

AndroidP online方法优化导致的运行时崩溃 #413

Description

@charles-yinyu

云测平台测试时反馈的异常日志(非必现):

09-15 16:46:29.911 F/ctivity:dynami(18481): entrypoint_utils-inl.h:97] Inlined method resolution crossed dex file boundary: from android.content.pm.PackageInfo com.tencent.shadow.core.loader.blocs.LoadPluginBloc$loadPlugin$getPackageInfo$1.call() in /data/user/0/包名/files/ShadowPluginManager/UnpackedPlugin/sample-manager/63ED2D05A368834F6986759E4F5CF60B/plugin-release.zip/sample-loader-release.apk/0xea03c3f0 to java.io.File com.tencent.shadow.core.runtime.ShadowContext.getDataDir() in /data/user/0/包名/files/ShadowPluginManager/UnpackedPlugin/sample-manager/63ED2D05A368834F6986759E4F5CF60B/plugin-release.zip/sample-runtime-release.apk/0xeff23500. This must be due to duplicate classes or playing wrongly with class loaders. The runtime is in an unsafe state.

09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #00 pc 002db9cf /system/lib/libart.so (offset 120000) (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+134)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #1 pc 0034fee1 /system/lib/libart.so (offset 2fe000) (art::Runtime::Abort(char const*)+240)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #2 pc 000071b3 /system/lib/libbase.so (android::base::LogMessage::~LogMessage()+494)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #3 pc 00366f51 /system/lib/libart.so (offset 34d000) (art::GetResolvedMethod(art::ArtMethod*, art::MethodInfo const&, art::InlineInfo const&, art::InlineInfoEncoding const&, unsigned char)+1224)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #4 pc 00365b73 /system/lib/libart.so (offset 34d000) (art::StackVisitor::GetMethod() const+350)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #5 pc 0037facf /system/lib/libart.so (offset 34d000) (art::CurrentMethodVisitor::VisitFrame()+4)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #6 pc 00364dfb /system/lib/libart.so (offset 34d000) (_ZN3art12StackVisitor9WalkStackILNS0_16CountTransitionsE0EEEvb+1070)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #7 pc 00372769 /system/lib/libart.so (offset 34d000) (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits>&, bool, BacktraceMap*, bool) const+240)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #8 pc 0036ed6f /system/lib/libart.so (offset 34d000) (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits>&, bool, BacktraceMap*, bool) const+34)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #9 pc 00387da9 /system/lib/libart.so (offset 34d000) (art::DumpCheckpoint::Run(art::Thread*)+744)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #10 pc 00382047 /system/lib/libart.so (offset 34d000) (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+330)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #11 pc 003815b3 /system/lib/libart.so (offset 34d000) (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits>&, bool)+378)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #12 pc 0034ff2b /system/lib/libart.so (offset 2fe000) (art::Runtime::Abort(char const*)+314)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #13 pc 000071b3 /system/lib/libbase.so (android::base::LogMessage::~LogMessage()+494)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #14 pc 00366f51 /system/lib/libart.so (offset 34d000) (art::GetResolvedMethod(art::ArtMethod*, art::MethodInfo const&, art::InlineInfo const&, art::InlineInfoEncoding const&, unsigned char)+1224)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #15 pc 003c38c3 /system/lib/libart.so (offset 34d000) (_ZN3artL27DoGetCalleeSaveMethodCallerEPNS_9ArtMethodEjb.llvm.2968227550+610)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #16 pc 003db5bd /system/lib/libart.so (offset 34d000) (artQuickResolutionTrampoline+512)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #17 pc 00416401 /system/lib/libart.so (offset 34d000) (art_quick_resolution_trampoline+32)
09-15 16:46:29.959 F/ctivity:dynami(18481): runtime.cc:558] #18 pc 0001e583 /data/data/包名/files/ShadowPluginManager/UnpackedPlugin/sample-manager/63ED2D05A368834F6986759E4F5CF60B/plugin-release.zip/oat/arm/sample-loader-release.odex (offset 18000) (???)

从日志来看,LoadPluginBloc.loadPlugin()方法访问ShadowContext.getDataDir()方法时,发现后者被Online优化了,但LoadPluginBloc与ShadowContext分别在sample-loader-release.apk与sample-runtime-release.apk中相应的dex文件,进而报出了跨dex异常。
进一步分析框架源码,sample-loader-release.apk本身就集成了runtime库("com.tencent.shadow.dynamic:loader-impl:$shadow_version"),LoadPluginBloc与ShadowContext本就在一个dex中,在LoadPluginBloc.loadPlugin方法中打印日志,也证明两者确实是同一个ApkClassLoader加载的。源码分析结果与上述异常日志的情况是矛盾的,看作者能否看出些端倪,谢谢, @shifujun

Metadata

Metadata

Assignees

No one assigned

    Labels

    因陈旧关闭未解决但因长时间无人跟进而关闭

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions