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;
- Android5.0编写hello从APP->framework->jni->hal->驱动的BUG
- 从java层到framework到JNI到HAL到kernel的hello 例子
- 从java层到framework到JNI到HAL到kernel的hello 例子
- led分析(app->framework->jni->hal)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android驱动模型(kernel-hal-framework-app)
- Android之 震动(Vibrator)如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
- Android架构实例分析之编写hello驱动的HAL层代码
- C++知识点21
- sizeof()解析
- 小米系列手机调试Installation failed with message Failed to establish session
- java企业级工程师学习课程表
- android清单文件
- Android5.0编写hello从APP->framework->jni->hal->驱动的BUG
- 适配器模式(Adapter):类适配器、对象适配器
- 【BZOJ 1022】 [SHOI2008]小约翰的游戏John
- 计算密集型&IO密集型
- 通讯录的常用功能保存
- jquery验证大全
- 简单编码(java语言把数字转换成单个字符)
- 复杂网络社区结构发现算法-基于python networkx clique渗透算法
- 看程序员的呐喊有感