android从sd卡启动(MTK)(工作内容)

看这篇文章之前可能会遇到关于SELINUX权限问题可以参考这篇文章

http://blog.csdn.net/morixinguan/article/details/53353427


还可能会遇到程序中自己的程序中printf()打印不能显示,这时可以先在自己的程序的main()中加入这条语句system(“reboot”);来确定自己的服务是否正确加入其中,为什么要用reboot因为reboot在系统服务中比较靠前,加这个成功的概率高些,确定系统每次运行到rebootzhe就重启后,再来解决printf()打印消息问题,这个是关于重新定向标准输入输出的问题,可以参考这篇文章

http://blog.csdn.net/morixinguan/article/details/53469818


文章的最下面讲了如何重新定向标准输入输出


(如果没有了其他问题开始进入正题了)

  先将自己的需要启动的程序放在源码目录的/external/下(我的程序是runexec)在源码根目录下执行(可以将需要生成的文件的包加在源码下的build/target/product/xxx.mk下,这样编译源码的时候就一起编译了)
source build/envsetup.sh
lunch
20 (以eng版为例)
mmm external/runexec/

执行完后会在对应的目录下生成可执行文件(我的是runexec,具体看你的Android.mk文件中生成对应得可执行文件)
生成文件在/out/target/product/em_t8530_emmmc/system/bin/

在源码的
system/core/rootdir/init.rc中添加自己的服务

我的添加过程如下
on vtech
service CalibrateTest /system/bin/runexec /system/bin/gsensorCalibrate  noexit ignoreerr
         class core
         oneshot


on property:sys.bnd.checkexec=0     //这个属性下的所有服务都将它的启动模式 //改为disabled
//这下面的所有服务就是开机自 android //这个logo出现及其后面相关的服务
        start nand //自己的服务放在这个on property之前
        start servicemanager //就可以启动自己的服务并判断什么条件下
        start vold //启动android自己的文件系统
        start surfaceflinger
        start zygote
        start media

        start sethdmimode

然后再init.rc中适当的位置(也就是自己需要启动服务的位置)将自己的vtech加入,加入方式如下

trigger vtech

添加完这个之后还需要在自己的程序的main()函数中添加设置属性 
#define SET_PROPERTY

#ifdef SET_PROPERTY
static void set_property(void)
{
LOGD("set sys.bnd.checkexec=0\n");
property_set("sys.bnd.checkexec", "0");
}
#endif

在main()函数中需要的地方调用这个函数,就是系统正常启动界面,不调用这个函数就可以启动自己的服务,服务下有自己的可执行程序


(系统的不同,加入方法不同)

你可能感兴趣的:(work)