android进程的内存相关知识整理

上一篇 / 下一篇  2015-08-06 19:09:17 / 个人分类:step by step android测试

android app在统计crash率的时候,会关注到底是java层的crash还是native层的crash。(日志都存在哪里?java层错误日志捕获,java本身提供了接口,Thread.setDefaultUncaughtExceptionHandler;native层日志会保存系统日志到native/tombstones;其他系统日志/data/system/dropbox/data/anr)。于是我就在想:
1、到底什么样的算native层的crash,什么样的算java层的crash?
2、native层和java层到底区别在哪里?

带着这2个疑问,搜到了一篇文章,个人感觉不错,Android进程的内存管理分析,里面讲述的比较透彻,值得大家一看。
native的进程是采用C,C++实现的,不包含dalvik实例的进程,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的,比如adb、logcat、kill、ifconfig、log、surfaceflinger等。
java程序必须使用jni来调用native的方法,而且应该用C语言的malloc或者C++的new关键字。
java进程是运行于dalvik虚拟机之上的进程,系统中的应用程序基本都是java进程,自然也包括我们平时在应用市场下载的各种app。
我们在android应用程序中会经常引用一些native的so包,来调用native的一些方法,一般都是C++写的。业务层代码一般引用的是jar包。so包是二进制的,不容易被反编译,另外,运行效率也会更高。我们的业务代码,一般都是java写的,理论上来说不如C++的运行效率高,理想情况下C++写的运行效率会高些,但是写代码的成本会增高。

3、那么什么情况下,java程序会导致native层的crash呢?
一般是开发写的jni代码有问题,或者系统本身native的方法有问题,但是后者一般概率会低一些。

搜到2篇如何分析native crash文章和这篇,目前我是还没看懂,哈哈,但不明觉厉,分享给有需要的人看吧

4、so不容易被反调试,java的话内存dump就出来逻辑了 ,so上可以做很多的安全措施保护代码 。

待续

TAG: Android android 知识

 

评分:0

我来说两句

Open Toolbar