Android5.0编写hello从APP->framework->jni->hal->驱动的BUG

来源:互联网 发布:c语言逻辑或运算 编辑:程序博客网 时间:2024/06/05 10:59

Android5.0编写hello从APP->framework->jni->hal->驱动的BUG


    大概一周的时间,终于把Android5.0整个框架给调通了,期间遇到许许多多的BUG,这篇将总结我从编译源码到条通过整个框架所遇到的BUG或应该注意的事项。

    编译过程中的注意事项:

    一:Android5.0只支持64位虚拟机镜像文件(我的是ubuntu14.04 64位)

    二:搭建环境发现ia32-libs安装不了。

        原因:这是32位的库,64位的库早就没有这个包了。

        解决办法:安装系统提示的3个包。

    三:内核编译指令的区别:安卓4.0之后:make goldfish_armv7_defconfig

                                        make

                            安卓4.0之前:make goldfish_defconfig

                                        make

    四:提示emulator指令找不到,重新source;lunch;一遍(前提是环境已搭建成功)

   

    编写Android各层的BUG

    BUG 1:提示mm -B或者 mmm命令找不到,重新在源码目录下source;lunch一遍

    BUG 2:提示make snod打包编译文件指令找不到,这个在mmm命令局部编译后,得重新make一下,下次make snod的时候就不会报错。

    BUG 3:framework层局部编译并且make snod打包后,发现模拟器一直处于ANDROID开机状态。

          原因:Android4.0之后,对framwork.jar的代码进行了修改,要用make systemimage编译,不能用make snod,snod是systemimage with no dependencies的意思。

   

    接下来着重介绍下我遇到的最不容易解决的BUG,关于Android5.0之后权限问题。

    编写完整个框架之后,启动模拟器,打开APP进行操作,发现任何操作都会导致APP崩溃,查看LOG,LOG表示:

    Hello Stub: failed to open /dev/hello -- Permission denied.

    这个是要修改底层/dev/hello这个设备文件的权限。 core/rootdir/ueventd.rc 按照文件里别的设备文件的格式修改hello为0666。

    修改之后,make编译,打开模拟器运行APP发现还是崩溃,再次在后台查看LOG,还是有同样的错误,然后在后台输入ls -l /dev/hello 查看hello权限写的rw-rw-rw-。既然权限已经改过来了,那么为什么还是不能访问呢?

    呵呵,还差得远呢!

    这里就涉及到apk系统签名的问题了。

    这个东西详细解释,一遍文章都不够的,就简单的说几句吧。

    首先分清两个概念:
要区分apk运行时的拥有的权限与在文件系统上被访问(读写执行)的权限两个概念。
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。

    假如我的设备文件已经具备用户/用户组及他人被读写的权限了,而我的apk也在这三个里面的一个。千万不要以为apk就有访问此设备文件的权限了。

    要访问底层设备文件,那么我们必须得将apk写入系统,在系统里编译,那么就要加上系统级签名,告诉系统,我的apk是属于文件系统的。

    写系统标签:

    1.在自己JAVA工程里的.xml文件里的mainfest里添加:android:sharedUserId="android.uid.system"

      加上这个还不够,仅仅只加这个,可能导致运行模拟器后你的app“消失”。

    2.修改工程下Android.mk文件,加入:LOCAL_CERTIFICATE:= platform

   

    上面的操作完成后,就可以编译运行模拟器了,打开APP,你会发现,还是崩溃!再次查看LOG,还是一样的错误,那么,到底是怎么回事呢?是上面说的不对吗?

    答案肯定是否定的。Android5.0之后引入了SEAndroid/SElinux的安全机制,仅仅是上面的操作是不够的!

    修改SElinux,允许应用访问设备文件:(这里我一次性将添加hello到SElinux及允许添加的服务一次说完)

    1.进入/external/sepolicy/

    2.在file_contexts文件中添加

      /dev/hello         u:object_r:hello_device:s0

    3.在device.te文件中添加

      type hello_device,dev_type;

    4.在domain.te文件中添加

      allow domain hello_device:chr_file rw_file_perms;

    5.在service.te文件中添加

      type hello_service,               service_manager_type;

      type system_api_service,          service_manager_type;

      type system_server_service,       service_manager_type;(如果里面已经申明的话就不要重复申明)

    6.在service_contexts文件中添加

      hello                       u:object_r:hello_service:s0

    7.在system_server.te文件中添加

      allow system_server hello_device:char_file rw_file_perms;

    8.在untrusted_app.te文件中添加

      allow untrusted_app hello_service:service_manager find;

    9.在system_app.te文件中添加

      allow system_app hello_service:service_manager find;

     

   

1 0
原创粉丝点击