色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于應用性能優化之VerifyClass詳解

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

為了加速應用冷啟動過程且不過度涉及業務改動,本文從虛擬機加載類的過程中找到優化項,且與業界的方案作了對比,并實現了半自動化的分析功能。類在使用或實例化之前需要被加載到虛擬機中并進行初始化。整個過程如下圖所示:主要由LoadingClass和InitializingClass兩部分組合。

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

加載類

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

SetupClass:設置類的訪問標志以及ClassLoader。

InsertClass:將類插入到對應ClassLoader的ClassTable中,以便查找。

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

類初始化

類的屬性或方法在使用前必須經過類的初始化。

InitializeClass:核驗類、初始化父類、接口方法以及靜態屬性。

VerifyClass:核驗類的合法性,在下一節詳細分析。

核驗類

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

VerifyClassUsingOatFile:通過Oat文件中的Class狀態位去核驗Class,當狀態位等于kStatusVerified時,核查流程到此為止,直接快速返回。否則需要進入耗時的PerformClassVerification流程。

PerformClassVerification:主要核驗類中的直接方法和虛方法。

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

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

VerifyInstructions:檢查各種dalvik指令,同時將GC檢查點插入到括號、switch、throw指令中。

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

提前發現

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

通過oatdump命令去dump相應的odex文件,可以查看類的狀態位,操作方式如下:

VLOG默認是不會被打印的,需要動態開啟,開啟的方式可以通過:art::gLogVerbosity.class_linker = true而打開,因為本項目需要看到dex2oat和其他進程的打印情況,本人是在系統源碼中進行編譯生成的so,然后,通過ptrace注入so到Zygote的,此方法需要root設備,如果只需要查看本進程,應不需要這么麻煩,具體方法還未探索,但思路應該是一致的。舉例如下,本人碰到的問題是AppCompat包中的類不能被核驗通過。

解決方案

將Runtime對象中的verify_設置成verifier::VerifyMode::kNone。

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

缺少VerifyClass過程,可能會后置發現非法指令問題。

對zygote中值verify_進行修改將造成cow內存消耗。

將多出EnsureSkipAccessChecksMethods一步處理邏輯,將類中每個函數flag進行修改,此處邏輯沒有對單個類進行處理,所以,每個類的每個函數的flag都將被無謂修改,如下圖所示:

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

本App運行環境是在8.1(API27)上,TextView沒有方法setFirstBaselineToTopHeight,所以,因為指令非法導致類核驗失敗。(注意Build.VERSION.SDK_INT是不會被編譯優化的,它本身是final類型,但它的取值是等于SystemProperties.getInt(“ro.build.version.sdk”, 0),所以,必須運行時,才能確定)。本人嘗試了如下方法:

將系統源碼sdk中的Build.VERSION.SDK_INT值設置成27進行編譯出新的sdk,然后,將此sdk覆蓋源生的android.jar,希望編譯時將appcompat中的Build.VERSION.SDK_INT 》= 28判斷邏輯優化掉,但實際aar不會參與sdk的編譯,此項只能優化項目自身的邏輯。

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

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

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

如果是應用需要兼容多個不同版本的ROM,也可以按照ROM版本的不同,使用App Bundle下發“最合適”的App。

平臺化

為了降低方案實施難度,現已將方案平臺化,只要將apk拖入網頁中即可看到類核驗不通過的原因。
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 源碼
    +關注

    關注

    8

    文章

    647

    瀏覽量

    29293
  • 虛擬機
    +關注

    關注

    1

    文章

    919

    瀏覽量

    28285
收藏 人收藏

    評論

    相關推薦

    如何優化總線系統的性能

    總線系統是計算機和其他電子設備中用于傳輸數據的關鍵組件。性能優化可以提高數據傳輸速率、降低延遲,并增強系統的可靠性和擴展性。 1. 理解總線系統 總線類型 :介紹不同類型的總線,如PCIe、USB
    的頭像 發表于 12-31 09:54 ?108次閱讀

    華為云 X 實例 CPU 性能測試詳解優化策略

    分析 ? 3.2 CPU性能瓶頸分析 ? 4. CPU性能優化策略 ? 4.1 優化CPU性能的常用方法 ? 4.2 操作系統內核調優 ?
    的頭像 發表于 12-30 14:52 ?133次閱讀
    華為云 X 實例 CPU <b class='flag-5'>性能</b>測試<b class='flag-5'>詳解</b>與<b class='flag-5'>優化</b>策略

    SSM框架的性能優化技巧 SSM框架中RESTful API的實現

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

    Linux性能優化

    一、優化內核相關參數 配置文件/etc/sysctl.conf 配置方法直接將參數添加進文件每條一行 sysctl -a 可以查看默認配置sysctl -p 執行并檢測是否有錯誤 1、網絡相關
    的頭像 發表于 12-06 10:15 ?221次閱讀
    Linux<b class='flag-5'>之</b><b class='flag-5'>性能</b><b class='flag-5'>優化</b>

    如何優化DCS系統的性能

    優化DCS(分布式控制系統)系統的性能是確保工業自動化過程高效、穩定運行的關鍵。以下是一些具體的優化措施: 一、硬件優化 設備選擇與升級 :檢查并確保DCS系統的硬件設備符合規格要求,
    的頭像 發表于 11-13 09:19 ?554次閱讀

    如何優化emc存儲性能

    在當今的數據中心環境中,存儲性能對于業務連續性和數據訪問速度至關重要。EMC作為領先的存儲解決方案提供商,其產品線涵蓋了從入門級到企業級的存儲系統。然而,即使是最好的存儲系統也需要定期優化以保持最佳
    的頭像 發表于 11-01 15:57 ?326次閱讀

    如何優化SOC芯片性能

    優化SOC(System on Chip,系統級芯片)芯片性能是一個復雜而多維的任務,涉及多個方面的優化策略。以下是一些關鍵的優化措施: 一、架構設計
    的頭像 發表于 10-31 15:50 ?567次閱讀

    使用Arthas火焰圖工具的Java應用性能分析和優化經驗

    分享作者在使用Arthas火焰圖工具進行Java應用性能分析和優化的經驗。
    的頭像 發表于 10-28 09:27 ?309次閱讀
    使用Arthas火焰圖工具的Java<b class='flag-5'>應用性能</b>分析和<b class='flag-5'>優化</b>經驗

    如何優化FPGA設計的性能

    優化FPGA(現場可編程門陣列)設計的性能是一個復雜而多維的任務,涉及多個方面和步驟。以下是一些關鍵的優化策略: 一、明確性能指標 確定需求 :首先,需要明確FPGA設計的
    的頭像 發表于 10-25 09:23 ?400次閱讀

    AI大模型的性能優化方法

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

    MySQL性能優化淺析及線上案例

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

    一款3605電源芯片的性能優化與改進思路

    在電源設計中,確保電源轉換器在各種工作條件下都能提供穩定和高效的性能至關重要。 ASP3605是一款高效同步降壓轉換器,它提供了多種調節選項,以優化電源的性能。特別是,ITH(Error
    發表于 08-23 14:34

    Memcached介紹和詳解

    在現代Web開發中,提升應用性能的一個關鍵方面是優化數據存儲和訪問速度。隨著網站和應用程序的用戶量增長,傳統的數據庫系統面臨巨大的壓力,這促使開發者尋求更快速的數據緩存解決方案。Memcached
    發表于 07-17 15:58

    OpenHarmony開機優化

    對其進行詳細的性能分析,從而優化系統啟動速度和運行效率。 三丶開機優化 開機優化的主要目的是為了快速啟動開機動畫和退出開機動畫(顯示桌面)。所以在
    發表于 07-01 16:39

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

    全志T527芯片詳解:計算性能與高清圖像編解碼
    的頭像 發表于 05-21 14:37 ?2963次閱讀
    全志T527芯片<b class='flag-5'>詳解</b>:計算<b class='flag-5'>性能</b>與高清圖像編解碼
    主站蜘蛛池模板: 有码在线播放| 成人综合在线视频免费观看完整版| 囯产精品久久久久久久久蜜桃| 日本污ww视频网站| 国产乱人偷精品视频A人人澡| 亚洲不卡视频| 麻豆精品传媒2021网站入口| chinese黑人第一次| 翁用力的抽插| 老司机福利在 线影院| 吃奶吸咪咪动态图| 亚洲午夜精品一区二区公牛电影院 | 快播最新电影网站| 陈红下面又紧又小好爽| 亚洲蜜桃AV色情精品成人| 蜜芽tv在线www| 国产免费久久爱久久啪| 2018国产天天弄谢| 午夜黄视频| 男人插曲女人的视频| 国产精品一区二区在线观看| 91素人约啪| 亚洲 欧美 综合 高清 在线| 男生J桶进女人P又色又爽又黄| 国产视频这里只有精品| AV一区AV久久AV无码| 亚洲乱码在线卡一卡二卡新区| 青青草国产精品| 国产在线观看免费观看| CHRISTMAS农村夫妻HO| 亚洲男人片片在线观看| 日本色高清| 老奶奶50p| 黑人巨茎vide抽搐| 国产AV精品久久久毛片| 99在线在线视频观看| 伊人久久丁香色婷婷啪啪| 性直播免费| 神电影院午夜dy888我不卡| 女人和男人插曲视频大全| 久久99re6热在线播放|