chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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è)界的方案作了對比,并實(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對象指針。

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

InsertClass:將類插入到對應(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)插入到括號、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對象中的verify_設(shè)置成verifier::VerifyMode::kNone。

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

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

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

將多出EnsureSkipAccessChecksMethods一步處理邏輯,將類中每個(gè)函數(shù)flag進(jìn)行修改,此處邏輯沒有對單個(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。

平臺化

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

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

    關(guān)注

    8

    文章

    682

    瀏覽量

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

    關(guān)注

    1

    文章

    968

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    時(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 ?297次閱讀

    鴻蒙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ā)寶藏案例分享---長列表性能優(yōu)化解析

    鴻蒙長列表性能優(yōu)化大揭秘!告別卡頓,實(shí)戰(zhàn)代碼解析來了! 大家好呀~今天在翻鴻蒙開發(fā)者文檔時(shí),發(fā)現(xiàn)了個(gè) 性能優(yōu)化寶藏案例 !官方居然悄悄放出了長列表卡頓的完整解決方案,實(shí)測效果炸裂!我連
    發(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)用性能問題的策略

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

    HarmonyOS NEXT 原生應(yīng)用/元服務(wù)-DevEco Profiler性能優(yōu)化過程

    流程概覽 在開發(fā)應(yīng)用時(shí),開發(fā)者會(huì)對應(yīng)用的運(yùn)行情況有一個(gè)預(yù)期的指標(biāo),當(dāng)應(yīng)用在某些方面不能滿足預(yù)期的指標(biāo)或者表現(xiàn)不佳時(shí),意味著您的應(yīng)用可能存在性能問題,需要對應(yīng)用進(jìn)行性能優(yōu)化以達(dá)到您的預(yù)期。應(yīng)用的
    發(fā)表于 02-19 15:28

    MPLS網(wǎng)絡(luò)性能優(yōu)化技巧

    MPLS(多協(xié)議標(biāo)簽交換)網(wǎng)絡(luò)性能優(yōu)化是一個(gè)復(fù)雜的過程,涉及多個(gè)方面的技術(shù)和策略。以下是一些關(guān)鍵的MPLS網(wǎng)絡(luò)性能優(yōu)化技巧: 一、確保網(wǎng)絡(luò)設(shè)備支持 設(shè)備兼容性 :確保所有網(wǎng)絡(luò)設(shè)備(如路
    的頭像 發(fā)表于 02-14 17:09 ?1495次閱讀

    前端性能優(yōu)化:提升用戶體驗(yàn)的關(guān)鍵策略

    在互聯(lián)網(wǎng)飛速發(fā)展的今天,用戶對于網(wǎng)頁的加載速度和響應(yīng)性能要求越來越高。前端性能優(yōu)化成為了提升用戶體驗(yàn)、增強(qiáng)網(wǎng)站競爭力的關(guān)鍵策略。一個(gè)性能良好的前端應(yīng)用,能夠快速響應(yīng)用戶的操作,減少等待
    的頭像 發(fā)表于 01-22 10:08 ?857次閱讀

    如何優(yōu)化TCP協(xié)議的性能

    優(yōu)化TCP協(xié)議的性能可以從多個(gè)方面入手,以下是一些關(guān)鍵的策略和方法: 一、調(diào)整TCP參數(shù) TCP窗口大小 : 重要性 :TCP窗口大小是衡量TCP協(xié)議性能的一個(gè)關(guān)鍵參數(shù),決定了無需等待確認(rèn)應(yīng)答即可
    的頭像 發(fā)表于 01-22 09:52 ?1488次閱讀

    如何優(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 ?1105次閱讀

    華為云 X 實(shí)例 CPU 性能測試詳解優(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 ?1214次閱讀
    華為云 X 實(shí)例 CPU <b class='flag-5'>性能</b>測試<b class='flag-5'>詳解</b>與<b class='flag-5'>優(yōu)化</b>策略

    仿真系統(tǒng)的性能優(yōu)化技巧

    在現(xiàn)代工業(yè)和科學(xué)研究中,仿真系統(tǒng)扮演著越來越重要的角色。它們不僅能夠幫助我們預(yù)測復(fù)雜系統(tǒng)的行為,還能在沒有實(shí)際物理原型的情況下進(jìn)行實(shí)驗(yàn)和測試。然而,隨著仿真模型的復(fù)雜度增加,性能優(yōu)化成為了一個(gè)不可
    的頭像 發(fā)表于 12-19 14:47 ?4129次閱讀

    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 ?1129次閱讀