全志文件管理器移植到RK3288(二)----framework添加接口模块
因为cifs和nfs挂载到本地,需要使用到mount挂载命令,而执行mount命令又需要root权限。所以很多厂商都是在固件里增加一些带有root权限的接口给应用层使用。全志的文件管理器也是这样做的。一般都是在framework/base目录下添加接口和服务。
好吧,我们看看全志在framework/base下究竟加了什么东西。打开framework/base目录
在该目录下,肉眼扫荡发现就是多了swextend,当然ethernet也算一个。打开swextend目录看看它神秘的一面吧。
可以看到多了好多东西,不过测试发现有些没用上,编译也有点问题。在打开systemmix看看
对framework比较熟悉的,应该很清楚这些是什么。就是为系统添加java接口提供应用层使用,这又使用到了jni还有service。代码都挺简单的,有源码的自己看看吧。
下面开始动刀子了,把swextend文件拷贝到RK3288源码目录下framework/base。
ok,代码拿过来了,那就编译吧。忘了一件事,在framework添加接口,需要把framework 中的目录添加到编译环境中,不然编译系统时是不会把自己添加的模块编译进去的。好,我们要修改的是build/core/pathmap.mk,vim pathmap.mk打开文件后,我们在终端输入:/FRAMEWORKS_BASE_SUBDIRS := \,找到该字段,添加我们的目录如下:
在命令行下执行:
makeclean
makeupdate-api
make -j4
经过很长的等待,终于编译好了。如何测试呢?我是把全志文件管理器代码导入eclipse,然后把编译好的android.jar引入工程里。假如工程引入的import com.softwinner.SystemMix;报错,说明增加的systemmix接口没有编译进系统。如何引入android.jar?可以按这个来http://blog.csdn.net/chenshaoyang0011/article/details/7857634
经过测试,很悲剧,报错一堆,说明添加的接口都没编译成功。这个纠结了我好久,也痛恨自己懂的太少。
最后我自己编写一个测试接口,按网上的例子http://blog.csdn.net/sxy521/article/details/7770575,测试是成功了。好吧,说明方法是对的,是不是全志的代码不是按标准来?
对比一下吧,网上的例子framework/base目录下添加/MStarDTV/java/android/dtv,而全志的是java/systemmix.java。是不是问题出现在这呢?我们来测测。我把swextend/systemmix/java/systemmix.java改成swextend/systemmix/java/android/systemmix.java,就是按照标准的格式java目录下的目录是android然后才是java文件。当然systemmix.java代码里的包名也要跟着改。然后编译,测试,引入import com.softwinner.SystemMix;没有报错了,说明成功了。同样的方法接着改其它接口。
对于上面出现的问题,估计就是编译的脚本修改了,但是我也寻找了很久也没找到方法。如有知道的,请务必打醒我。
那么到了这里,java接口就顺利添加了。接着我们编译jni、lib、service,因为前面我们修改了java的包名,后面的代码也要跟着改就ok了。然后编译吧,因为我不懂在哪里修改脚本让添加的所有接口一次性编译,所有我只好一个个去编译。步骤:一
android源代码顶层目录执行../build/envsetup.sh目的是为了使用脚本envsetup.sh;二在终端cd进去具体的目录执行mm
通过以上步骤都编译好,我们接着下一步。因为添加了service,而且需要开机自启动。所以我们需要修改init.rc文件,RK3288所在目录为/RK3288/device/rockchip/rksdk
在init.rc文件里添加:
# start gpio service
service gpio /system/bin/gpioservice
class main
user root
group root audio camera graphics inet net_bt net_bt_admin net_raw
ioprio rt 4
oneshot
# start secure file server
service securefile /system/bin/securefileserver
class main
user root
group root audio camera graphics inet net_bt net_bt_admin net_raw
ioprio rt 4
oneshot
# start system mix service
service property /system/bin/systemmixservice
class main
user root
group root audio camera graphics inet net_bt net_bt_admin net_raw
ioprio rt 4
oneshot
# start isomountmanager
service isomountmanager /system/bin/isomountmanagerservice
class main
user root
group root audio camera graphics inet net_bt net_bt_admin net_raw
ioprio rt 4
oneshot
注意user root这个一定要加上,这个才是关键。ok,保存,重新编译。基本上framework就修改好了,不过在使用过程还是有些问题,比如nfs。从代码看是执行了system/bin/nfsprobe,我打开system/bin目录确实没有发现nfsprobe,所以就从全志固件那拷贝nfsprobe到RK3288源码目录RK3288/out/target/product/rk3288/system/bin下,再次编译就会把nfsprobe打包进去了。
这章写的好乱,内容也比较多。