1. 程式人生 > >有關android加快開機速度

有關android加快開機速度

      我們知道,android開機速度慢,在恢復出廠設定後開機速度更慢,其中優化dex檔案的過程就耗時很多。那麼我們就可以嘗試將優化dexopt步驟提前到編譯階段生成img檔案的環節去。當然了這是一個以rom空間換取時間的策略。

可以通過在BoardConfig.mk中加入
# Enable the optimized DEX
WITH_DEXPREOPT=true
或者直接修改system.prop
# ODEX
dalvik.vm.verify-bytecode=true

然後我們探索看看android是怎麼樣進行這個特性的?

$grep -r "WITH_DEXPREOPT" build/
build/core/prebuilt.mk:ifeq (true,$(WITH_DEXPREOPT))
build/core/java_library.mk:ifeq (true,$(WITH_DEXPREOPT))
build/core/main.mk:  ifeq ($(HOST_OS)-$(WITH_DEXPREOPT_buildbot),linux-true)
build/core/main.mk:    WITH_DEXPREOPT := true
build/core/package.mk:ifeq (true,$(WITH_DEXPREOPT))
build/core/product_config.mk:    WITH_DEXPREOPT_buildbot := true

在build/core下面有個檔案dex_preopt.mk,這個檔案值得注意。

android真是太龐大了,其指令碼之間的關係對於我這個初涉的人還是好生畏懼,值得研究。詳細如下。

======================================================

build/core/main.mk

  # config/product_config.make once host-based Dalvik preoptimization is
  # working.
  ifneq (true,$(DISABLE_DEXPREOPT))
  ifeq ($(HOST_OS)-$(WITH_DEXPREOPT_buildbot),linux-true)
    WITH_DEXPREOPT := true
  endif
  endif

=====================================================

build/core/package.mk

ifeq (true,$(WITH_DEXPREOPT))
ifeq (,$(TARGET_BUILD_APPS))
ifneq (,$(LOCAL_SRC_FILES))
ifndef LOCAL_DEX_PREOPT
LOCAL_DEX_PREOPT := true
endif
endif
endif
endif

=====================================================

build/core/prebuild.mk

ifneq ($(filter APPS,$(LOCAL_MODULE_CLASS)),)
ifeq (true,$(WITH_DEXPREOPT))
ifeq (,$(TARGET_BUILD_APPS))
ifndef LOCAL_DEX_PREOPT
LOCAL_DEX_PREOPT := true
endif
endif
endif
endif

=====================================================

build/core/java_library.mk

ifeq (true,$(WITH_DEXPREOPT))
ifeq (,$(TARGET_BUILD_APPS))
ifndef LOCAL_DEX_PREOPT
LOCAL_DEX_PREOPT := true
endif
endif
endif

====================================================

build/core/product_config.mk

  # Hack to make the linux build servers use dexpreopt (emulator-based
  # preoptimization). Most engineers don't use this type of target
  # ("make PRODUCT-blah-user"), so this should only tend to happen when
  # using buildbot.
  # TODO: Remove this once host Dalvik preoptimization is working.
  ifeq ($(TARGET_BUILD_VARIANT),user)
    WITH_DEXPREOPT_buildbot := true
  endif

另外補充:

1、system/app下放置系統apk;data/app下放置內建第三方apk;

2、在生成的system/app和system/framework下會生成優化後的odex檔案;

3、odex佔用物理空間比dex和apk檔案要大,所以上述方法是計算機作業系統中典型的空間和時間互換的思想;

下面的轉自:http://www.cnblogs.com/jacobchen/p/3599483.html

BOOTCLASSPATH簡介
1.BOOTCLASSPATH是Android Linux的一個環境變數,可以在adb shell下用$BOOTCLASSPATH看到。
2.BOOTCLASSPATH於/init.rc檔案中export,如果沒有找到的話,可以在init.rc中import的檔案裡找到(如import /init.environ.rc)。
3.init.rc檔案存在於boot.img的ramdisk映像中。如果僅僅是修改/init.rc檔案,重啟後會被ramdisk恢復,所以直接修改是沒有效果的。
4.boot.img是一種特殊的Android定製格式,由boot header,kernel,ramdisk以及second stage loader(可選)組成,詳見android/system/core/mkbootimg/bootimg.h。

boot.img空間結構:

** +-----------------+
** | boot header     | 1 page
** +-----------------+
** | kernel          | n pages
** +-----------------+
** | ramdisk         | m pages
** +-----------------+
** | second stage    | o pages
** +-----------------+


典型的ramdisk檔案結構:
./init.trout.rc
./default.prop
./proc
./dev
./init.rc
./init
./sys
./init.goldfish.rc
./sbin
./sbin/adbd
./system
./data

BOOTCLASSPATH的作用
以Android4.4手機的BOOTCLASSPATH為例:
export BOOTCLASSPATH /system/framework/core.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar...
當kernel啟動時1號程序init解析init.rc,將/system/framework下的jar包路徑export出來。
Dalvik虛擬機器在初始化過程中,會讀取環境變數BOOTCLASSPATH,用於之後的類載入和優化。

Dalvik虛擬機器的啟動和dexopt流程
從一文可以知道,Zygote會在啟動後建立Dalvik虛擬機器例項,並進行初始化。

那我們就接著Dalvik虛擬機器初始化後開始探究它是如何通過BOOTCLASSPATH來進行dex優化的:

1.1. VM initialization

android/dalvik/vm/Init.cpp

1 2 3 4 5 6 7 8 9 10 11 12 13 std::string dvmStartup(int argc, const char* const argv[], bool ignoreUnrecognized, JNIEnv* pEnv) { ... ALOGV("VM init args (%d):", argc); ... setCommandLineDefaults(); // ---> 讀取BOOTCLASSPATH ... if (!dvmClassStartup()) { // ---> 初始化bootstrap class loader return "dvmClassStartup failed"; } }

 1.2. 讀取BOOTCLASSPATH

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 static void setCommandLineDefaults() { const char* envStr = getenv("CLASSPATH"); if (envStr != NULL) {

相關推薦

有關android加快開機速度

      我們知道,android開機速度慢,在恢復出廠設定後開機速度更慢,其中優化dex檔案的過程就耗時很多。那麼我們就可以嘗試將優化dexopt步驟提前到編譯階段生成img檔案的環節去。當然了這是一個以rom空間換取時間的策略。 可以通過在BoardConfig.mk中加入 # Enab

加快android studio 編譯速度

1.加快AS啟動速度(推薦) 找到studio安裝目錄下的bin目錄下的“idea.properties”檔案,在該檔案最後一行新增:  disable.android.first.run=true  PS:AS在第一次開啟的時候會連網更新(翻檣),我們的目的就是把聯網下載操作遮蔽掉

如何加快win10開機速度

win10方法/步驟1將無關的啟動項全部禁用。在狀態列上右屬鍵 開啟工作管理員,然後開啟“啟動”項,把裡面不需要的全部禁用。 2依次進入控制面板→所有控制面板項→電源選項→系統設定,點選“更改當前不可用的設定”這個選項。 3把最下面原本屬於灰色不可選的“啟用快速啟動”,點選它前面的勾選,然後再點選儲存修改

Android開機速度優化(第三篇)

問題描述開機時間相對參考機過慢,大約慢15s左右。Android 系統7.0。問題分析開機問題涉及的層次較多,大致有bootloader-->kernel-->Zygote-->PMS-->AMS-->Launcher可以藉助bootchart來分析,也可以直接通過log分析。不

修改Android系統原始碼,優化開機速度

下面部分寫的比較零散,整合了一下,可以移步到最新一篇: 通常情況下,Android系統開機保持在20s~25s應該算是合格比較好的狀態。 最近幾天在看關於Android系統開機啟動過程的相關內容。做個筆記。 關於有話Android系統開機時間有話,採取三個措施有話,修

Android odex優化提高首次開機速度

      現在很多Android都需要預裝很多apk,這些apk主要在/system/app,/system/priv-app/,/system/vendor/app等目錄下。如果沒有做odex優化,在首次開機時,systemService.java 會呼叫Package

Android 開機速度優化-----ART 預先優化

首先ART相容Dalvik.也就是說ART 能執行”dex”(Dalvik執行檔案).因此對Androidapp的開發者來說,他們沒有什麼區別.兩者最大的區別是:ART把JIT(Just-in-Time)變成了AOT(Ahead-of-Time).JIT需要在每次執行app時都需要執行一遍,而AOT 只需要執

Android開機速度優化簡單回顧

Android的開機速度,基本上沒人說快的,通常移植完系統後,馬上要看的事情就是優化開機時間,以下是簡單回憶以下以前做優化的那些事。 開機時間都花在哪? 優化開機時間,通常做的首先是那有有沒有BUG,明顯不合理的先解決,由於開發階段穩定性問題,一些地方可能延時加的大,或者頻

微信公眾號項目總結--加快開發速度和調試效率

body 系統 and http web jssdk editable ali size   近端時間接手了某上市公司的內部員工分享系統的微信端項目,由於接手後去理解整個項目的架構、規範等的時間緊迫,所以導致開發期間遇到較多問題從而加班加到心力交瘁。現在項目大概算完成了一個

使用Openresty加快網頁速度

全部 解決辦法 fault warn upstream mys tor proxy tps 新年快樂~~~ 上一篇文章講到使用多級緩存來減少數據庫的訪問來加快網頁的速度,只是,仍舊沒有“嗖”一下就加載出來的感覺,想再優化一下,優化代碼什麽的已經到了極限。上周無意中看到了op

加速Android Studio編譯速度

strip roi cache code mage -i ide wid 著作權 一、修改運行內存 進入項目,菜單欄-help-Edit Custom VM Option Paste_Image.png 添加或修改為: -Xms

Android系統開機慢的問題(升級後第一開機慢)

系統開機慢的問題,採用User-Debug 的模式編譯,要編譯出來ODEX 來優化這個開機時間 那第一開機的時候為什麼會慢呢,在網上百度找到了一個大牛對此的分析,我這裡貼出來 引用自:http://ticktick.blog.51cto.com/823160/1677216/ 在

Android 手機開機密碼破解鎖定

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 加快編譯時間

加速編譯時間的方法挺簡單,方法如下 1、在所有module的build.gradle中android{}內加入如下程式碼 android{ ... //-----加入的程式碼start------ tasks.whenTaskAdded { task ->

IDEA 出現 updating indices 卡進度條問題的解決方案並加快索引速度

    C:\Users\Administrator\.IntelliJIdea2017.3\system  刪除裡面的caches資料夾(這裡的 .IntelliJIdea2017.3 根據你自己的idea版本會有所不同) 然後開啟idea 右鍵你的目的地 這

Java8並行http請求加快訪問速度

背景 1.通常我們在獲取到一個list列表後需要一個挨著一個的進行遍歷處理資料,如果每次處理都需要長時間操作,那整個流程下來時間就是每一次處理時間的總和。 2.Java8的stream介面極大地減少了for迴圈寫法的複雜性,stream提供了map/reduce/collect等一系列

提高android gradle構建速度的努力

目前看, gradle命令列選項, 使用jack(想繞過class->dex這步), 以及取消lint, multi-dex, proguard(這三樣確實耗時, 但不是最關鍵的), 都不能顯著提供android-gradle-plugin的構建速度(assembleDebug為例),

二十五、索引:加快檢索速度的資料庫物件

                        

Android app開機廣播開啟app來電廣播

來電廣播檢測,是否為本公司員工,是本公司員工,提示為本公司誰誰誰,哪個部門。 為了開機不啟動app 也可以檢測來電廣播: 1、在靜態註冊廣播的時候 指定exported = true <!-- 註冊監聽手機狀態 --> &

Spring使用@Indexed加快啟動速度

Spring讀取@Conmpont元件(派生性),有兩種實現方式,一種是反射,一種是ASM。反射效能低主要是要loadClass,畢竟Class,需要Load,比如掃描”com.dongguabai”需要把所有的類load,效率太慢。 ASM相當於直接載入類的資源資訊,Re