android文件校驗-ag真人国际官网
① android生成apk後目錄中meta-inf目錄文件解析
android開發環境對每一個需要release的apk都會進行簽名,在apk文件被安裝時,android系統會對apk的簽名信息進行比對,以此來判斷程序的完整性,最終確定apk是否可以正常安裝使用,一定程度上達到安全的目的。
給一個apk文件的後綴名從.apk改為.zip或者.rar,然後利用解壓工具進行解壓,我們會在meta-inf目錄下看到四個文件: manifest.mf、cert.sf、index.list、cert.rsa
manifest.mf(摘要文件): 程序遍歷apk包中的所有文件,對非文件夾非簽名文件的文件,逐個用sha1生成摘要信息,再用base64進行編碼。如果apk包的文件被修改,在apk安裝校驗時,被修改的文件與manifest.mf的校驗信息不同,程序將無法正常安裝。
cert.sf(對摘要文件的簽名文件): 對於生成的manifest.mf文件利用sha1-rsa演算法對開發者的私鑰進行簽名。在安裝時只有公共密鑰才能對其解密。解密之後將其與未加密的摘要信息進行比對,如果相符則文件沒有被修改。
index.list apk索引文件目錄
cert.rsa 保存公鑰、加密演算法等信息。
在apk進行安裝時,可以通過manifest.mf文件開始的環環相扣來保證apk的安全性。但這些文件或者密鑰如果被攻擊者得到或者被攻擊者通過某些技術手段攻破,則android操作系統無法驗證其安全性。
② android啟動優化概述
android啟動應用, 按 官方說法 分為冷啟動, 溫啟動和熱啟動.
具體的定義可以看官方文檔, 簡單地說
一般我們只需要關注冷啟動即可.
要想啟動快, 硬體性能必然有影響, 在硬體一定的前提下, 我們要盡量 降低啟動應用時cpu的負載 , 讓cpu有更多的算力投入到啟動流程中:
在做好一些基本原則後, 接著看具體的流程優化點
在應用進程創建後, 首先必然是載入類, 此時一些靜態變數就會初始化了, 因此我們應該
類載入完畢後就是創建 application 實例了, 因此我們應該
之後會先創建 contentprovider 和執行 contentprovider.oncreate() , 因此我們應該
跟接著就會執行 application.oncreate() 等方法, 因此我們應該
接著就進入 activity 環節.
同樣第一步會是創建實例, 因此我們應該
在 activity 進程生命周期後, 第一步就是渲染(inflate)布局, 我們應該
在應用啟動的瞬間, 系統服務會先展示一個空白窗口, 等待應用第一幀繪制完畢後, 再從該窗口切換到應用, 如果啟動耗時較長, 就會明顯看到白屏, 對於這一點, 常見的操作有
可以使用idlehandler, 在主線程空閑時再執行某些不重要的操作
實際上非同步初始化只是不阻塞主線程, 但是子線程一樣會佔用cpu資源, 讓主線程的執行時間變少, 所以不應該盲目地將所有工作放到子線程.
優化做到最後, 就是在系統流程上做文章了
原理是將啟動時載入的類放到主dex,提升了這些類的內聚,讓更多的類滿足pre-verify的條件,在安裝時就做了校驗和優化,以減少首次載入的耗時,從而優化冷啟動耗時。
redex 初探與 interdex:andorid 冷啟動優化
應用啟動過程中會從apk壓縮包中讀取文件, 該優化的原理是利用linux中的pagecache機制, 讓啟動過程會用到的文件盡可能進入緩存中, 減少磁碟io次數
支付寶 app 構建優化解析:通過安裝包重排布優化 android 端啟動性能
在dalvik vm(android5.0以前)載入類的時候會有一個類校驗過程, 它需要校驗方法的每一個指令, 是一個比較耗時的過程, 可以通過hook去掉類載入過程中的類驗證過程. 不過對於art(android5.0之後)來說, 這個過程在安裝時已經做了, 所以用處不大.
不進入冷啟動, 就不用優化了~
這個android studio自帶的工具, 可以看到啟動過程中詳細的方法執行流程, 但是採集數據本身會影響方法執行, 所以不能准確判斷每個方法的耗時, 但是仍可以判斷哪個方法相對來說耗時.
這個工具的好處是可以自定義事件, 可以指定需要採集的數據集, 可以看到線程間的狀態等.
啟動優化的一個關鍵點在於定義啟動結束的點, 以及如何測量啟動時間.
在android4.4以上, 系統進程會提供一個類似 activitymanager: displayed ***: 3s534ms 的日誌, 表示從啟動進程到首次繪制完畢所用的時間.
應用可以在任何時候調用該方法, 觸發系統列印類似 system_process i/activitymanager: fully drawn {package}/.mainactivity: 1s54ms 的日誌
應用可以通過 viewtreeobserver 來監聽繪制前回調來判斷第一幀的繪制時機, 或者直接在控制項樹的末尾加一個簡單的view, 它 ondraw 調用時即表示頁面(差不多)繪制完畢.
應用啟動過程可以參考 android vitals series' articles 系列文章