108
回答
OSChina 第 30 期高手问答 —— Android 底层开发
科大讯飞通用文字识别100000次/天免费使用。立即申请   

OSCHINA 本期高手问答我们请来了 @罗升阳 为大家解答关于Android 底层开发方面的问题。基本的 Android 应用界面的开发请勿在此提问 :)

罗升阳是《Android系统源代码情景分析》一书的作者,一直从事于互联网软件开发,并且致力于移动平台的研究,特别是对Android平台有深入的理解和研究。

为了鼓励大家踊跃提问,我们准备了三本《Android系统源代码情景分析》作为奖品(备注:此书巨厚,价值一百多元),在问答结束后由 @罗升阳 从提问者中随意抽取赠与此书。

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 Android 底层开发方面的问题向 @罗升阳 提问,请直接回帖提问。

举报
红薯
发帖于5年前 108回/34K+阅
共有108个答案 最后回答: 7个月前
@罗升阳 : 您好。在NDK开发过程中,如果要在Java和C++间频繁传递数据,如何高效的传递?具体场景是:用Java读XML太慢了,我用C++实现了一个读XML的版本,但频繁传递数据,导致性能提升不明显。
--- 共有 6 条评论 ---
宋文昊回复 @dd : NDK开发过程 5年前 回复
Moym用json传是不是要相对xml要快点 5年前 回复
罗升阳http://blog.csdn.net/luoshengyang/article/details/6651971 5年前 回复
Jerikc回复 @罗升阳 : 不知道哪里可以找到具体的实例。谢谢.. 5年前 回复
罗升阳可以考虑使用匿名共享内存来传递,无论数据多大,传一个文件描述符就够了。 5年前 回复

@罗升阳 : 大神、老师 ,您好!!

我有3个问题想请教您!

1、我在Android 2.3平台下实现了 第三方应用程序 调用系统服务 ,即 开关GPS 卫星定位 的这个功能,可是将这个能在Android2.3 平台下运行的 apk 安装进同事的 小米1s手机  (Android 4.0.4 ) 却 无法实现 开关GPS  的这个功能 ,网上社区论坛 上的帖子 说  GPS ,wifi 这些是系统级的服务,  4.0以上google把这个不安全的反射方式屏蔽了,即若第三方的应用程序 想调用这些系统级服务,手机需要有ROOT 最高权限 ,且程序必须安装的 /system/app 目录下。 想请教您 真的是这样的么 ? 我考虑过 从C层 入手 抓取GPS 相关的源代码 ,通过JNI  封装一个 GPS   的动态链接库 (libGPS.so)供JAVA应用层调用,您说这样可行么 ?

2、现在在啃Android 底层 用C 和C ++写的源代码,很吃力啊  从Android 的启动流程  /system/core/init  这个目录中的 源代码开始阅读 ,想顺藤摸瓜,结果发现脉络太深, ,在阅读Android 源代码这一块 ,你有什么好的方法么 ?

3、我之前做过在Android 平台下通过RS232串口 控制小票打印机的 APK 程序 ,这里面用到了JNI  用C 封装打印机的通信指令集,打包成动态链接库供JAVA调用,现在想问的是 ,您觉得Android在未来有可能替代WinCE么 ?比如 我看到过警察查身份证的机器用的就是Wince 加一个RFID模块 ,我想 能不能在Android设备上也实现 ,通过串口通信 。 

                                                            期待您的高见!!!

--- 共有 3 条评论 ---
哪一天GPS调用问题关注。 5年前 回复
努力工作蜗牛回复 @hayvane : 同行,认识一下吧! 对你的回答很感兴趣,我看到过 Android平台下的医疗设备 5年前 回复
hayvaneRFID 模块 用到android 系统上 已经实现了,我目前开发的手持机就是用android系统,蓝牙,gps 都是用的串口通信。 5年前 回复

@罗升阳 :大神,你好

1.我想自己写一个给NDK C库加壳的程序,加壳后的库能自己解自己,同时能验证自己是否被修改过的,但使用C里面不能在系统目录下读写文件操作,如果程序必须安装的 /system/app 目录下,则我的加壳库在没ROOT的机器上无法运行。问下有什么解决方式,我并不想将程序安装在SD卡上,而且不打算使用JAVA的文件读写辅助。

2.现在NDK除了直接能使用OPENGL-ES图形应用底层库外,还能支持哪里底层的操作,也就是说那些不通过JNI调用JAVA SDK库的操作。

3.如果不ROOT机,使用C能否实现类似WINDOWS SSDT HOOK之类的功能。

望大神指点一二!!!

--- 共有 5 条评论 ---
cut回复 @罗升阳 : 相关代码晚上我共享出来,有空帮我看看哦 5年前 回复
cut回复 @罗升阳 : 我的手机ROOT了,调试的时候没看见问题,但考给朋友测试的时候就读不起文件,他的手机没ROOT,用C通过JNI调用JAVA SDK的类没问题。 5年前 回复
罗升阳回复 @cut : 日志显示是权限问题?对这个表示怀疑。我还没有仔细研究过Android的资源管理框架,不过初步了解,应用程序在Java层读取资源文件时,最终也是通过JNI方法来读取的,你可以跟一下这个过程,再对比一下和你用C直接读取有什么区别。后续我也会研究一下Android的资源管理框架,欢迎关注博客:http://blog.csdn.net/Luoshengyang。 5年前 回复
cut回复 @罗升阳 : 还有个疑问,比如我通过JAVA 使用SDK的方式操作assets下的资源一点问题都没,但我使用NDK 使用C调用ZIPLIB,使用C那套读写文件的方式读assets里面的资源在ROOT掉的机上可以运行,但没ROOT的不行,这个程序读写自身文件的权限怎么将NDK的权限跟SDK在AndroidManifest.xml设定的权限一样。 5年前 回复
罗升阳1&3. Android通过UID和GID来限制了很多特权操作,如果不ROOT,这些特权操作还是很难绕过去的,除非你能找到漏洞。 2. 这个你要看看NDK提供了哪些接口。 5年前 回复

@罗升阳

APK程序version 1 时,数据保存在内部存储,version 2 时,写到SD卡去了

所以发现升级后,旧的数据查不到了

解决方案想了几种,不知道从底层有什么方便的吗


--- 共有 1 条评论 ---
罗升阳不知道你的数据是不是保存在SQLite数据库里面的,如果是的话,对于版本问题,Android提供有支持:SQLiteOpenHelper。 5年前 回复

@罗升阳 :罗老师你好,我想请教几个问题;

1、binder是否能够实现主动调用客户端的接口?我当前项目中碰到binder的server中收到通知需要通知对应的APK,我们使用的是广播。是否还有其它方法?

2、android的HAL层是如何实现的?我如何给ANdroid添加一个自定义硬件?

3、我当前应用需要处理大量的数据(30Mb/s),需要把这个数据从驱动传递到java。之前我们之间使用JNI,效率不够理想。请问罗老师,是否还有其它方法?

4、AIDL的服务是不是只能在Java中使用?我想再NDK中使用这个,该如何使用?

5、关于使用Binder服务是否需要对接口调用者进行验证?是否有其它注意事项?


@罗升阳 :您好,关于AsynTask的提问?

1,AsynTask是为了解决ANR(or FC)问题的,请问AsynTask底层是基于线程池的实现吗?如果在AsynTask的doInBackground方法中出现异常的话,该task线程是否需要手工干掉?

2,请问AsynTask的方式与Handler的方式,哪个执行效率会高一些(资源利用少一些),如果他们有各自的使用场景的话,那么他们的典型场景是哪些?

3,以您对android底层实现的了解,基于HTML5来开发app到底靠不靠谱?前两天看到新闻,facebook的ceo已经放弃html5了。

谢谢!

--- 共有 3 条评论 ---
ddatsh回复 @恺哥 : 我们这比较好玩,一开始做的是 android 版的,hessian和服务端通信,后来推的是web版,html5 离线缓存,ajax发送json和服务端通信 5年前 回复
恺哥回复 @dd : 现在客户所有的app体验都要求像ios看齐,恐怕现在用html5做app还不是很靠谱,体验非常差。现在的客户,感觉操作不流畅,直接pass你的app 5年前 回复
ddatsh我们应用就是两个版本都用了 老机器上html5版的很卡 5年前 回复
我很好奇这里提到的底层指的是与硬件的接口层还是操作系统层还是?
--- 共有 2 条评论 ---
罗升阳Android大概可以分为五层:1. 内核层;2. HAL层;3. 运行时库层;4. 应用程序框架层;5. 应用层。这里是指第2、第3和第4层。 5年前 回复
红薯随意:) 5年前 回复
@罗升阳 :请问如何判断一个程序应该用Java开发还是底层C开发呢?在选择开发方式的时候除了性能还有那些地方要考虑? 
--- 共有 4 条评论 ---
罗升阳是Java开发还是C开发,你看它的目录结构以及文件就可以推断出来了。Google不建议使用NDK,即C++来开发,除非你真的是涉及到性能问题。NDK没有提供完善的应用程序框架,所以如果真的有性能问题,那也只能用NDK来写关键的部分,其它还是最好使用SDK来开发。 5年前 回复
shouyong回复 @魔力猫 : 我之前的一个C项目转Android应用,虽然知道Java比C开发有优势。但是我们的原项目成熟。最后还是使用的c。 如果能正确的梳理出项目需求,我不认为这个判断原则有啥不当? 当然,可能每个人团队的实际情况不一样。我这儿有效的,你哪儿不一定行得通。仅供参考。 5年前 回复
魔力猫回复 @chen.sy : 你这话说了和没说一样。 5年前 回复
shouyong个人认为,主要还是看项目需求。。 5年前 回复
顶部