设为首页 加入收藏

TOP

利用BLCR加快Android的启动过程(二)
2014-11-24 07:48:44 来源: 作者: 【 】 浏览:1
Tags:利用 BLCR 加快 Android 启动 过程
oint("/data/zygote.blcr");


registerZygoteSocket();


其中CheckPoint 类是c扩展的java调用接口,通过jni调用checkpoint库函数实现checkpoint动作,下文列出了jni部分内容。该部分仅为一个参考模板,产品化过程应该做更多异常处理和合理化调整工作。


android_blcr_checkpoint.cpp


#define LOG_TAG "BLCR"


namespace android {


static int my_callback(void* arg)


{


int rc;


LOGV(__FUNCTION__);


rc = cr_checkpoint(0);


return 0;


}


static void checkPoint(JNIEnv* env, jobject object,jstring file) {


LOGV(__FUNCTION__);


pid_t my_pid;


int rc,fd;


struct stat s;


cr_checkpoint_handle_t my_handle;


cr_callback_id_t cb_id;


FILE *f;


const jchar* str = env->GetStringCritical(file, 0);


String8 filename;


if (str) {


filename = String8(str, env->GetStringLength(file));


env->ReleaseStringCritical(file, str);


}


else {


LOGE("checkPoint,file name is null");


return;


}


LOGI("checkPoint,filename=%s",filename);


//does the file exist


f = fopen(filename, "r");


if(f==NULL) //create and save checkpoint to it.


{


my_pid = cr_init();


if(my_pid<0)


{


LOGE("cr_init failed,return:%d",my_pid);


return;


}


cb_id = cr_register_callback(my_callback, NULL, CR_SIGNAL_CONTEXT);


if (cb_id < 0)


{


LOGV("cr_register_callback() unexpectedly returned %d\n", cb_id);


return;


}


else


{


LOGV("cr_register_callback() correctly returned %d\n", cb_id);


}



/* Request a checkpoint of ourself */


fd = crut_checkpoint_request(&my_handle, filename);


if (fd < 0)


{


LOGE("crut_checkpoint_request() unexpectedly returned 0x%x\n", fd);


return ;


}


rc = stat(filename, &s);


if (rc) {


LOGE("stat() unexpectedly returned %d\n", rc);


return;


} else {


LOGV("stat(context.%d) correctly returned 0\n", my_pid);


}


if (s.st_size == 0) {


LOGE("context file unexpectedly empty\n");


return;


} else {


LOGV("context.%d is non-empty\n", my_pid);


}


/* Reap the checkpoint request */


rc = crut_checkpoint_wait(&my_handle, fd);


if (rc < 0) {


LOGE("crut_checkpoint_wait() #1 unexpectedly returned 0x%x\n", rc);


return;


} }}


/*


* JNI registration.


*/


static JNINativeMethod gMethods[] = {


/* name, signature, funcPtr */


{"checkPoint", "(Ljava/lang/String;)V", (void *)checkPoint},


};



int register_android_blcr_checkpoint(JNIEnv* env)


{


return jniRegisterNativeMethods(env, "android/blcr/CheckPoint",


gMethods, NELEM(gMethods));


}


}


为了正常使用上面的jni接口,需要把注册函数注册到frameworks/base/core/jni/ AndroidRuntime.cpp,在gRegJNI[]中加入REG_JNI(register_android_blcr_checkpoint)。同时创建CheckPoint.java 文件提供给java调用:


package android.blcr;


public class CheckPoint {


public CheckPoint() {


}


public native void checkPoint(String fileName);


}



正常启动blcr还需要修改init.rc,调整启动zygote的方式。修改点包括载人blcr内核驱动:


insmod /system/lib/modules/blcr_imports.ko


insmod /system/lib/modules/blcr.ko


和启动blcr服务方式,将


service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server


替换为:service zygote /system/bin/quick.sh -Xzygote /system/bin --zygote --start-system-server


其中quick.sh脚本内容为:


#!/system/b

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在Android中加入抓屏软件fbdump. 下一篇在Android中加入充电指示

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)
·[ Linux运维学习 ] (2025-12-26 02:52:27)
·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)