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

    xiaoxiao2021-03-25  102

    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;

         

       

    转载请注明原文地址: https://ju.6miu.com/read-22861.html

    最新回复(0)