日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

RK3288 开机时间和开机速度优化安卓系统优化

發(fā)布時間:2023/12/14 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RK3288 开机时间和开机速度优化安卓系统优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.dalvik.vm.heapstartsize=8m,改為=4M后重開機
光待機其況下你就會發(fā)現(xiàn)使用中內(nèi)存變少了,可用內(nèi)存變多了,雖然你在使用桌面小工具時候
可能不會比當初還要順,因為系統(tǒng)還在幫該程式劃分新的內(nèi)存空間,但也不至于頓

2.dalvik.vm.heapgrowthlimit=64m不用改,現(xiàn)在的app在前景中都吃很大內(nèi)存
若改小成32m,那假設(shè)程序內(nèi)存要吃到40m才會夠用,該程式可能就當給你看

3..dalvik.vm.heapsize=256m(單個虛擬機可分配的最大內(nèi)存256m),雖然是寫單個虛擬機,但系統(tǒng)到底會產(chǎn)生多少個虛擬機...我不確定,但唯一確定是不超過實際ram的可用量
記得S3雖然是配1G RAM,但實際上看到好像是780M吧(其他好像是GPU用掉了)
780/256=3...,大概就是3個虛擬機左右(應(yīng)該是這樣)
想要看到更多ram的人可以將256改為128m,重開機后...你會發(fā)現(xiàn)可用內(nèi)存又變多了...
但一樣,開啟新程式時候要再+128劃分新的虛擬機,速度可能慢一些,但不會頓,又可節(jié)省內(nèi)存的不必要浪費

1.想要裝很多widget小工具到桌面的,推薦
dalvik.vm.heapstartsize=5m
dalvik.vm.heapgrowthlimit=40m
dalvik.vm.heapsize=160m
也許開啟程式?jīng)]那么快,但比較不卡頓,且可用內(nèi)存會比較多


2.只要玩游戲、桌面很干凈很無聊的、不安裝其他widget小工具
dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=384m
加載大型程式或游戲比較快,缺點是可用內(nèi)存會比較小

此開機優(yōu)化為相對極限式的測試,沒有考慮功耗及穩(wěn)定性!僅作測試及優(yōu)化方向參考!當然也存在進一步優(yōu)化的空間待各位發(fā)現(xiàn)完善!

速度的優(yōu)化,很大程度是以提高CPU、DDR及EMMC的速率為基礎(chǔ)的。所以使用的較好物料及板子,優(yōu)化較為顯著!

此文檔主要是參考3288的《開機優(yōu)化說明》編寫的,針對3288 5.1公板測試。

第一部分:思路分析

開機時間包括四部分時間:

1.硬件響應(yīng)power按鍵時間

2.Uboot 初始化系統(tǒng)以及加載kernel image的時間

3.Kernel 啟動所需要的時間

4.Init 掛載文件系統(tǒng)以及Android系統(tǒng)啟動的時間

優(yōu)化思路:

1.針對影響響應(yīng)時間,探討最佳響應(yīng)時間,這個主要是考慮長短按的區(qū)別。

2.Uboot 去掉不必要的模塊,提高cpu,ddr的頻率、emmc跑在較高頻率來減少加載kernel image的時間,使用非ota固件減少kernel大小等。

3.把一些外圍設(shè)備的porbe函數(shù)中的一些初始化動作放到delay work中去做,減少kernel啟動時間,降低kernel中l(wèi)og的輸出等級等。

4.優(yōu)化Init 啟動流程,盡可能早啟動Android系統(tǒng)。

時間統(tǒng)計方法:

一、可以用serure CRT 設(shè)置:打印各部分的時間戳

各部分時間的確認:

3288 8846 sdk公板上目前啟動時間是11S-12S之間。

以下是uboot及kernel幾個log標志性信息:

  • 10:43:59:019:DDR Version 1.00 2015928_dbg

② 10:43:59:446:U-Boot 2014.10-RK3288-10-g45ba757-dirty (Mar 30 2016 - 08:49:46)

③ 10:44:00:499:Starting kernel ...

④ 10:44:00:969:[ ???0.000000]?Booting Linux on physical CPU 0x500

⑤ 10:44:05:029:[ ???1.136549] Freeing unused kernel memory: 352K (c0b7a000 - c0bd2000)

  • uboot部分:
  • uboot時間為分為兩部份

    ①~②為miniloader時間 ,此時間基本固定為400多ms?;

    ②~③可由u-boot編譯調(diào)整優(yōu)化,可控到1秒內(nèi)

  • kernel:
  • ③~④為kernel解壓縮時間,450ms左右與kernel.img包大小相關(guān),img越小,時間越短;

    ④~⑤可由kernel編譯調(diào)整優(yōu)化;

  • android部分(使用logcat -b events | grep boot 打印,④~⑤間的部份時間也包含在內(nèi))
  • I/boot_progress_start( ?182): 2233

    I/boot_progress_preload_start( ?182): 3308

    I/boot_progress_system_run( ?470): 3564

    I/boot_progress_pms_start( ?470): 4361

    I/boot_progress_pms_system_scan_start( ?470): 4481

    I/boot_progress_pms_data_scan_start( ?470): 6233

    I/boot_progress_pms_scan_end( ?470): 6243

    I/boot_progress_pms_ready( ?470): 6300

    I/boot_progress_preload_end( ?182): 6477

    I/boot_progress_ams_ready( ?470): 7065

    I/boot_progress_enable_screen( ?470): 8286

    8286 減去 2233基本為android所用時間

    第二部分:具體優(yōu)化

    開機速度與EMMC以及DDR的性能密切相關(guān)。EMMC最好能跑在HS200模式,125M(150M)以上;DDR要1G或者以上,頻率越高越好。

    POWER按鍵響應(yīng)時間

    這部分涉及硬件調(diào)整,暫不討論

    UBOOT時間優(yōu)化

    1.考慮提高uboot中cpu和ddr的頻率默認是(600M,300M),

    提高cpu頻率為1.2G 如不穩(wěn)定,請使用1G 關(guān)鍵字CONFIG_RKCLK_APLLB_FREQ_HIGH

    提高 ddr頻率為雙通528M,需使用補丁中的tools/rk_tools/bin/rk32/32_LPDDR2_200MHz_LPDDR3_200MHz_DDR3_200MHz_20150318.bin文件,請慎用!此bin不適用于早期3288 ic

    project u-boot/

    a/arch/arm/cpu/armv7/rk32xx/clock-rk3288.c b/arch/arm/cpu/armv7/rk32xx/clock-rk3288.c

    index b3ea333..066a00e 100755

    --- a/arch/arm/cpu/armv7/rk32xx/clock-rk3288.c

    +++ b/arch/arm/cpu/armv7/rk32xx/clock-rk3288.c

    @@ -14,6 +14,8 @@ DECLARE_GLOBAL_DATA_PTR;

    ?/* ARM/General/Codec pll freq config */

    ?#define CONFIG_RKCLK_APLL_FREQ 600 /* MHZ */

    +#define CONFIG_RKCLK_APLLB_FREQ_HIGH ???1200/* 1008*/ /* MHZ */

    +#define CONFIG_RKCLK_APLLL_FREQ_HIGH ???816 /* MHZ */

    ?#ifdef CONFIG_PRODUCT_BOX

    ?#define CONFIG_RKCLK_GPLL_FREQ 300 /* MHZ */

    @@ -151,6 +153,10 @@ struct pll_data {

    ?/* apll clock table, should be from high to low */

    ?static struct pll_clk_set apll_clks[] = {

    ? //rate, nr, nf, no, a12_div, mp_div, m0_div, l2, atclk, pclk_dbg

    + /*_APLL_SET_CLKS(1608000,1, 67, 1, ???????1, 4, 2, ???????????????2, 4, 4),

    + _APLL_SET_CLKS(1512000,1, 63, 1, ???????1, 4, 2, ???????????????2, 4, 4),

    + _APLL_SET_CLKS(1416000,1, 59, 1, ???????1, 4, 2, ???????????????2, 4, 4),*/

    + _APLL_SET_CLKS(1200000,1, 50, 1, ???????1, 4, 2, ???????????????2, 4, 4),

    ? _APLL_SET_CLKS(1008000,1, 84, 2, 1, 4, 2, 2, 4, 4),

    ? _APLL_SET_CLKS(816000, 1, 68, 2, 1, 4, 2, 2, 4, 4),

    ? _APLL_SET_CLKS(600000, 1, 50, 2, 1, 4, 2, 2, 4, 4),

    @@ -747,6 +753,12 @@ void rkclk_set_pll(void)

    ? rkclk_pll_set_rate(CPLL_ID, CONFIG_RKCLK_CPLL_FREQ, NULL);

    ?}

    +void rkclk_set_pll_high(void)

    +{

    + ??????rkclk_pll_set_rate(APLL_ID, CONFIG_RKCLK_APLLB_FREQ_HIGH, rkclk_apll_cb);

    + // rkclk_pll_set_rate(APLLB_ID, CONFIG_RKCLK_APLLB_FREQ_HIGH, rkclk_apllb_cb);

    + ??????// rkclk_pll_set_rate(APLLL_ID, CONFIG_RKCLK_APLLL_FREQ_HIGH, rkclk_aplll_cb);

    +}

    ?/*

    ??* rkplat clock get pll rate by id

    diff --git a/board/rockchip/rk32xx/rk32xx.c b/board/rockchip/rk32xx/rk32xx.c

    index fbef345..6d05abc 100755

    --- a/board/rockchip/rk32xx/rk32xx.c

    +++ b/board/rockchip/rk32xx/rk32xx.c

    @@ -191,7 +191,9 @@ int board_late_init(void)

    ? debug("fg_init\n");

    ? fg_init(0); /*fuel gauge init*/

    ?#endif

    -

    + ??????rkclk_set_pll_high();

    + ??????rkclk_get_pll(); ??//如下兩句修改是為了打印需要,實際量產(chǎn)可以去掉

    + ??????rkclk_dump_pll();

    ? debug("idb init\n");

    ? //TODO:set those buffers in a better way, and use malloc?

    ? rkidb_setup_space(gd->arch.rk_global_buf_addr);

    注:

    + ??????rkclk_get_pll(); ??

    + ??????rkclk_dump_pll();

    這兩句只為查看重設(shè)后的頻率,不是必需的,去除后可加縮點時間。

    另外,頻率設(shè)太高,機器啟動不了。

  • 考慮提高nand/emmc的頻率,特別是EMMC的機器,uboot中有引入emmc的DDR模式,但是默認沒有開啟。
  • 開啟ddr模式的方法:

    diff --git a/include/configs/rk32plat.h b/include/configs/rk32plat.h

    index baadd45..2339635 100755

    --- a/include/configs/rk32plat.h

    +++ b/include/configs/rk32plat.h

    @@ -51,7 +51,7 @@

    ?/* mmc using dma */

    ?#define CONFIG_RK_MMC_DMA

    ?#define CONFIG_RK_MMC_IDMAC /* internal dmac */

    -#undef CONFIG_RK_MMC_DDR_MODE /* mmc using ddr mode */

    +#define CONFIG_RK_MMC_DDR_MODE /* mmc using ddr mode */

    ?/* more config for rockusb */

    ?#ifdef CONFIG_CMD_ROCKUSB

  • 把uboot作為一級loader,不用兩級loader。
  • 這部份沒在3288此次修改上使用,可自行參考3128的試試

    ???diff --git a/configs/rk3128_uart0_defconfig b/configs/rk3128_uart0_defconfig

    index 2f39f40..bc963a1 100644

    --- a/configs/rk3128_uart0_defconfig

    +++ b/configs/rk3128_uart0_defconfig

    @@ -1,4 +1,4 @@

    -CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK3128,SECOND_LEVEL_BOOTLOADER,UART_NUM=UART_CH0"

    +CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK3128,UART_NUM=UART_CH0"

    ?CONFIG_ARM=y

    ?CONFIG_ROCKCHIP_ARCH32=y

    ?CONFIG_PLAT_RK30XX=y

  • RK3128等低端芯片,kernel不要使用ZImage,建議使用Image,需配合kernel修改。
  • 這部份沒在3288此次修改上使用

    5.uboot中默認會去dts中遍歷平臺能支持的所有pmic,如果單個項目pmic固定,可以不去遍歷,這樣也能節(jié)省時間。如:(只留下ACT8846

    diff --git a/include/configs/rk32plat.h b/include/configs/rk32plat.h

    index baadd45..2339635 100755

    --- a/include/configs/rk32plat.h

    +++ b/include/configs/rk32plat.h

    @@ -176,9 +176,9 @@

    ?/********************************** charger and pmic driver ********************************/

    ?#undef CONFIG_POWER_RK_SAMPLE

    -#define CONFIG_POWER_RICOH619

    -#define CONFIG_POWER_RK808

    -#define CONFIG_POWER_RK818

    +#undef CONFIG_POWER_RICOH619

    +#undef CONFIG_POWER_RK808

    +#undef CONFIG_POWER_RK818

    ?#define CONFIG_POWER_ACT8846

    KERNEL部分優(yōu)化

  • 可以在parameter中加入initcall_debug來看那些驅(qū)動的probe占用太長時間。
  • 驅(qū)動中的probe函數(shù)中如果有msleep或mdelay操作,耗時比較長的并且不需要上電就處理的,移植到工作隊列中去。比如把tp下載固件的過程移植到工作隊列中:

    ts->initwq = create_singlethread_workqueue("kworkqueue_initts");

    if (!ts->initwq) {

    dev_err(&client->dev, "Could not create initworkqueue\n");

    }

    INIT_WORK(&ts->initwork, gsl_ts_init_worker);

    queue_work(ts->initwq, &ts->initwork);

  • 同時可以考慮降低LOG的輸出級別,
  • 在parameter中添加CMDLINE:console=ttyFIQ0 androidboot.console=ttyFIQ0 ?loglevel=0 init

    3.提高emmc的速率及使用HS200模式(物料及機器較好的可試試使用150M,nand flash無法作此優(yōu)化)

    diff --git a/arch/arm/boot/dts/rk3288-tb_8846.dts b/arch/arm/boot/dts/rk3288-tb_8846.dts

    index 230a75d..abf2fbc4 100755

    --- a/arch/arm/boot/dts/rk3288-tb_8846.dts

    +++ b/arch/arm/boot/dts/rk3288-tb_8846.dts

    @@ -271,8 +272,8 @@

    ?};

    ?&emmc {

    - clock-frequency = <100000000>;

    - clock-freq-min-max = <400000 100000000>;

    + clock-frequency = <125000000>;

    + clock-freq-min-max = <400000 125000000>;

    ?????????supports-highspeed;

    ? supports-emmc;

    @@ -280,7 +281,7 @@

    ? bootpart-no-access;

    ? //supports-DDR_MODE; //you should set the two value in your project. only close in RK3288-SDK board.

    - //caps2-mmc-hs200;

    + caps2-mmc-hs200;

    ?????????ignore-pm-notify;

    ? keep-power-in-suspend;

    4.去除其它不必要的加載:

    diff --git a/arch/arm/boot/dts/rk3288-tb_8846.dts b/arch/arm/boot/dts/rk3288-tb_8846.dts

    index 230a75d..abf2fbc4 100755

    @@ -400,11 +401,11 @@

    ? status = "okay";

    ? rk808: rk808@1b {

    ? reg = <0x1b>;

    - status = "okay";

    + status = "disabled";

    ? };

    ? rk818: rk818@1c {

    ? reg = <0x1c>;

    - status = "okay";

    + status = "disabled";

    ?? };

    ? syr827: syr827@40 {

    ? compatible = "silergy,syr82x";

    @@ -463,21 +464,21 @@

    ? ricoh619: ricoh619@32 {

    ? reg = <0x32>;

    - status = "okay";

    + status = "disabled";

    ?? };

    ? bq24296: bq24296@6b {

    ? compatible = "ti,bq24296";

    ? reg = <0x6b>;

    ? gpios = <&gpio0 GPIO_A7 GPIO_ACTIVE_HIGH>,<&gpio0 GPIO_B0 GPIO_ACTIVE_HIGH>;

    ? bq24296,chg_current = <1000 2000 3000>;

    - status = "okay";

    + status = "disabled";

    ? };

    ? bq27320: bq27320@55 {

    ? compatible = "ti,bq27320";

    ? reg = <0x55>;

    ? /* ??gpios = <&gpio0 GPIO_A7 GPIO_ACTIVE_HIGH>; */

    - status = "okay";

    + status = "disabled";

    ? };

    ? CW2015@62 {

    @@ -579,7 +580,7 @@

    ?};

    ?&i2c3 {

    - status = "okay";

    + status = "disabled";

    ?};

    @@ -933,7 +934,7 @@

    ? };

    ?};

    -

    +/*

    ?/include/ "rk808.dtsi"

    ?&rk808 {

    ? gpios =<&gpio0 GPIO_A4 GPIO_ACTIVE_HIGH>,<&gpio0 GPIO_B3 GPIO_ACTIVE_LOW>;

    @@ -1046,7 +1047,7 @@

    ? };

    ? };

    ?};

    -

    +*/

    ?&lcdc_vdd_domain {

    ? regulator-name = "vcc30_lcd";

    ? };

    @@ -1085,6 +1086,6 @@

    ?};

    ?&rk3288_cif_sensor{

    - status = "okay";

    + status = "disabled";

    ?};

    5.為試極致,DDR定頻533不變頻:(產(chǎn)品時不建議修改)

    @@ -785,22 +786,22 @@

    ?&clk_ddr_dvfs_table {

    ? operating-points = <

    ? /* KHz ???uV */

    - 200000 1050000

    +/* 200000 1050000

    ? 300000 1050000

    - 400000 1100000

    + 400000 1100000*/

    ? 533000 1150000

    ? >;

    ? freq-table = <

    ? /*status freq(KHz)*/

    - SYS_STATUS_NORMAL 400000

    - SYS_STATUS_SUSPEND 200000

    + SYS_STATUS_NORMAL 533000

    + /*SYS_STATUS_SUSPEND 200000

    ? SYS_STATUS_VIDEO_1080P ?240000

    ? SYS_STATUS_VIDEO_4K ????400000

    ? SYS_STATUS_PERFORMANCE ?528000

    ? SYS_STATUS_DUALVIEW 400000

    - SYS_STATUS_BOOST 324000

    - SYS_STATUS_ISP 400000

    + SYS_STATUS_BOOST 533000

    + SYS_STATUS_ISP 400000*/

    ? >;

    ? bd-freq-table = <

    ? /* bandwidth ??freq */

    @@ -811,11 +812,11 @@

    ? >;

    ? auto-freq-table = <

    ? 240000

    - 324000

    - 396000

    +/* 324000

    + 396000*/

    ? 528000

    ? >;

    - auto-freq=<1>;

    + auto-freq=<0>;

    ? status="okay";

    ?};

    ?/include/ "act8846.dtsi"

    6.rockchip,loader-logo-on = <0>;也可加快點

    ANDROID部分優(yōu)化

    system/core/優(yōu)化:

    提頻及去除selinux處理

    project system/core/

    diff --git a/init/Android.mk b/init/Android.mk

    index b1fb135..4f25df7 100644

    --- a/init/Android.mk

    +++ b/init/Android.mk

    @@ -24,7 +24,7 @@ LOCAL_SRC_FILES += bootchart.c

    ?LOCAL_CFLAGS ???+= -DBOOTCHART=1

    ?endif

    -ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))

    +ifneq (,$(filter userdebug eng user,$(TARGET_BUILD_VARIANT)))

    ?LOCAL_CFLAGS += -DALLOW_LOCAL_PROP_OVERRIDE=1 -DALLOW_DISABLE_SELINUX=1

    ?endif

    diff --git a/init/init.c b/init/init.c

    index 5bfa753..fca0dc9 100644

    --- a/init/init.c

    +++ b/init/init.c

    @@ -1124,7 +1124,7 @@ static void rk_3288_set_cpu(void)

    ?{

    ?????int fd;

    ?????char buf[128];

    - ???char value[16]={"1416000"};

    + ???char value[16]={"1608000"};//1416000

    ?????char min_freq[16]={"126000"};//126M

    ?????bool can_set_cpu = false;

    diff --git a/init/util.c b/init/util.c

    index 12cb11d..2fd6502 100644

    --- a/init/util.c

    +++ b/init/util.c

    @@ -532,5 +532,9 @@ int restorecon(const char* pathname)

    ?int restorecon_recursive(const char* pathname)

    ?{

    + if (is_selinux_enabled() <= 0 || !sehandle)

    + {

    + return 0;

    + }

    ?????return selinux_android_restorecon(pathname, SELINUX_ANDROID_RESTORECON_RECURSE);

    ?}

    \RK3288_ANDROID5.1-SDK_V1.00_20150515\RKTools\windows\AndroidTool\rockdev\rk3288-3.10-uboot.parameter.txt

    FIRMWARE_VER:5.0.0

    MACHINE_MODEL:rk3288

    MACHINE_ID:007

    MANUFACTURER:RK3288

    MAGIC: 0x5041524B

    ATAG: 0x60000800

    MACHINE: 3288

    CHECK_MASK: 0x80

    PWR_HLD: 0,0,A,0,1

    #KERNEL_IMG: 0x62008000

    #FDT_NAME: rk-kernel.dtb

    #RECOVER_KEY: 1,1,0,20,0

    CMDLINE:console=ttyFIQ0 androidboot.selinux=disabled?androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00008000@0x0000e000(kernel),0x00010000@0x00016000(boot),0x00010000@0x00026000(recovery),0x0001a000@0x00036000(backup),0x00040000@0x00050000(cache),0x00002000@0x00090000(kpanic),0x00300000@0x00092000(system),0x00008000@0x00392000(metadata),0x00200000@0x0039A000(userdata),0x00020000@0x0059A000(radical_update),-@0x005BA000(user)

    # in section; per section 512(0x200) bytes

    #CMDLINE:console=ttyFIQ0 androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00008000@0x0000e000(kernel),0x00010000@0x00016000(boot),0x00010000@0x00026000(recovery),0x0001a000@0x00036000(backup),0x00040000@0x00050000(cache),0x00002000@0x00090000(kpanic),0x00100000@0x00092000(system),0x00008000@0x00192000(metadata),0x00020000@0x0039A000(radical_update),-@0x003BA000(userdata)

    刪減部分APK (只留下setting Search Downloads Face Search)

    取消safe mode的檢測,會等待1s的時間

    project frameworks/base/

    diff --git a/multiwindow/multiwindowcore.jar b/multiwindow/multiwindowcore.jar

    index a4025cb..98b1840 100755

    Binary files a/multiwindow/multiwindowcore.jar and b/multiwindow/multiwindowcore.jar differ

    diff --git a/multiwindow/multiwindowpolicy.jar b/multiwindow/multiwindowpolicy.jar

    index ef88dd9..5c6ce2f 100755

    Binary files a/multiwindow/multiwindowpolicy.jar and b/multiwindow/multiwindowpolicy.jar differ

    diff --git a/multiwindow/multiwindowservice.jar b/multiwindow/multiwindowservice.jar

    index b88375b..2319428 100755

    Binary files a/multiwindow/multiwindowservice.jar and b/multiwindow/multiwindowservice.jar differ

    diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java

    index e254727..32af376 100755

    --- a/services/core/java/com/android/server/am/ActivityManagerService.java

    +++ b/services/core/java/com/android/server/am/ActivityManagerService.java

    @@ -11556,15 +11556,8 @@ Intent.CATEGORY_LAUNCHER) */&& startFlags==0){

    ?????????}

    ?????????//if (goingCallback != null) goingCallback.run();

    - ???????new Thread("goingCallback thread") {

    - ???????????????@Override

    - ???????????????public void run() {

    - ??????????????if (goingCallback != null)

    - ???????????????????goingCallback.run();

    - ???????????????}

    - ???????}.run();

    -

    -

    + ????if (goingCallback != null)

    + ?????????mHandler.post(goingCallback);

    ?????????mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,

    diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java

    index b4c2117..a8c5570 100644

    --- a/services/java/com/android/server/SystemServer.java

    +++ b/services/java/com/android/server/SystemServer.java

    @@ -993,7 +993,7 @@ public final class SystemServer {

    ?????????// Before things start rolling, be sure we have decided whether

    ?????????// we are in safe mode.

    - ???????final boolean safeMode = wm.detectSafeMode();

    + ???????final boolean safeMode = false;//wm.detectSafeMode();

    ?????????if (safeMode) {

    ?????????????mActivityManagerService.enterSafeMode();

    ?????????????// Disable the JIT for the system_server process

    ZygoteInit處理

    project frameworks/base/

    diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java

    index ddb0ed1..bf5ead3 100755

    --- a/core/java/com/android/internal/os/ZygoteInit.java

    +++ b/core/java/com/android/internal/os/ZygoteInit.java

    @@ -275,7 +275,7 @@ public class ZygoteInit {

    ? }

    ?????static void preload() {

    - ???????Log.d(TAG, "begin preload");

    + ???????/*Log.d(TAG, "begin preload");

    ?????????preloadClasses();

    ?????????preloadResources();

    ?????????preloadOpenGL();

    @@ -283,7 +283,7 @@ public class ZygoteInit {

    ?????????// Ask the WebViewFactory to do any initialization that must run in the zygote process,

    ?????????// for memory sharing purposes.

    ?????????WebViewFactory.prepareWebViewInZygote();

    - ???????Log.d(TAG, "end preload");

    + ???????Log.d(TAG, "end preload");*/

    ?????????/*mPreloadThread.setPriority(2);

    ?????????mPreloadThread.start();

    媒體庫處理:

    project frameworks/av/

    diff --git a/media/libmedia/MediaProfiles.cpp b/media/libmedia/MediaProfiles.cpp

    index 7ec32d2..99bf271 100755

    --- a/media/libmedia/MediaProfiles.cpp

    +++ b/media/libmedia/MediaProfiles.cpp

    @@ -31,7 +31,7 @@

    ?namespace android {

    ?Mutex MediaProfiles::sLock;

    -bool MediaProfiles::sIsInitialized = false;

    +bool MediaProfiles::sIsInitialized = true;

    ?MediaProfiles *MediaProfiles::sInstance = NULL;

    ?const MediaProfiles::NameToTagMap MediaProfiles::sVideoEncoderNameMap[] = {

    使用小UI:

    project device/rockchip/common/

    diff --git a/device.mk b/device.mk

    index d522866..2b48360 100755

    --- a/device.mk

    +++ b/device.mk

    @@ -20,9 +20,10 @@ $(shell python $(LOCAL_PATH)/auto_generator.py $(TARGET_PRODUCT) preinstall_del)

    ?$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)

    -PRODUCT_AAPT_CONFIG ?= normal large xlarge hdpi xhdpi xxhdpi

    -PRODUCT_AAPT_PREF_CONFIG ?= xhdpi

    -

    +#PRODUCT_AAPT_CONFIG ?= normal large xlarge hdpi xhdpi xxhdpi

    +#PRODUCT_AAPT_PREF_CONFIG ?= xhdpi

    +PRODUCT_AAPT_CONFIG ?= normal hdpi

    +PRODUCT_AAPT_PREF_CONFIG ?= hdpi

    裁剪加載類
    ./frameworks/base/preloaded-classes 少加載會影響 App 啟動速度 , 此地優(yōu)化空間不大
    ./frameworks/base/core/res/ 會被打包成 framework-res.apk,確保沒有冗余的資源圖片,可以挨個檢查圖片、XML是否在系統(tǒng)中有用到;

    二 Build 預(yù)提取 odex
    通常手機升級后會顯示 正在優(yōu)化第*個應(yīng)用,總共 * 個應(yīng)用 這個就是在對 APK 做 dexopt 的優(yōu)化。

    odex 是 APK 中提取出來的可運行文件.
    APK 中的 class.dex 會在 dex 優(yōu)化過程眾被轉(zhuǎn)化為 odex 文件存放.

    正常的開機過程中 , 系統(tǒng)需要在開機過程中從 APK 提取 dex 再運行.
    所以我們可以在 Build 過程中預(yù)先提取 dex 將其優(yōu)化為 odex , 進而達到加快啟動速度的目的.

    2.1 對于內(nèi)置 SourceCode 的 APK
    在Android.mk中都會通過include $(BUILD_PACKAGE)來編譯,會調(diào)用到package.mk來提取 odex.

    2.2 對于通過 prebuilt 方式內(nèi)置的 APK
    通過 prebuilt 方式預(yù)置的 APK , 默認不會被提取 odex.

    2.3 設(shè)置方法
    2.3.1 對于 App 的Android.mk

    LOCAL_DEX_PREOPT := false
    1
    如果設(shè)置為 false 可以使整個系統(tǒng)使用提前優(yōu)化的時候,某個app不使用提前優(yōu)化。
    如果設(shè)置為 true 則編譯生成的文件有 oat 文件, 即在 build 過程中被提前優(yōu)化.

    2.3.2 對于 system.img 如果設(shè)置了:

    WITH_DEXPREOPT := true
    1
    打開這個宏之后,無論是有源碼還是無源碼的預(yù)置apk預(yù)編譯時都會提取odex文件。
    如有發(fā)現(xiàn)user版本未提取odex,請檢查device.mk文件配置:

    ? ?ifeq ($(TARGET_BUILD_VARIANT),user)
    ? ? ? ?WITH_DEXPREOPT := true
    ? ? ? ?DONT_DEXPREOPT_PREBUILTS := true ?//此句注釋掉
    ? ?endif?
    1
    2
    3
    4
    對于64bit的芯片,若apk只有32bit的lib或者只能作為32bit運行,請在預(yù)置apk時在android.mk中添加下邊的TAG標記此apk為32bit:

    LOCAL_MULTILIB :=32
    1
    但是這個會導(dǎo)致 system.img 中的所有東西都被 pre-optimized , 即 system.img 會變得很大. 此時可能需要調(diào)大 system.img 的大小限制.
    在編譯的時候,/system/framework/ 目錄下面的jar包,和 /system/app,/system/priv-app/,/system/vendor/app 下面的apk文件,都會在編譯時,做odex優(yōu)化。

    2.3.3 對于 jar 包 , 如果不想jar包做odex優(yōu)化,可以在/buid/core/java_library.mk文件中設(shè)置:

    LOCAL_DEX_PREOPT := false
    1
    這樣在編譯時,jar包就不會做odex優(yōu)化。

    三 開機動畫
    bootanimation 時間
    1. 最好不要超過 system_server 啟動時間 (11s) ( 63385.657304 : Android:SysServerInit_START 到 Android:SysServerInit_END)
    2. 不要播放 mp3
    3. bootanimation.zip 圖片越少越好

    四 無用的服務(wù)
    /frameworks/base/services/java/com/android/server/SystemServer.java
    比如:DropBoxManagerService和調(diào)試相關(guān),可以異步加載或者直接閹割掉;
    比如:PinnerService沒有配置相關(guān)則可以去除;
    其他Service可以挨個排查.
    非必要的服務(wù)可以放在 system_server 進程外啟動.

    五 App 的優(yōu)化
    5.1 App 本身優(yōu)化
    盡量少把APP設(shè)置為persist;
    優(yōu)化每一個有源碼的persist APP;使他們啟動盡可能快;

    com.android.systemui(PersistAP)
    com.mediatek.ims(PersistAP)
    com.android.phone(PersistAP)
    com.android.settings
    1
    2
    3
    4
    精簡apk包;
    (1)刪除沒有用到的,圖片、資源文件、沒有用到的jar包文件、不需要使用的so文件;
    (2)預(yù)置自己的APP,假如設(shè)備只會加載drawable-xxhdpi中的資源,那么可以在drawable包重復(fù)的資源可以直接刪除;
    (3)預(yù)置自己的APP,假如設(shè)置只支持英文,values-da、values-fa這樣的多語言支持資源都可以刪除;
    (4)apk中只保留和系統(tǒng)適配的so文件,比如:armv7和arm64的so文件;

    Application的onCreate方法中不要有耗時的代碼段;

    通過修改–compiler-filter 為 speed、quick、speed-profile來提高 APK 的啟動速度;
    speed 模式優(yōu)化的類較多,這時優(yōu)化后的vdex、odex的文件較大,應(yīng)用啟動過程包括映射apk文件的過程,文件偏大導(dǎo)致有一定的時間損耗;
    但 speed 模式優(yōu)化后,Java類執(zhí)行更快;所以這個需要針對具體的應(yīng)用多次驗證,沒有普適性;

    5.2 系統(tǒng) App 裁剪
    PackageManagerService
    scanDirTracedLI
    (1)減少預(yù)置APP的數(shù)量(對開機速度會有較為明顯的提升);
    (2)刪除沒有必要的apk包;
    (3)單線程scan分區(qū)里面的apk并不一定能充分使用IO資源,嘗試改為多線程異步scan;
    (4)精簡系統(tǒng),把系統(tǒng)中用不到的apk包、有重復(fù)功能的apk移除,這樣既可以使系統(tǒng)有更大的剩余存儲空間又可以減少scan的時間,加快開機;

    總結(jié)

    以上是生活随笔為你收集整理的RK3288 开机时间和开机速度优化安卓系统优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。