MTK6589百度云ROM移植教程


转自百度云ROM论坛:http://bbs.rom.baidu.com/thread-88301-1-1.html


       百度云已经支持了MTK6589平台的ROM A820,还有马上要发布的G4。基于A820和G4,我们可以将百度云ROM移植到其他的MTK6589的机型上。由于A820是基于官方4.1制作的,G4网上有4.2的底包,百度应该会基于4.2的底包来制作。等G4发布之后,只要是MTK6589的芯片,无论是官方是4.1还是4.2的,都可以制作百度云ROM了。具体使用MTK6589芯片的手机,大家可以去百度一下,真心很多啊!

       在这里,我尝试了一把将百度云的A820一直到风华2(GN708W的4.1)上,虽然风华2已经有4.2的包。但是大家可以看到风华2的4.2的包相对于4.1,也只是更新了boot和system两个分区。

如果对于百度云ROM拼包移植不熟悉的,可以先看一下我之前发布的MTK6577的教程:
http://bbs.rom.baidu.com/forum.php?mod=viewthread&tid=39980&highlight=MTK6577
里面有讲如何修改boot.img、build.prop以及提前开启adb(这个对于调试很重要)等等
之前MTK6577的移植教程里有说明的,这里就不再重复介绍了。这里主要讲述在拼包过程中遇到的问题的解决办法!

GN708W移植教程及问题
先简单讲一下我拼GN708W的几个步骤及遇到的一些问题:
1、  解压A820的ota包:
去百度云ROM官网上下载A820最新的ota包,然后解压目录ota-rom-34
2、  加入GN708W的驱动和硬件强相关文件:
将以下目录的所有文件拷贝到ota-rom-34对应的目录
/system/etc/firmware/*
/system/etc/permissions/*
/system/etc/mddb/*
/system/lib/hw/*
/system/lib/modules/*
/system/vendor/*
3、  参照MTK6577的教程去掉updater-script里面的机型校验,然后打一个zip包,就可以开始用recovery刷入了。刷入之后,首先需要关注adb是否能够正常使用。然后就看影响起机的关键进程了。后面会进行更详细的介绍。
4、  遇到过一个不能起机的问题,是因为没有/data/app-lib目录导致,这个是4.1和4.2的差异。4.2需要在init.rc中创建/data/app-lib目录,因而将A820上的这个修改弄过来就可以了。
5、  这里遇到过前置摄像头不能用的问题,在将/system/lib/libcam*所有的so库用GN708W的之后就可以解决了。还有一个闪光灯不能用的问题,反编译了BaiduGallery3D.apk(当然得先去掉odex),然后修改了一些smali代码做到的。已经跟官方项目组的联系,ROM-35会去掉一些强依赖,到时候就可以不修改smali代码了。
6、  还有一个默认存储卡的问题,修改了init.rc,是参照A820的修改的,在init.rc的最后几段。

关键进程启动失败的处理关键进程
往往在拼包完之后,发现不能起机,这个时候需要看以下的关键进程是否都起来了(用adb shell ps查看):

  进程名
  
  作用
  
  如果没有正常起来会有什么现象
  
  surfaceflinger
  
  负责屏幕显示的服务
  
  开机动画不能work,不能起机
  
  mediaserver
  
  负责相机、声音、多媒体相关的服务
  
  没有声音,不能起机
  
  zygote
  
  负责启动java层的服务、app
  
  不能起机,可以通过跑app_process来验证
  
  servicemanager
  
  服务管理
  
  不能起机
  
  vold
  
  Sdcard挂载
  
  可以正常起机,但sdcard挂载会有问题
  
  rild、gsm0710muxd、ccci_fsd、ccci_mdinit
  
  Modem相关,会影响电话、短信
  
  可以正常起机,但电话不能用
  
当然具体什么进程能影响不能起机,关键还的看init.rc的配置,不同的机型可能会有差别。如果这些进程都正常起来了,系统还是不能起机,这个时候你需要对比一下原生起来的进程跟你的有什么差异了,是不是比你的要多一些进程!

关键进程启动失败的处理方法
如果有进程不能正常起机,或者你发现它的进程id不停地在变化,说明这个进程是有问题的!
解决办法:
adb shell后,手动执行进程,看有什么错误。
比如surfaceflinger没有起来,执行以下命令:
adb shell
surfaceflinger

1、  缺少so库:
比如我手动删掉了libcamdrv.so库,然后在adb shell之后运行mediaserver,就会出现如下信息:

soinfo_link_image(linker.cpp:1635):could not load library "libmediaplayerservice.so" needed by "mediaserver";caused by soinfo_link_image(linker.cpp:1635): could not load library"libstagefright.so" needed by "libmediaplayerservice.so";caused by soinfo_link_image(linker.cpp:1635): could not load library"libskia.so" needed by "libstagefright.so"; caused bysoinfo_link_image(linker.cpp:1635): could not load library"libmhalImageCodec.so" needed by "libskia.so"; caused bysoinfo_link_image(linker.cpp:1635): could not load library"libJpgDecPipe.so" needed by "libmhalImageCodec.so"; causedby soinfo_link_image(linker.cpp:1635): could not load library"libcamdrv.so" needed by "libJpgDecPipe.so"; caused byload_library(linker.cpp:745): library "libcamdrv.so" nCANNOT LINKEXECUTABLE
        这种信息需要从后面往前看,可以很轻松地看出是找不到libcamdrv.so库。

2、  缺少函数:
        少函数的提示信息跟缺少so库的类似,你也只需要从后面往前看,找到对应的函数名称,然后去grep,找到对应的so,然后push进去。当然C++的函数名比较长,不过没有关系,一样可以搜索出来的。

3、  段错误(Segmentationfault):
        当你手动运行某个进程,出现“Segmentationfault”的提示,或者用adb logcat看到有一堆DEBUG的log时,则表示有段错误!
比如,有一下DEBUG的log,下面是其中的backtrace片段:
     I/DEBUG   (  580): backtrace:
    I/DEBUG   (  580):     #00 pc 00011a50 /system/lib/libcamdrv.so(ImgSensorDrv::getCurrentSensorType(SENSOR_DEV_ENUM)+75)
    I/DEBUG   (  580):    #01  pc 0001302b  /system/lib/libcamdrv.so(ImgSensorDrv::impSearchSensor(int (*)())+422)
    I/DEBUG   (  580):    #02  pc 000133ed  /system/lib/libcamdrv.so(SensorDrv::searchSensor(int (*)())+14)
    I/DEBUG   (  580):    #03  pc 0001696f  /system/lib/libcamdrv.so(SensorHalImp::searchSensor()+226)
    I/DEBUG   (  580):    #04  pc 0000838d  /system/lib/hw/camera.default.so(android::CamDeviceManager::getNumberOfCameras()+120)
    I/DEBUG   (  580):    #05  pc 0001c317  /system/lib/libcameraservice.so(android::CameraService:: onFirstRef()+58)
    I/DEBUG   (  580):    #06  pc 0000ef2d  /system/lib/libutils.so(android::RefBase::incStrong(void const*) const+38)
    I/DEBUG   (  580):    #07  pc 00000bc9  /system/bin/mediaserver
    I/DEBUG   (  580):    #08  pc 00000c87  /system/bin/mediaserver
    I/DEBUG   (  580):    #09  pc 0001bd98  /system/lib/libc.so (__libc_init+64)
    I/DEBUG   (  580):    #10  pc 00000aa0  /system/bin/mediaserver
        这里是程序的调用的so库的堆栈,可以看到最后的段错误发生在libcamdrv.so,这个时候,你尝试着将libcamdrv.so进行替换。如果不行,再换下一个,即camera.default.so,依次类推。

        这个时候你会看到一些提示,比如so库啊,或者少函数。如果是少so库,去百度的或者官方的找一个就是了。如果是少函数,去grep一下,看哪个so库有这个函数,然后将这个so换进去!哈哈~~~实在不行,把错误日志贴到百度去搜索一下!

注意事项:
有些进程起来是需要带参数的,比如在init.rc中看到有这样一段:
servicegsm0710muxd /system/bin/gsm0710muxd -s /dev/ttyC0 -f 512 -n 8 -m basic

说明gsm07010muxd这个进程是运行的/system/bin/gsm0710muxd文件,并且带有参数“-s/dev/ttyC0 -f 512 -n 8 -m basic”
所以在这种情况下,你要跑gsm07010muxd进程,就得在adbshell之后输入:
/system/bin/gsm0710muxd-s /dev/ttyC0 -f 512 -n 8 -m basic
当然,由于/system/bin已经加到PATH里面,你不输入/system/bin/也是可以跑gsm0710muxd的。

怎样利用objdump看文件的依赖关系:      
        在解决某些问题的时候,需要知道so库或者bin之间的依赖关系,有些是动态加载的,是没有办法直接看到的。但是通过链接的so库都可以看到的。
可以用objdump命令查看,具体方法如下:
比如我想看surfaceflinger这个bin依赖哪些so库,则可以:
输入:objdump -x surfaceflinger  |grep NEEDED
输出:
NEEDED              libsurfaceflinger.so
NEEDED               libbinder.so
NEEDED               liblog.so
NEEDED               libutils.so
NEEDED               libc.so
NEEDED               libstdc++.so
NEEDED               libm.so
        你就会知道surfaceflinger依赖于上面这些so库了,当然你如果想知道libsurfaceflinger.so依赖于哪些so库,这种方法同样是可以用的!objdump -x libsurfaceflinger.so | grep NEEDED
然后尝试去替换一下,哈哈~~~

adb不能用,怎样抓取日志:
        有些开发者可能觉得修改boot.img提前开启adbd比较麻烦,下面我将教大家一种方法,怎样在adb不能用的时候,抓取日志!
        一般而言,android都会起动一个install-recovery.sh的服务,所以你只需要在/system/etc/install-recovery.sh里面增加输出日志的,不就可以了嘛!
如果有install-recovery.sh,则追加上以下语句:
logcat –v time >> /sdcard/log
如果没有install-recovery.sh,则新建一个,需要有执行权限哦!内容如下:
#!/system/bin/sh
logcat –v time >> /sdcard/log

        在系统运行之后,把你的sdcard拿出来,就可以看到日志了。当然,如果你的手机还不能识别sdcard,你就只能放到/data/local/tmp,然后进到recovery去手动mount /data分区拿出来了!
如果不会用mount,可以自行百度一下,哈哈~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值