01 2013 档案
摘要:Android中native进程内存泄露的调试技巧红狼博客代码基于Android2.3.x版本Android为Java程序提供了方便的内存泄露信息和工具(如MAT),便于查找。但是,对于纯粹C/C++ 编写的natvie进程,却不那么容易查找内存泄露。传统的C/C++程序可以使用valgrind工具,也可以使用某些代码检查工具。幸运的是,Google的bionic库为我们查找内存泄露提供了一个非常棒的API--get_malloc_leak_info。利用它,我们很容易通过得到backtrace的方式找到涉嫌内存泄露的地方。代码原理分析我们可以使用adb shell setprop libc.
阅读全文
摘要:Looper中的消息队列处理机制Looper也提供了消息的定义、消息的发送、消息的处理者的自定义和消息队列。在其头文件Looper.h中,定义了消息结构体Message,它只有一个类型成员,Message的定义如下(见文件Looper.h,下同): 消息的处理者可由MessageHandler进行处理:使用者可通过派生出子类来扩展消息。对消息的处理,需要在MessageHandler的子类中重载handleMessage函数。它们将被封装到消息“信封”MessageEnvolope中,然后送到消息队列中。MessageEnvolope的定义如下:Looper中维护着一个自己...
阅读全文
摘要:《深入剖析Android系统》第9章RIL补充配图《深入剖析Android系统》一书中第9章的RIL部分的函数层层调用,可以用插图的方式标示出主要的调用关系。由于插图较大,不适合16开的书籍尺寸大小,故未将相关插图放到《深入剖析Android系统》一书中。读者在阅读该章内容时,可以在电脑上放大插图来查看函数的调用关系。注:这些插图绘制于2009年,基于Android的Cupcake版本,但亦适用于Android的后续新版本。1.RIL调用关系概略图:2.RIL调用关系详图:3. RIL调用关系详图中的分发(dispatch)部分:4.RIL调用关系详图中的读取部分(reader):5. Rad
阅读全文
摘要:Looper中的睡眠等待与唤醒机制C++类Looper中的睡眠和唤醒机制是通过pollOnce和wake函数提供的,它们又是利用操作系统(Linux内核)的epoll机制来完成的。当被监控的文件(通过epoll_ctl的EPOLL_CTL_ADD添加进去)可I/O时,epoll_wait调用会从睡眠中醒来,这时,可以检查是哪个(或哪些)文件描述符对应的文件可以进行I/O读写了,从而做出进一步处理。使用者利用它们就可以拥有睡眠等待和唤醒机制。下面详述。在Looper的构造函数中,会创建一个管道(下面的行73),然后调用epoll_create获取一个epoll的实例的描述符(行88),最后将管道
阅读全文
摘要:Looper对文件描述符的监控与处理上面提到的管道的读端是一种文件描述符,那么其他的文件描述符,如普通的文件、设备文件和套接字(包括套接字对)等的描述符,都可以被Looper用来监控,实现类似于上面的消息队列的唤醒和处理机制。通常,消息是通过消息队列发送的,也可以通过套接字(比如已建立好连接的套接字)、设备文件来发送;当然,也包括管道。对一个文件描述符进行监控后,只要有可I/O事件发生,那么调用了pollOnce的调用者(如某个线程)将被唤醒,然后就可调用指定的处理者(如回调函数)对到来的数据(若为可读事件的话)进行处理。Looper提供了addFd函数用于添加需要监控的文件描述符,这个文件描
阅读全文
摘要:EventThread线程对VSync的接收EventThread被设计用来接收VSync事件通知,并分发VSync通知给系统中的每一个感兴趣的注册者。VSync来源自底层硬件驱动程序的上报,对于Android能看到的接口来说,它是来自HAL层的hwc_composer_device的抽象硬件设备。若硬件不支持,则HWComposer会创建一个线程去模拟产生VSync事件通知。一旦工作起来,VSync将像一个脉搏一样,不断通知到Surfaceflinger中的EventThread线程,由后者再分发给感兴趣的注册者。先来看一下EventThread何时被创建并开始运行的。在SurfaceFl.
阅读全文
摘要:前面提到,EventThread在接收到VSync后再将它们分发给感兴趣的注册者,分发的过程是在其线程循环threadLoop函数中完成的。读者也可以先阅读后面一节内容,先了解感兴趣的注册者如何得到VSync通知以及系统中可能存在哪些感兴趣的注册者后,再回来阅读本小节。
阅读全文
摘要:深入剖析Android系统(基于Google发布的Jelly Bean原始代码,讲述Android系统的内部静态结构关系和内部运行机制,为你呈现原汁原味的Android代码分析大餐!)杨长刚著ISBN978-7-121-19374-32013年1月出版定价:59.00元464页16开编辑推荐基于Google发布的Jelly Bean原始代码,讲述Android系统的内部静态结构关系和内部运行机制,为你呈现原汁原味的Android代码分析大餐!同类书推荐:《Android内核剖析》《Android系统源代码情景分析》内容提要本书以Android Jelly Bean(4.1)的代码为蓝本,对An
阅读全文
摘要:演讲能力并非与生俱来的,通过锻炼可以不断熟练。一场成功的演讲,除了好的内容之外,还需要哪些?本场讲座,《演讲达人成长记》的作者为你讲解站姿、手势、走动、面部表情等组成完美演讲的必要条件。
阅读全文
摘要:谁动了我的琴弦——会话劫持让我们看一个最常见的例子——会话劫持,如图10-2所示。图10-2 会话劫持说明如图10-2所示,受害者Alice正常的登录网站为www.buybook.com,此时她的Session ID是1234567,攻击者Bob通过网络嗅探获得了Alice的Session ID和Cookie中的用户登录信息,这样他就可以模仿Alice进行登录和操作了,而此时此刻Alice可能毫无所知。最常见的获取Session ID的方式就是我们前面讲解的XSS。下面通过具体的步骤详细地模拟会话劫持。➊ 我们正常地登录一个网站(这里用Google Chrome),登录的用户名是admin,记
阅读全文
摘要:身份认证设计的基本准则密码长度和复杂性策略密码认证作为当前最流行的身份验证方式,在安全方面最值得考虑的因素就是密码的长度。一个强度高的密码使得人工猜测或者暴力破解密码的难度增加。下面定义了高强度密码的一些特性。(1)密码长度对于重要的应用,密码长度最少为6;对于关键的应用,密码长度最少为8;对于那些最关键的应用,应该考虑多因子认证系统。(2)密码的复杂度有的时候仅有长度约束是不够的,比如说12345678、11111111这样的密码,长度的确是8位,但极容易被猜测和字典攻击,所以这时候就需要增加密码复杂度。下面列举了一些提供复杂度的策略。 至少一个大写字母(A~Z)。 至少一个小写字母(a
阅读全文
摘要:保护你的会话令牌通常我们会采取以下的措施来保护会话。1.采用强算法生成Session ID正如我们前面用Web Scrab分析的那样,会话ID必须具有随机性和不可预测性。一般来说,会话ID的长度至少为128位。下面我们就拿常见的应用服务器Tomcat来说明如何配置会话ID的长度和生成算法。首先我们找到{TOMCAT_HOME}\conf\context.xml,然后加入下面一段设置<Manager sessionIdLength="20" ➊ secureRandomAlgorithm="SHA1PRNG" ➋ secureRandomClass=
阅读全文