in/busybox sh
ec()
{
/system/bin/busybox echo $* >/dev/console;
}
if [ -f /data/zygote.blcr ]; then
ec "***************load saved zygote********************"
/system/bin/cr_restart -f /data/zygote.blcr ;
else
ec "optimised by blcr"
ec "**************start a new zygote******************"
ec "you can contact the author through Email:shuaiwen@yahoo.com.cn"
ec "this is only an original demon version"
ec "release pid:$$."
/system/bin/cr_checkpoint
ec "release pid:$$."
/system/bin/cr_checkpoint
ec "release pid:$$."
/system/bin/app_process $*
fi
需要指出的是运行上面几个不带参数的cr_checkpoint目的为将后面的zygote的pid退后一些,以防下次checkpoint时候遇到pid冲突而导致checkpoint失败。
加入该功能后当系统首次启动会创建/data/zygote.blcr文件,由于需要checkpoint,导致比正常启动时间慢较多。后续只要该文件存在,系统就会跨过类加载过程,进而加快启动速度。
4 测试验证
下表列出了虚拟机加入blcr前和blcr后的10次的启动速度。
Emulator启动参数如下:
emulator.exe -kernel zImage -show-kernel -partition-size 200 -memory 200 -skindir ./skins -skin WQVGA432 -shell -sysdir ./ -data userdata.img -ramdisk ramdisk.img -system system.img -sdcard sdcard.img -sdcard sdcard.img
模式
启动时间(单位:秒)
采用blcr
42
43
42
36
42
41
42
38
39
43
正常启动
64
63
50
57
65
54
52
45
53
49
启用blcr后平均启动时间为41,相比正常启动平均时间55秒快了14秒。启动时间的改善是明显的。
参考1:http://osdir.com/ml/android-platform/2009-07/msg00276.html
附部分android.mk文件
cat ./libcr/Android.mk
# Copyright 2006 The Android Open Source Project
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SHARED_LIBRARIES += libc
lib_SOURCES = \
cr_omit.c
LOCAL_SRC_FILES:= $(lib_SOURCES)
LOCAL_C_INCLUDES := \
$(KERNEL_HEADERS) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../ \
$(LOCAL_PATH)/arch/arm/
LOCAL_CFLAGS := -DHAVE_CONFIG_H -DSHUAIWEN
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libcr_omit
include $(BUILD_SHARED_LIBRARY)
#libcr_run.so
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SHARED_LIBRARIES += libc
lib_SOURCES = \
cr_run.c
LOCAL_SRC_FILES:= $(lib_SOURCES)
LOCAL_C_INCLUDES := \
$(KERNEL_HEADERS) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../ \
$(LOCAL_PATH)/arch/arm/
LOCAL_CFLAGS := -DHAVE_CONFIG_H -DSHUAIWEN
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libcr_run
include $(BUILD_SHARED_LIBRARY)
#libcr
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SHARED_LIBRARIES += libc
lib_SOURCES = \
cr_async.c.arm \
cr_trace.c \
cr_core.c.arm \
cr_sig_sync.c.arm \
cr_cs.c.arm \
cr_pthread.c \
cr_strerror.c \
cr_request.c \
cr_syscall.c.arm \
cr_omit.c \
cr_run.c
LOCAL_SRC_FILES:= $(lib_SOURCES)
LOCAL_C_INCLUDES := \
$(KERNEL_HEADERS) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../ \
$(LOCAL_PATH)/arch/arm/
LOCAL_CFLAGS := -DHAVE_CONFIG_H -DSHUAIWEN -g
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libcr
include $(BUILD_SHARED_LIBRARY)
cat ./util/cr_restart/Android.mk
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SHARED_LIBRARIES += libc
LOCAL_SHARED_LIBRARIES += libcr_run
LOCAL_SHARED_LIBRARIES += libcr
LOCAL_SRC_FILES:=cr_restart.c
LOCAL_C_INCLUDES := \
$(