Kotlin 的内联使用 inline 关键字定义内联,将内联的选择权完全交给了使用者,只要写了 inline 关键字就一定会内联。另外,Kotlin 的内联触发时机是编译,在 Kotlin 编译为字节码的时候就会将 inline 函数调用展开,生成的字节码不会调用内联方法,而是直接将指令插入到调用处。Kotlin 语言的内联可以说是最简单的一种内联,而本文要分析的内联崩溃的内联是 ART 虚拟机在将字节码编译为机器指令时进行的内联。这种内联是完全自动的,由 ART 虚拟机自己决定,没有语言层面的机制去触发它,而且根据不同版本的 ART 虚拟机,内联的规则和细节都可能不同。它的触发时机是运行时,也就是发生在安卓设备运行应用时,而不是在开发期间。具体来说,是发生在 JIT 和 AOT 的过程中的。entrypoint_utils-inl.h:94] Inlined method resolution crossed dex file boundary: from void com.gala.video.plugincenter.download.downloader.DownloadManager$TaskHolder.progress(com.gala.video.module.plugincenter.bean.download.DownloadItem, long, long, long, b...

entrypoint_utils-inl.h:94] Inlined method resolution crossed dex file boundary…
这段代码和注释的大概意思是,如果被内联的函数与调用它的函数不在同一个 dex 中,在执行这个内联函数的时候,就会主动触发崩溃。如果一个应用没有使用任何插件技术,那么是不可能产生这个问题的。因为一个函数被内联的前提条件之一就是调用它的函数与它在同一个 dex 中。这看似是一个矛盾,但因为有了插件化技术,就让这个场景有可能出现了。
图中 one 版本就是没使用宿主插件的版本,用户刚安装好我们的 apk 或者刚升级 apk 后启动就是这个版本。插件版本是下载并安装了宿主插件,并且重启后加载了宿主插件的版本。我们只需考虑宿主插件,而不考虑其他的子插件,因为这些子插件始终是独立的 dex,不可能与其他模块的产生内联的相互调用。由于这个问题与 dex 文件有关,所以下面从 dex 的角度说明插件相关架构。
可以简单地理解 one 版本只有一个dex 文件,而每一个插件都是一个额外的 dex 文件。宿主插件(也就是epg插件)也是额外的一个 dex 文件,这个 dex 文件就在我们每次部署插件时上传的 apk 内。从功能的角度理解,将插件升级后不会更新的部分称为 host 部分,epg 插件的所有内容称为 epg 部分。在 one 版本运行时,epg 部分与 host 部分属于同一个 dex,所以从 host 调用到 epg 的函数调用,是可能被内联的。经过插件升级,epg 部分是新的 dex,host 还是原来的 dex,从 host 调用到 epg 的函数调用就跨越了两个 dex。因此,在插件升级后可能会产生跨越 dex 的内联调用,也就触发了崩溃。host 不会也不能直接调用 epg。host 会提供一些接口,接口的方法中有一些回调类型接口,epg 实现了回调接口,然后这些接口被 host 内部调用,就发生了 host 到 epg 的间接调用。从模块设计角度看,epg 属于业务模块,依赖一些属于 host 部分的底层库,可直接调用。Host 部分不依赖业务,也就是不依赖 epg,没有直接调用,但有回调。出现内联崩溃的调用都是从 host 回调到 epg 的方法。
回调示例
插入的字节码
为什么要插入这么复杂的一条语句呢?直接插入空的 try-catch 语句不行么?不行,在由 java 字节码转换为dex 字节码的阶段,d8 会进行一些优化操作。如果 try {} 中是空的,那么不会生成任何代码;如果是无意义的代码,比如只定义了一个局部变量 int a = 0; 也会被优化删除掉。因此只能插入一些简单的有副作用的代码。我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路