Android 優化開機啟動
Android開機啟動慢,是一個眾所周知的問題。
優化方向:
1、預載入的優化
在網上看的資料,對於開機啟動來說,耗時最久的是preload classes和scan packages。所以第一個優化方向就是預載入類。
這是在網上看的
· preloaded-classes list中預載入的類位於dalvik zygote程序的heap中。在zygote衍生一個新的dalvik程序後,新程序只需載入heap中沒有預載入的類(這些後加載進來的類成為該程序所private獨有的),這樣便加快了應用程式的啟動速度。實際上這是一種以空間換時間的辦法,因為幾乎沒有一個應用程式能夠使用到所有的預載入類,必定有很多類對於該應用程式來說是冗餘的。但是也正如Google所說,智慧手機開機遠沒有啟動應用程式頻繁——使用者開機一次,但直到下次再開機之前可能要執行多個應用程式。因此犧牲一點啟動時間來換取應用程式載入時的較快速度是合算的。
· preloaded-classes list已經是Google Android工程師使用眾多測試工具分析,加以手動微調後形成的最優化預載入列表,涵蓋了智慧機上最長見的應用型別所需要的各種類。很難想象我們自己能夠有什麼手段能夠獲得比這樣更優的一個預載入列表。所以,除非你的Android系統是被移植到非智慧手機裝置上使用(例如MID、EBOOK,可以不需要Telephony相關的類),不建議去“優化”preloaded-classes list。 在zygote中單起一個執行緒來做preload,是否可行?答案是否定的。首先在zygote中不可以新開執行緒,其次,就算新開一個執行緒,在目前智慧機硬體條件下(單核CPU),除非有頻繁大量的儲存IO,否則我們不能看到我們期望加速啟動效果。
上面說了“但是也正如Google所說,智慧手機開機遠沒有啟動應用程式頻繁——使用者開機一次,但直到下次再開機之前可能要執行多個應用程式。因此犧牲一點啟動時間來換取應用程式載入時的較快速度是合算的。”但是對於機頂盒來說,這就反而不是這樣了,機頂盒的開關機比較頻繁。
預載入優化方向:
(1)、將預載入放置到system_server 啟動之後。
對於幾個preload來說,最耗時的是類的預載入,所以我們可以把
preloadclass單獨剝離出來一個執行緒,並將其放到system_server之後,會有一定的啟動速度提升。
如此下程式碼所示:
public static class PreloadClassThread extends Thread {
public void run() {
preloadClasses();
}
}
static void preload() {
// preloadClasses(); // Delay preloadClasses
preloadResources();
preloadOpenGL();
}
public static void main(String argv[]) {
try {
.....省略無關程式碼
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
preload();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
.....省略無關程式碼
if (argv[1].equals("start-system-server")) {
startSystemServer();
} else if (!argv[1].equals("")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
Log.i(TAG, "Accepting command socket connections");
Thread preloadclass = new PreloadClassThread();
preloadclass.start();
(2)、載入的時候要順序載入 ,我們可以改為多執行緒同步來執行。
preloadClasses();
preloadResources();
preloadOpenGL();
android 原本的載入方式如下:
static void preload() {
preloadClasses();
preloadResources();
preloadOpenGL();
}
我們修改為:
static void concurrent_preload() {
Thread preloadclass = new PreloadClassThread();
Thread preloadres = new PreloadResThread();
preloadclass.start();
preloadres.start();
try {
preloadclass.join();
preloadres.join();
} catch (InterruptedException ex) {
Log.e(TAG, "concurrent_preload join() InterruptedException error ", ex);
}
preloadOpenGL();
}
我們可以加一些屬性來控制是否要跳過預載入、選擇哪種方式預載入。
scan packages的優化就是減少不必要的APK了。
2、去除SELinux
SELinux是一種強制訪問控制(MAC)系統。有以下兩種模式:
Enforcing:使能狀態,所有違反policy的動作都會被拒絕。
Permissive:寬容模式,違反policy的動作不會被拒絕,只會警告。
開啟SELinux,在kernel和init程序都會有相關的一些操作,所以會對開機速度有一定的影響。如果對於機頂盒這種的話,其實看情況也是可以關掉的。
關閉方法對於各個廠商可能有些不同,一般是在bootargs裡面把其配置為關閉即可。
3、開機動畫
其實很多時候,盒子已經到了launcher啟動的階段,但是開機動畫還沒播放完。優化開機動畫的顯示時間,可以減少很多開機時間,但是出於盒子本身的功能來說,開機動畫一般用作廣告,所以這個可以優化的空間比較小。手機倒是可以這樣子優化,這就沒什麼好說的了,修改bootanimation.zip中的開機動畫時間即可。
4、減少不必要的service
這裡說的是兩種不同概念的service:
1是由init程序來啟動的service,這個需要裁剪init.xxx.rc中不需要的service,因為init程序啟動太多service的話,可能會導致zygote和systemServer啟動速度受到影響。
2是system_server啟動的java層面的service,像機頂盒的話telephony,location這樣的服務一般也可以不要了。
5、修改為odex方式
這是以空間換取時間的優化方式。
1、在自己device目錄 下Bordconfig.mk中加入
WITH_DEXPREOPT=true
2、在相同目錄下修改system.prop
dalvik.vm.verify-bytecode=true
相關推薦
Android 優化開機啟動
Android開機啟動慢,是一個眾所周知的問題。 優化方向: 1、預載入的優化 在網上看的資料,對於開機啟動來說,耗時最久的是preload classes和scan packages。所以第一個優化方向就是預載入類。 這是在網上看的 · p
Android系統開機啟動C可執行檔案
在工作中有一個需求是android手機開機啟動一個C可執行檔案,起初嘗試是將在android原始碼裡面寫一個bash指令碼,然後在腳本里面執行/data目錄下的可執行檔案,然後將系統燒寫進手機,開機後將可執行檔案放入手機/data目錄裡面,然後重啟,最終的結果是沒有成功。
Android 優化OTA包大小和開機啟動時間
問題說明 在Android 升級到 5.0 (Lollipop/L)之後,虛擬機器例項換成了ART,這加快了應用執行時的速度,但是在系統升級中卻引入了一些不便之處: 在生成升級包時,因為ART採用了預編譯優化功能,會把 APK 及JAR等通過dex2ota預編譯成odex
Android開機啟動效能優化
Android 開機啟動速度優化 一 在開機啟動中,可以藉助bootchart 工具分析android的啟動過程。bootchart是一個用於linux啟動過程效能分析的開源軟體工具,在系統啟動過程自動收集CPU佔用率、程序等資訊,並以圖形方式顯示分析結果,可用作指導優化系統啟動過程。 1、UBu
Android開機啟動
sys ttext system 權限 cast cas n) gif complete 使用Android Studio幫我們創建廣播,點擊包名-->New-->BroadcastReceiver 在清單文件中會自動生成 我們加上開機廣播的action
Linux系統開機啟動項優化 命令詳解 齊天大聖原創作品 命令來自老男孩教育
開機啟動優化Linux系統開機啟動項優化 命令詳解 齊天大聖原創作品 命令來自老男孩教育
企業案例:系統開機啟動項優化 除了下面5個服務以外都關閉 crond sshd network rsyslog sysstat
企業案例:系統開機啟動項優化 除了下面5個服務以外都關閉 crond sshd network rsyslog sysstat第一步:把要執行命令的樣子顯示出來[[email protected]/* */ ~]# chkconfig|egrep "sshd|crond|rsys
支付寶客戶端架構解析:Android 客戶端啟動速度優化之「垃圾回收」
前言 《支付寶客戶端架構解析》系列將從支付寶客戶端的架構設計方案入手,細分拆解客戶端在“容器化框架設計”、“網路優化”、“效能啟動優化”、“自動化日誌收集”、“RPC 元件設計”、“移動應用監控、診斷、定位”等具體實現,帶領大家進一步瞭解支付寶在客戶端架構上的迭代與優化歷程。 本節將介紹支付寶 Andro
[Android]自定義開機動畫實踐 Android定製:修改開機啟動畫面
關於開機動畫的修改,可以參考 Android定製:修改開機啟動畫面 開機動畫主要是載入圖片,就像動畫片一樣。 在製作bootanimation.zip檔案的時候,需要注意 應該採用“儲存”(store)的方式去打包,不然系統會識別不了圖片資源 下面是一個動畫修改測試,我們也
Android如何配置init.rc中的開機啟動程序(service)
轉載。 http://blog.csdn.net/qq_28899635/article/details/56289063 開篇:為什麼寫這篇文章 先說下我自己的情況,我是個普通的學生,之前在學校一直做Android應用開發,找實習的時候也一直想找相關的工作,來到現在這家公司以
Android 關於執行緒 殺不死 的 開機啟動 浮動框
參考資料 殺不死 http://blog.csdn.net/t12x3456/article/details/8982198– http://blog.csdn.net/marswin89/article/details/50917098– http://blo
Android 8.0 啟動速度優化工具
在Android 8.0上面,google進行了啟動速度的優化,但是對於開發者來說,追求更快的速度是必須的。 這邊就介紹一個android啟動速度優化的工具,bootchart。 bootchart在5.0的時候就以推出,但是現在的使用方式有了一些調整,下面就簡
Android UI優化— App啟動優化
黑白屏產生的原因和解決辦法 黑白屏產生的原因 1、還沒載入到佈局檔案,就已經顯示了window視窗背景 2、黑屏白屏就是window視窗背景 容易產生黑白屏的地方 1、Activity的onCreate()中 @Override pro
Android UI優化—App啟動流程和啟動模式
Android 理論基礎 1、每一個Android App都執行在一個單獨的程序中 2、Android App由很多不同元件組成,這些元件還可以啟動其他App的元件 3、一個程序裡面只有一個主執行緒 4、程序在其需要的時候被啟動 基於上述共識,我們先來分析Android系統的啟動流程
android專案效能優化之啟動時間
一般來說,判定一個android專案效能優劣,我們有以下幾個指標: 啟動時間 apk大小 UI渲染 穩定性 記憶體佔用 電量消耗 接下來,讓我們就這幾個指標展開來詳述各自究竟應該怎樣去優化。 啟動時間 一般來說,應用啟動時間分為三種 首次啟動
Android應用冷啟動過程分析和優化方案你瞭解多少
你有沒有發現,點選安卓手機桌面上的App圖示時,有時候應用馬上進入主介面,有時候要經歷好幾秒甚至更久的白屏(也可能是黑屏)時間才能進入主介面呢?這其實是安卓應用常見的冷熱啟動問題。本文就和大家一起聊聊冷熱啟動方式和啟動頁的體驗優化方案。 啟動方式 安卓應用的啟動方式分為三種:冷啟動
imx6 android開機啟動守護程序
由於專案中需用到自己的編寫的兩個底層命令列程式,並且讓系統開機就自啟動這兩個程式。 我把這兩個程式寫成了守護程序。並自一個shell指令碼中執行啟動這兩個程式的命令,這樣,我設定adroid開機啟動的時候就只有啟動這個指令碼就行了。 做好以上兩點,接下來就是新增相應的拷貝動
Android N 的開機啟動流程概述
前言 做android開發已經好些年頭,一直對android系統的開機啟動流程一知半解。前前後後看了不少文章和原始碼,在這裡把自己的一些總結記錄下來,也算是加深自己的理解。 Android N 開機啟動流程概述 相信只要接觸過Android的人,都會看
愛奇藝Android客戶端啟動優化與分析
1 簡介 網際網路領域裡有個八秒定律,如果網頁開啟時間超過8秒,便會有超過70%的使用者放棄等待,對Android APP而言,要求更加嚴格,如果系統無響應時間超過5秒,便會出現ANR,APP可能會被強制關閉,因此,啟動時間作為一個重要的效能指標,關係著使用者的第一體驗。 愛奇藝安卓APP非
android開機啟動流程簡單分析
android啟動 當載入程式啟動Linux核心後,會載入各種驅動和資料結構,當有了驅動以後,開始啟動Android系統同時會載入使用者級別的第一個程序init(system\core\init\init.cpp)程式碼如下: int main(int ar