在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于應(yīng)用性能優(yōu)化之VerifyClass詳解

jf_f8pIz0xS ? 來源:掘金 ? 作者:大力智能技術(shù) ? 2021-04-16 18:14 ? 次閱讀

為了加速應(yīng)用冷啟動(dòng)過程且不過度涉及業(yè)務(wù)改動(dòng),本文從虛擬機(jī)加載類的過程中找到優(yōu)化項(xiàng),且與業(yè)界的方案作了對(duì)比,并實(shí)現(xiàn)了半自動(dòng)化的分析功能。類在使用或?qū)嵗靶枰患虞d到虛擬機(jī)中并進(jìn)行初始化。整個(gè)過程如下圖所示:主要由LoadingClass和InitializingClass兩部分組合。

LoadingClass旨在把Class從Dex加載到虛擬機(jī)中,但不涉及類的使用或執(zhí)行流程。InitializingClass旨在保證使用類前已經(jīng)經(jīng)過了初始化流程,此流程嵌入類的使用或執(zhí)行過程中。

加載類

DefineClass主要通過SetupClass、InsertClass以及LoadClass將一個(gè)類加載到虛擬機(jī)中,最后返回mirror:Class對(duì)象指針。

SetupClass:設(shè)置類的訪問標(biāo)志以及ClassLoader。

InsertClass:將類插入到對(duì)應(yīng)ClassLoader的ClassTable中,以便查找。

LoadClass:將類的屬性及方法加載到類中。

類初始化

類的屬性或方法在使用前必須經(jīng)過類的初始化。

InitializeClass:核驗(yàn)類、初始化父類、接口方法以及靜態(tài)屬性。

VerifyClass:核驗(yàn)類的合法性,在下一節(jié)詳細(xì)分析。

核驗(yàn)類

VerifyClass使用VerifyClassUsingOatFile或PerformClassVerification方法之一去核查Class。其中PerformClassVerification就包含了Systrace中耗時(shí)VerifyClass的Tag,如下圖所示:

VerifyClassUsingOatFile:通過Oat文件中的Class狀態(tài)位去核驗(yàn)Class,當(dāng)狀態(tài)位等于kStatusVerified時(shí),核查流程到此為止,直接快速返回。否則需要進(jìn)入耗時(shí)的PerformClassVerification流程。

PerformClassVerification:主要核驗(yàn)類中的直接方法和虛方法。

ComputeWidthsAndCountOps:判斷PC值與dalvik指令數(shù)是否相等。

ScanTryCatchBlocks:檢查Try語(yǔ)句開始地址、結(jié)束地址以及try開始操作符的合法性。檢查catch中handler語(yǔ)句開始操作符的合法性。

VerifyInstructions:檢查各種dalvik指令,同時(shí)將GC檢查點(diǎn)插入到括號(hào)、switch、throw指令中。

VerifyCodeFlow:檢查每條dalvik指令的寄存器以及參數(shù)的合法性。

提前發(fā)現(xiàn)

從上面的分析可以看出,應(yīng)該盡可能讓核查走VerifyClassUsingOatFile流程,即通過Oat文件狀態(tài)位核查成功。Oat文件中類的狀態(tài)位是什么以及為什么狀態(tài)位不等于kStatusVerified是問題的突破點(diǎn)。

通過oatdump命令去dump相應(yīng)的odex文件,可以查看類的狀態(tài)位,操作方式如下:

VLOG默認(rèn)是不會(huì)被打印的,需要?jiǎng)討B(tài)開啟,開啟的方式可以通過:art::gLogVerbosity.class_linker = true而打開,因?yàn)楸卷?xiàng)目需要看到dex2oat和其他進(jìn)程的打印情況,本人是在系統(tǒng)源碼中進(jìn)行編譯生成的so,然后,通過ptrace注入so到Zygote的,此方法需要root設(shè)備,如果只需要查看本進(jìn)程,應(yīng)不需要這么麻煩,具體方法還未探索,但思路應(yīng)該是一致的。舉例如下,本人碰到的問題是AppCompat包中的類不能被核驗(yàn)通過。

解決方案

將Runtime對(duì)象中的verify_設(shè)置成verifier::VerifyMode::kNone。

需要通過Runtime對(duì)象首地址遍歷查找verify_屬性,魔改廠商可能帶來兼容性問題。

缺少VerifyClass過程,可能會(huì)后置發(fā)現(xiàn)非法指令問題。

對(duì)zygote中值verify_進(jìn)行修改將造成cow內(nèi)存消耗。

將多出EnsureSkipAccessChecksMethods一步處理邏輯,將類中每個(gè)函數(shù)flag進(jìn)行修改,此處邏輯沒有對(duì)單個(gè)類進(jìn)行處理,所以,每個(gè)類的每個(gè)函數(shù)的flag都將被無(wú)謂修改,如下圖所示:

直面問題本身,通過VLOG的輸出信息,去修正源碼,具體到本案例,是由于AppCompat庫(kù)中使用了系統(tǒng)不支持的語(yǔ)句,如下圖所示:

本App運(yùn)行環(huán)境是在8.1(API27)上,TextView沒有方法setFirstBaselineToTopHeight,所以,因?yàn)橹噶罘欠▽?dǎo)致類核驗(yàn)失敗。(注意Build.VERSION.SDK_INT是不會(huì)被編譯優(yōu)化的,它本身是final類型,但它的取值是等于SystemProperties.getInt(“ro.build.version.sdk”, 0),所以,必須運(yùn)行時(shí),才能確定)。本人嘗試了如下方法:

將系統(tǒng)源碼sdk中的Build.VERSION.SDK_INT值設(shè)置成27進(jìn)行編譯出新的sdk,然后,將此sdk覆蓋源生的android.jar,希望編譯時(shí)將appcompat中的Build.VERSION.SDK_INT 》= 28判斷邏輯優(yōu)化掉,但實(shí)際aar不會(huì)參與sdk的編譯,此項(xiàng)只能優(yōu)化項(xiàng)目自身的邏輯。

將appcompat源碼下載下來,去掉非法指令,重新編譯成aar使用。

直接在android8.1源碼中編譯support v7包使用。

以上兩種方法,能定制自己所需的aar,甚至能裁剪資源,但碰到了致命的問題:新生成的aar不能發(fā)布到maven了,這樣的話,需要推動(dòng)業(yè)務(wù)修改包名,另一個(gè)問題是,如果是項(xiàng)目中的第三方aar依賴了appcompat的話,問題又會(huì)出現(xiàn)。所以,最終通過制作ASM插件,將Build.VERSION.SDK_INT值設(shè)置成固定27,問題解決了,且使得本項(xiàng)目中apk size減少了22K。

如果是應(yīng)用需要兼容多個(gè)不同版本的ROM,也可以按照ROM版本的不同,使用App Bundle下發(fā)“最合適”的App。

平臺(tái)化

為了降低方案實(shí)施難度,現(xiàn)已將方案平臺(tái)化,只要將apk拖入網(wǎng)頁(yè)中即可看到類核驗(yàn)不通過的原因。
編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    643

    瀏覽量

    29256
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    918

    瀏覽量

    28241
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何優(yōu)化總線系統(tǒng)的性能

    總線系統(tǒng)是計(jì)算機(jī)和其他電子設(shè)備中用于傳輸數(shù)據(jù)的關(guān)鍵組件。性能優(yōu)化可以提高數(shù)據(jù)傳輸速率、降低延遲,并增強(qiáng)系統(tǒng)的可靠性和擴(kuò)展性。 1. 理解總線系統(tǒng) 總線類型 :介紹不同類型的總線,如PCIe、USB
    的頭像 發(fā)表于 12-31 09:54 ?85次閱讀

    華為云 X 實(shí)例 CPU 性能測(cè)試詳解優(yōu)化策略

    分析 ? 3.2 CPU性能瓶頸分析 ? 4. CPU性能優(yōu)化策略 ? 4.1 優(yōu)化CPU性能的常用方法 ? 4.2 操作系統(tǒng)內(nèi)核調(diào)優(yōu) ?
    的頭像 發(fā)表于 12-30 14:52 ?78次閱讀
    華為云 X 實(shí)例 CPU <b class='flag-5'>性能</b>測(cè)試<b class='flag-5'>詳解</b>與<b class='flag-5'>優(yōu)化</b>策略

    SSM框架的性能優(yōu)化技巧 SSM框架中RESTful API的實(shí)現(xiàn)

    SSM框架的性能優(yōu)化技巧 SSM(Spring + Spring MVC + MyBatis)框架的性能優(yōu)化是提升Java Web應(yīng)用性能
    的頭像 發(fā)表于 12-17 09:10 ?191次閱讀

    Linux性能優(yōu)化

    一、優(yōu)化內(nèi)核相關(guān)參數(shù) 配置文件/etc/sysctl.conf 配置方法直接將參數(shù)添加進(jìn)文件每條一行 sysctl -a 可以查看默認(rèn)配置sysctl -p 執(zhí)行并檢測(cè)是否有錯(cuò)誤 1、網(wǎng)絡(luò)相關(guān)
    的頭像 發(fā)表于 12-06 10:15 ?209次閱讀
    Linux<b class='flag-5'>之</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>

    如何優(yōu)化DCS系統(tǒng)的性能

    優(yōu)化DCS(分布式控制系統(tǒng))系統(tǒng)的性能是確保工業(yè)自動(dòng)化過程高效、穩(wěn)定運(yùn)行的關(guān)鍵。以下是一些具體的優(yōu)化措施: 一、硬件優(yōu)化 設(shè)備選擇與升級(jí) :檢查并確保DCS系統(tǒng)的硬件設(shè)備符合規(guī)格要求,
    的頭像 發(fā)表于 11-13 09:19 ?515次閱讀

    如何優(yōu)化emc存儲(chǔ)性能

    在當(dāng)今的數(shù)據(jù)中心環(huán)境中,存儲(chǔ)性能對(duì)于業(yè)務(wù)連續(xù)性和數(shù)據(jù)訪問速度至關(guān)重要。EMC作為領(lǐng)先的存儲(chǔ)解決方案提供商,其產(chǎn)品線涵蓋了從入門級(jí)到企業(yè)級(jí)的存儲(chǔ)系統(tǒng)。然而,即使是最好的存儲(chǔ)系統(tǒng)也需要定期優(yōu)化以保持最佳
    的頭像 發(fā)表于 11-01 15:57 ?316次閱讀

    如何優(yōu)化SOC芯片性能

    優(yōu)化SOC(System on Chip,系統(tǒng)級(jí)芯片)芯片性能是一個(gè)復(fù)雜而多維的任務(wù),涉及多個(gè)方面的優(yōu)化策略。以下是一些關(guān)鍵的優(yōu)化措施: 一、架構(gòu)設(shè)計(jì)
    的頭像 發(fā)表于 10-31 15:50 ?526次閱讀

    使用Arthas火焰圖工具的Java應(yīng)用性能分析和優(yōu)化經(jīng)驗(yàn)

    分享作者在使用Arthas火焰圖工具進(jìn)行Java應(yīng)用性能分析和優(yōu)化的經(jīng)驗(yàn)。
    的頭像 發(fā)表于 10-28 09:27 ?284次閱讀
    使用Arthas火焰圖工具的Java<b class='flag-5'>應(yīng)用性能</b>分析和<b class='flag-5'>優(yōu)化</b>經(jīng)驗(yàn)

    如何優(yōu)化FPGA設(shè)計(jì)的性能

    優(yōu)化FPGA(現(xiàn)場(chǎng)可編程門陣列)設(shè)計(jì)的性能是一個(gè)復(fù)雜而多維的任務(wù),涉及多個(gè)方面和步驟。以下是一些關(guān)鍵的優(yōu)化策略: 一、明確性能指標(biāo) 確定需求 :首先,需要明確FPGA設(shè)計(jì)的
    的頭像 發(fā)表于 10-25 09:23 ?367次閱讀

    AI大模型的性能優(yōu)化方法

    AI大模型的性能優(yōu)化是一個(gè)復(fù)雜而關(guān)鍵的任務(wù),涉及多個(gè)方面和策略。以下是一些主要的性能優(yōu)化方法: 一、模型壓縮與優(yōu)化 模型蒸餾(Model D
    的頭像 發(fā)表于 10-23 15:01 ?746次閱讀

    MySQL性能優(yōu)化淺析及線上案例

    作者:京東健康 孟飛 1、 數(shù)據(jù)庫(kù)性能優(yōu)化的意義 業(yè)務(wù)發(fā)展初期,數(shù)據(jù)庫(kù)中量一般都不高,也不太容易出一些性能問題或者出的問題也不大,但是當(dāng)數(shù)據(jù)庫(kù)的量級(jí)達(dá)到一定規(guī)模之后,如果缺失有效的預(yù)警、監(jiān)控、處理等
    的頭像 發(fā)表于 10-22 15:17 ?699次閱讀
    MySQL<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>淺析及線上案例

    一款3605電源芯片的性能優(yōu)化與改進(jìn)思路

    在電源設(shè)計(jì)中,確保電源轉(zhuǎn)換器在各種工作條件下都能提供穩(wěn)定和高效的性能至關(guān)重要。 ASP3605是一款高效同步降壓轉(zhuǎn)換器,它提供了多種調(diào)節(jié)選項(xiàng),以優(yōu)化電源的性能。特別是,ITH(Error
    發(fā)表于 08-23 14:34

    Memcached介紹和詳解

    在現(xiàn)代Web開發(fā)中,提升應(yīng)用性能的一個(gè)關(guān)鍵方面是優(yōu)化數(shù)據(jù)存儲(chǔ)和訪問速度。隨著網(wǎng)站和應(yīng)用程序的用戶量增長(zhǎng),傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)面臨巨大的壓力,這促使開發(fā)者尋求更快速的數(shù)據(jù)緩存解決方案。Memcached
    發(fā)表于 07-17 15:58

    OpenHarmony開機(jī)優(yōu)化

    對(duì)其進(jìn)行詳細(xì)的性能分析,從而優(yōu)化系統(tǒng)啟動(dòng)速度和運(yùn)行效率。 三丶開機(jī)優(yōu)化 開機(jī)優(yōu)化的主要目的是為了快速啟動(dòng)開機(jī)動(dòng)畫和退出開機(jī)動(dòng)畫(顯示桌面)。所以在優(yōu)
    發(fā)表于 07-01 16:39

    全志T527芯片詳解:計(jì)算性能與高清圖像編解碼

    全志T527芯片詳解:計(jì)算性能與高清圖像編解碼
    的頭像 發(fā)表于 05-21 14:37 ?2925次閱讀
    全志T527芯片<b class='flag-5'>詳解</b>:計(jì)算<b class='flag-5'>性能</b>與高清圖像編解碼
    主站蜘蛛池模板: 久视频在线观看久视频| 成人免费视频一区| 人人看操| 国产精品漂亮美女在线观看| 精品玖玖| 丁香五婷婷| 欧美freesex交| 久久性色| 国产成人mv在线观看入口视频| www五月天com| 亚洲 欧美 校园| 欧美爆插| 日本免费黄色网址| 国产小视频在线观看| 午夜剧j| 爱婷婷视频在线观看| 亚洲午夜久久久久久91| xxx亚洲日本| 天天视频观看| 窝窝午夜看片免费视频| 青青青久97在线观看香蕉| tube44在线观看| 4438x亚洲最大| 亚洲人一区| h视频在线看| 国产精品一区在线播放| 天堂中文资源网| 女人张开腿让男人捅爽| 成人网视频免费播放| 色综合色综合色综合网址| 天天操狠狠干| 1024手机在线看永久免费| 色吧综合网| 日本亚洲免费| 五月婷婷综合激情网| 性欧美丨18一19| 婷婷射丁香| 九九九精品视频免费| 午夜精品在线视频| 1024你懂的国产在线播放| 国产美女精品久久久久久久免费|