日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

jf_f8pIz0xS ? 來(lái)源:掘金 ? 作者:大力智能技術(shù) ? 2021-04-16 18:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

加載類(lèi)

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

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

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

LoadClass:將類(lèi)的屬性及方法加載到類(lèi)中。

類(lèi)初始化

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

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

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

核驗(yàn)類(lèi)

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

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

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

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

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

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

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

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

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

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

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

解決方案

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

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

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

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

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

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

本App運(yùn)行環(huán)境是在8.1(API27)上,TextView沒(méi)有方法setFirstBaselineToTopHeight,所以,因?yàn)橹噶罘欠▽?dǎo)致類(lèi)核驗(yàn)失敗。(注意Build.VERSION.SDK_INT是不會(huì)被編譯優(yōu)化的,它本身是final類(lèi)型,但它的取值是等于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源碼下載下來(lái),去掉非法指令,重新編譯成aar使用。

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

以上兩種方法,能定制自己所需的aar,甚至能裁剪資源,但碰到了致命的問(wèn)題:新生成的aar不能發(fā)布到maven了,這樣的話,需要推動(dòng)業(yè)務(wù)修改包名,另一個(gè)問(wèn)題是,如果是項(xiàng)目中的第三方aar依賴(lài)了appcompat的話,問(wèn)題又會(huì)出現(xiàn)。所以,最終通過(guò)制作ASM插件,將Build.VERSION.SDK_INT值設(shè)置成固定27,問(wèn)題解決了,且使得本項(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è)中即可看到類(lèi)核驗(yàn)不通過(guò)的原因。
編輯:lyn

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

    關(guān)注

    8

    文章

    689

    瀏覽量

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

    關(guān)注

    1

    文章

    975

    瀏覽量

    30726
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    詳解MAX11661 - MAX11666:高性能低功耗ADC的卓越

    詳解MAX11661 - MAX11666:高性能低功耗ADC的卓越選 在電子設(shè)計(jì)領(lǐng)域,模擬 - 數(shù)字轉(zhuǎn)換器(ADC)是連接現(xiàn)實(shí)世界模擬信號(hào)與數(shù)字系統(tǒng)的關(guān)鍵橋梁。今天,我們就來(lái)深入探討Maxim
    的頭像 發(fā)表于 04-01 15:40 ?135次閱讀

    詳解ADP5138:高性能電源管理IC的卓越

    詳解ADP5138:高性能電源管理IC的卓越選 在電子工程師的日常設(shè)計(jì)工作中,選擇一款合適的電源管理IC至關(guān)重要。今天,我們就來(lái)深入探討一下Analog Devices推出的ADP5138,這是
    的頭像 發(fā)表于 03-05 16:25 ?206次閱讀

    詳解 LTC4013:高性能多化學(xué)電池充電器的卓越

    詳解 LTC4013:高性能多化學(xué)電池充電器的卓越選 在當(dāng)前的電子設(shè)備領(lǐng)域中,電池的高效充電是一個(gè)關(guān)鍵問(wèn)題。不同類(lèi)型的電池,如鉛酸電池、鋰離子電池等,對(duì)充電方式有著不同的要求。為了滿足多樣化的充電
    的頭像 發(fā)表于 02-24 09:30 ?518次閱讀

    詳解ADC3548與ADC3549:高性能單通道14位ADC的卓越

    詳解ADC3548與ADC3549:高性能單通道14位ADC的卓越選 引言 在電子工程領(lǐng)域,模擬到數(shù)字轉(zhuǎn)換器(ADC)一直是至關(guān)重要的組件,它直接影響著系統(tǒng)對(duì)模擬信號(hào)的處理能力和精度。今天,我們要
    的頭像 發(fā)表于 01-26 10:15 ?650次閱讀

    詳解TL16C550C:高性能異步通信芯片的卓越

    詳解TL16C550C:高性能異步通信芯片的卓越選 在電子工程師的日常工作中,選擇合適的通信芯片對(duì)于實(shí)現(xiàn)穩(wěn)定、高效的異步通信至關(guān)重要。今天,我們就來(lái)深入探討一款功能強(qiáng)大的異步通信芯片
    的頭像 發(fā)表于 01-04 16:20 ?604次閱讀

    詳解TCAN1042:高性能CAN收發(fā)器的卓越

    詳解TCAN1042:高性能CAN收發(fā)器的卓越選 在當(dāng)今的電子系統(tǒng)中,可靠且高效的通信至關(guān)重要。CAN(Controller Area Network)總線作為一種廣泛應(yīng)用于汽車(chē)、工業(yè)自動(dòng)化等領(lǐng)域
    的頭像 發(fā)表于 12-19 15:50 ?582次閱讀

    詳解THVD1428:高性能RS - 485收發(fā)器的卓越

    詳解THVD1428:高性能RS - 485收發(fā)器的卓越選 在電子工程師的日常工作中,選擇合適的收發(fā)器對(duì)于通信系統(tǒng)的穩(wěn)定性和性能至關(guān)重要。今天,我們就來(lái)詳細(xì)探討一下THVD1428,
    的頭像 發(fā)表于 12-17 16:10 ?497次閱讀

    時(shí)鐘設(shè)計(jì)優(yōu)化實(shí)戰(zhàn)

    1、時(shí)鐘設(shè)計(jì),芯片性能的節(jié)拍器 在現(xiàn)代 IC 設(shè)計(jì)中,時(shí)鐘網(wǎng)絡(luò)的優(yōu)化是實(shí)現(xiàn)高性能、高可靠性和低功耗的關(guān)鍵。本文聚焦四大核心技術(shù):CTS 優(yōu)化、DCD 最小化、時(shí)鐘門(mén)控和時(shí)鐘域交叉(CD
    的頭像 發(fā)表于 10-09 10:07 ?749次閱讀

    鴻蒙5開(kāi)發(fā)寶藏案例分享---Grid性能優(yōu)化案例

    發(fā)現(xiàn)鴻蒙寶藏:優(yōu)化Grid組件性能的實(shí)戰(zhàn)技巧! 大家好呀!最近在鴻蒙開(kāi)發(fā)者社區(qū)挖到一個(gè)超實(shí)用的性能優(yōu)化案例—— 解決Grid組件加載慢、滾動(dòng)卡頓的問(wèn)題 。官方其實(shí)藏了不少寶藏案例,但很
    發(fā)表于 06-12 17:47

    鴻蒙5開(kāi)發(fā)寶藏案例分享---長(zhǎng)列表性能優(yōu)化解析

    鴻蒙長(zhǎng)列表性能優(yōu)化大揭秘!告別卡頓,實(shí)戰(zhàn)代碼解析來(lái)了! 大家好呀~今天在翻鴻蒙開(kāi)發(fā)者文檔時(shí),發(fā)現(xiàn)了個(gè) 性能優(yōu)化寶藏案例 !官方居然悄悄放出了長(zhǎng)列表卡頓的完整解決方案,實(shí)測(cè)效果炸裂!我連
    發(fā)表于 06-12 17:40

    鴻蒙5開(kāi)發(fā)寶藏案例分享---應(yīng)用性能優(yōu)化指南

    鴻蒙性能優(yōu)化實(shí)戰(zhàn)指南:讓你的應(yīng)用飛起來(lái) ? 大家好!今天咱們聊聊鴻蒙(HarmonyOS)應(yīng)用性能優(yōu)化的實(shí)戰(zhàn)技巧。結(jié)合官方文檔和最佳實(shí)踐,我整理了8大核心
    發(fā)表于 06-12 17:17

    鴻蒙5開(kāi)發(fā)寶藏案例分享---性能優(yōu)化案例解析

    鴻蒙性能優(yōu)化寶藏指南:實(shí)戰(zhàn)工具與代碼案例解析 大家好呀!今天在翻鴻蒙開(kāi)發(fā)者文檔時(shí),意外挖到一個(gè) 性能優(yōu)化寶藏庫(kù) ——原來(lái)官方早就提供了超多實(shí)用工具和案例,但很多小伙伴可能沒(méi)發(fā)現(xiàn)!這篇就
    發(fā)表于 06-12 16:36

    HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問(wèn)題性能優(yōu)化

    應(yīng)用開(kāi)發(fā)過(guò)程中注重內(nèi)存管理,積極采取措施來(lái)減少內(nèi)存占用,以優(yōu)化應(yīng)用程序的性能和用戶體驗(yàn)。 HarmonyOS提供了一些內(nèi)存管理的工具和接口,幫助開(kāi)發(fā)者有效地管理內(nèi)存資源: onMemoryLevel接口
    發(fā)表于 05-21 11:27

    快手上線鴻蒙應(yīng)用高性能解決方案:數(shù)據(jù)反序列化性能提升90%

    近日,快手在Gitee平臺(tái)上線了鴻蒙應(yīng)用性能優(yōu)化解決方案“QuickTransformer”,該方案針對(duì)鴻蒙應(yīng)用開(kāi)發(fā)中廣泛使用的三方庫(kù)“class-transformer”進(jìn)行了深度優(yōu)化,有效提升
    發(fā)表于 05-15 10:01

    快手上線鴻蒙應(yīng)用高性能解決方案

    近日,快手在Gitee平臺(tái)上線了鴻蒙應(yīng)用性能優(yōu)化解決方案“QuickTransformer”,該方案針對(duì)鴻蒙應(yīng)用開(kāi)發(fā)中廣泛使用的三方庫(kù)“class-transformer”進(jìn)行了深度優(yōu)化,有效提升
    的頭像 發(fā)表于 05-14 09:11 ?1319次閱讀
    快手上線鴻蒙應(yīng)用高<b class='flag-5'>性能</b>解決方案
    蓬溪县| 黔江区| 沙湾县| 千阳县| 鄢陵县| 刚察县| 吴忠市| 清新县| 南部县| 阿拉善盟| 塔河县| 都江堰市| 兰坪| 高唐县| 河北省| 丰都县| 连山| 承德县| 萨嘎县| 满城县| 温州市| 聂拉木县| 襄垣县| 永泰县| 滕州市| 吴川市| 江达县| 横山县| 陆良县| 叙永县| 都江堰市| 志丹县| 乐业县| 潼关县| 平舆县| 金山区| 青海省| 齐河县| 南京市| 柳江县| 道真|