瑞芯微Rockchip开发者社区
直播中

李舒桀

7年用户 1257经验值
私信 关注
[问答]

怎样在framework/base目录下添加接口和服务呢

怎样在framework/base目录下添加接口和服务呢?
怎样在framework下添加接口模块呢?

回帖(1)

余姗姗

2022-3-10 13:57:45
因为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 := ,找到该字段,添加我们的目录如下:

            


FRAMEWORKS_BASE_SUBDIRS :=



$(addsuffix /java,



     core



     graphics


      ...
  

  ethernet



  swextend/securefile



  swextend/gpio



  swextend/isomountmanager



  swextend/os



  swextend/systemmix



  swextend/nfsmanager



  )


     保存修改后,我们就开始编译吧


    在命令行下执行:
        makeclean
        makeupdate-api
        make
-j4

            经过很长的等待,终于编译好了。如何测试呢?我是把全志文件管理器代码导入eclipse,然后把编译好的android.jar引入工程里。假如工程引入的import com.softwinner.SystemMix;报错,说明增加的systemmix接口没有编译进系统。如何引入android.jar?可以按这个来

经过测试,很悲剧,报错一堆,说明添加的接口都没编译成功。这个纠结了我好久,也痛恨自己懂的太少。

            最后我自己编写一个测试接口,按网上的例子,测试是成功了。好吧,说明方法是对的,是不是全志的代码不是按标准来?

         对比一下吧,网上的例子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打包进去了。


           这章写的好乱,内容也比较多。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分