91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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語句開始地址、結(jié)束地址以及try開始操作符的合法性。檢查catch中handler語句開始操作符的合法性。

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都將被無謂修改,如下圖所示:

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

本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à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

    文章

    685

    瀏覽量

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

    關(guān)注

    1

    文章

    973

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

    詳解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 ?433次閱讀

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

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

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

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

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

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

    時(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í)鐘門控和時(shí)鐘域交叉(CD
    的頭像 發(fā)表于 10-09 10:07 ?574次閱讀

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

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

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

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

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

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

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

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

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

    應(yīng)用開發(fā)過程中注重內(nèi)存管理,積極采取措施來減少內(nèi)存占用,以優(yōu)化應(yīng)用程序的性能和用戶體驗(yàn)。 HarmonyOS提供了一些內(nè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)用開發(fā)中廣泛使用的三方庫“class-transformer”進(jìn)行了深度優(yōu)化,有效提升
    發(fā)表于 05-15 10:01

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

    近日,快手在Gitee平臺(tái)上線了鴻蒙應(yīng)用性能優(yōu)化解決方案“QuickTransformer”,該方案針對(duì)鴻蒙應(yīng)用開發(fā)中廣泛使用的三方庫“class-transformer”進(jìn)行了深度優(yōu)化,有效提升
    的頭像 發(fā)表于 05-14 09:11 ?1234次閱讀
    快手上線鴻蒙應(yīng)用高<b class='flag-5'>性能</b>解決方案

    解決應(yīng)用性能問題的策略

    性能調(diào)優(yōu)貫穿于鴻蒙應(yīng)用開發(fā)的整個(gè)生命周期中,開發(fā)前有性能最佳指南等賦能套件讓你快速上手學(xué)習(xí),開發(fā)過程中有性能工具開發(fā)套件覆蓋應(yīng)用開發(fā)各階段,應(yīng)用開發(fā)完成上架后有專業(yè)的性能測(cè)試工具檢查測(cè)
    的頭像 發(fā)表于 04-24 11:42 ?900次閱讀
    解決<b class='flag-5'>應(yīng)用性能</b>問題的策略