RK3288 开机时间和开机速度优化安卓系统优化
1.dalvik.vm.heapstartsize=8m,改為=4M后重開機
光待機其況下你就會發(fā)現使用中內存變少了,可用內存變多了,雖然你在使用桌面小工具時候
可能不會比當初還要順,因為系統還在幫該程式劃分新的內存空間,但也不至于頓
2.dalvik.vm.heapgrowthlimit=64m不用改,現在的app在前景中都吃很大內存
若改小成32m,那假設程序內存要吃到40m才會夠用,該程式可能就當給你看
3..dalvik.vm.heapsize=256m(單個虛擬機可分配的最大內存256m),雖然是寫單個虛擬機,但系統到底會產生多少個虛擬機...我不確定,但唯一確定是不超過實際ram的可用量
記得S3雖然是配1G RAM,但實際上看到好像是780M吧(其他好像是GPU用掉了)
780/256=3...,大概就是3個虛擬機左右(應該是這樣)
想要看到更多ram的人可以將256改為128m,重開機后...你會發(fā)現可用內存又變多了...
但一樣,開啟新程式時候要再+128劃分新的虛擬機,速度可能慢一些,但不會頓,又可節(jié)省內存的不必要浪費
1.想要裝很多widget小工具到桌面的,推薦
dalvik.vm.heapstartsize=5m
dalvik.vm.heapgrowthlimit=40m
dalvik.vm.heapsize=160m
也許開啟程式沒那么快,但比較不卡頓,且可用內存會比較多
2.只要玩游戲、桌面很干凈很無聊的、不安裝其他widget小工具
dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=384m
加載大型程式或游戲比較快,缺點是可用內存會比較小
此開機優(yōu)化為相對極限式的測試,沒有考慮功耗及穩(wěn)定性!僅作測試及優(yōu)化方向參考!當然也存在進一步優(yōu)化的空間待各位發(fā)現完善!
速度的優(yōu)化,很大程度是以提高CPU、DDR及EMMC的速率為基礎的。所以使用的較好物料及板子,優(yōu)化較為顯著!
此文檔主要是參考3288的《開機優(yōu)化說明》編寫的,針對3288 5.1公板測試。
第一部分:思路分析
開機時間包括四部分時間:
1.硬件響應power按鍵時間
2.Uboot 初始化系統以及加載kernel image的時間
3.Kernel 啟動所需要的時間
4.Init 掛載文件系統以及Android系統啟動的時間
優(yōu)化思路:
1.針對影響響應時間,探討最佳響應時間,這個主要是考慮長短按的區(qū)別。
2.Uboot 去掉不必要的模塊,提高cpu,ddr的頻率、emmc跑在較高頻率來減少加載kernel image的時間,使用非ota固件減少kernel大小等。
3.把一些外圍設備的porbe函數中的一些初始化動作放到delay work中去做,減少kernel啟動時間,降低kernel中l(wèi)og的輸出等級等。
4.優(yōu)化Init 啟動流程,盡可能早啟動Android系統。
時間統計方法:
一、可以用serure CRT 設置:打印各部分的時間戳
各部分時間的確認:
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時間為分為兩部份
①~②為miniloader時間 ,此時間基本固定為400多ms?;
②~③可由u-boot編譯調整優(yōu)化,可控到1秒內;
③~④為kernel解壓縮時間,450ms左右與kernel.img包大小相關,img越小,時間越短;
④~⑤可由kernel編譯調整優(yōu)化;
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的性能密切相關。EMMC最好能跑在HS200模式,125M(150M)以上;DDR要1G或者以上,頻率越高越好。
POWER按鍵響應時間
這部分涉及硬件調整,暫不討論
UBOOT時間優(yōu)化
1.考慮提高uboot中cpu和ddr的頻率默認是(600M,300M),
提高cpu頻率為1.2G 如不穩(wěn)定,請使用1G 關鍵字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(); ??//如下兩句修改是為了打印需要,實際量產可以去掉
+ ??????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();
這兩句只為查看重設后的頻率,不是必需的,去除后可加縮點時間。
另外,頻率設太高,機器啟動不了。
開啟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
(這部份沒在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
(這部份沒在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)化
驅動中的probe函數中如果有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);
在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不變頻:(產品時不建議修改)
@@ -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是否在系統中有用到;
二 Build 預提取 odex
通常手機升級后會顯示 正在優(yōu)化第*個應用,總共 * 個應用 這個就是在對 APK 做 dexopt 的優(yōu)化。
odex 是 APK 中提取出來的可運行文件.
APK 中的 class.dex 會在 dex 優(yōu)化過程眾被轉化為 odex 文件存放.
正常的開機過程中 , 系統需要在開機過程中從 APK 提取 dex 再運行.
所以我們可以在 Build 過程中預先提取 dex 將其優(yōu)化為 odex , 進而達到加快啟動速度的目的.
2.1 對于內置 SourceCode 的 APK
在Android.mk中都會通過include $(BUILD_PACKAGE)來編譯,會調用到package.mk來提取 odex.
2.2 對于通過 prebuilt 方式內置的 APK
通過 prebuilt 方式預置的 APK , 默認不會被提取 odex.
2.3 設置方法
2.3.1 對于 App 的Android.mk
LOCAL_DEX_PREOPT := false
1
如果設置為 false 可以使整個系統使用提前優(yōu)化的時候,某個app不使用提前優(yōu)化。
如果設置為 true 則編譯生成的文件有 oat 文件, 即在 build 過程中被提前優(yōu)化.
2.3.2 對于 system.img 如果設置了:
WITH_DEXPREOPT := true
1
打開這個宏之后,無論是有源碼還是無源碼的預置apk預編譯時都會提取odex文件。
如有發(fā)現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運行,請在預置apk時在android.mk中添加下邊的TAG標記此apk為32bit:
LOCAL_MULTILIB :=32
1
但是這個會導致 system.img 中的所有東西都被 pre-optimized , 即 system.img 會變得很大. 此時可能需要調大 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文件中設置:
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 圖片越少越好
四 無用的服務
/frameworks/base/services/java/com/android/server/SystemServer.java
比如:DropBoxManagerService和調試相關,可以異步加載或者直接閹割掉;
比如:PinnerService沒有配置相關則可以去除;
其他Service可以挨個排查.
非必要的服務可以放在 system_server 進程外啟動.
五 App 的優(yōu)化
5.1 App 本身優(yōu)化
盡量少把APP設置為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)預置自己的APP,假如設備只會加載drawable-xxhdpi中的資源,那么可以在drawable包重復的資源可以直接刪除;
(3)預置自己的APP,假如設置只支持英文,values-da、values-fa這樣的多語言支持資源都可以刪除;
(4)apk中只保留和系統適配的so文件,比如:armv7和arm64的so文件;
Application的onCreate方法中不要有耗時的代碼段;
通過修改–compiler-filter 為 speed、quick、speed-profile來提高 APK 的啟動速度;
speed 模式優(yōu)化的類較多,這時優(yōu)化后的vdex、odex的文件較大,應用啟動過程包括映射apk文件的過程,文件偏大導致有一定的時間損耗;
但 speed 模式優(yōu)化后,Java類執(zhí)行更快;所以這個需要針對具體的應用多次驗證,沒有普適性;
5.2 系統 App 裁剪
PackageManagerService
scanDirTracedLI
(1)減少預置APP的數量(對開機速度會有較為明顯的提升);
(2)刪除沒有必要的apk包;
(3)單線程scan分區(qū)里面的apk并不一定能充分使用IO資源,嘗試改為多線程異步scan;
(4)精簡系統,把系統中用不到的apk包、有重復功能的apk移除,這樣既可以使系統有更大的剩余存儲空間又可以減少scan的時間,加快開機;
總結
以上是生活随笔為你收集整理的RK3288 开机时间和开机速度优化安卓系统优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (课程学习笔记)Excel学习
- 下一篇: P4408 [NOI2003] 逃学的小