自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 新书上市《深入解析Android 5.0系统》

《深入解析Android 5.0系统》详细剖析了最新Android 5.0 系统主要框架的原理和具体实现。本书共24章,覆盖了Android 5.0 系统中、下层重要的模块,对于每个模块都详细介绍了它们的架构、原理及代码实现等各个方面,尽量让读者知其然,又知其所以然,达到学以致用的目的。主要内容为:Android Build系统核心、Android的Bionic、系统调用的

2015-05-02 10:38:46 4858 8

原创 Android的SandBox(沙箱)

在研究Android系统时,有时会遇到Sandbox(沙箱)这个概念。沙箱概念本身并不是太新奇,但是一直不是很清楚Android是如何实现它所称的“沙箱”的。网上不少人声称应用使用了虚拟机就是应用了沙箱,一直对这种说法表示怀疑。最近发现Android的网站上更新了一些文档,其中包括对Sandbox的解释,这才明白Android中Sandbox的含义。Android的”沙箱“

2014-10-29 15:57:25 9078

原创 ubuntu14.04 安装LNMP

通常我们使用centos来组建LNMP,但是我们开发时多使用ubuntu的桌面版本来调试,下面将详细介绍如何在ubuntu上安装一套LNMP。一、下载并安装最新的ubuntu14.04桌面版本二、安装mysql1. 下载mysql的最新版本,例如:wget http://dl.mysql.cn/mysql5/5.5/mysql-5.5.25.tar.gz2. 解压缩:t

2014-05-11 19:16:21 2288

原创 奇虎360安全牛人全球挑战赛无线部…

前几天在网上看到了一个360安全挑战赛的站点下载了其中无线挑战部分的题看了看。一共有三道题,前面两道题比较简单,都是关于apk的反编译,大概花了4个小时完成了,但是第三道题却没完成,这道题需要工具来完成so文件的反编译。然后在网下了IDA的评估版,反编译出来看了看,但是我对ARM汇编还没有熟到看C代码一样,要完成估计比较费劲,大概需要好几天,毕竟自己不是专业玩破解的,而且将来估计也不会干这行,也就

2014-04-30 15:47:09 2573

原创 Ubuntu平台下载和编译FFmpeg

FFmpeg是Linux下一个开源的的音视频解决方案,采用LGPL或GPL许可证(依据选择的组件)。 FFMpeg的官方网站是http://www.ffmpeg.org/,官网目前最新版本的源码2.2.1。源码可以有多种下载方式,对Android开发者而言,git方式无疑是最方便的,使用下面的命令就可以下载完整的源码:git clonegit://source.ffmpeg.org

2014-04-30 15:47:07 1195

原创 Android的uiAutomator

除了对组成安卓应用的组件(例如:Activities,Services和ContentProviders)进行单元测试,测试应用程序运行在设备上时的界面也很重要。UI测试确保应用在一系列用户操作后能产生正确的UI界面,例如:通过键盘输入,点击工具栏,菜单,对话框,图片或其他的UI控件。功能测试或者黑盒测试不需要测试人员了解应用的内部实现细节,只要明白在执行一系列用户操作或输入后返回的U

2014-04-30 15:47:05 1193

原创 Android的Monkeyrunner

Monkeyrunner提供API来让用户开发程序控制Android设备以及模拟器。通过Monkeyrunner,可以写一个Python程序去安装Android应用程序或者测试包,然后运行应用,向它发送模拟输入事件,或者截取它的屏幕,并存储在电脑上。Monkeyrunner工具的主要目的是通过运行单元测试套件在功能和框架级别上测试应用程序和设备,当然也可以将其用于其它目的。Monkeyru

2014-04-30 15:47:03 1082

原创 Android的Monkey

Monkey是一个运行在模拟器里或实际设备的Android工具。它向系统发送伪随机的用户事件流,例如按键、触摸屏,手势,以及其他系统级别的事件。使用Monkey能够以一种随机的但是可重复的方式对正在开发的应用程序进行压力测试。Monkey有许多选项,它们大致分为四类:· 基本配置选项,例如设置尝试的事件数量。· 运行约束选项,例如设置只对单独的一个包进行测试。· 事件类型和

2014-04-30 15:47:01 1134

原创 如何分析Android的Log

首先,让我们看一看AndroidLog的格式。下面这段log是以所谓的long格式打印出来的。从前面Logcat的介绍中可以知道,long格式会把时间,标签等作为单独的一行显示。[ 12-09 21:39:35.510  396: 416 I/ActivityManager ]Start procnet.coollet.infzmreader:umengService_v1 for

2014-04-30 15:46:58 2128

原创 SystemServer中的WatchDog

对手机系统而言,因为肩负着接听电话和接收短信的“重任”,所以被寄予7x24小时正常工作的希望。但是基于成本,普通的手机系统很难做到完全不出故障。但是大部分的故障都会做重启后消失,不会影响继续使用。所以简单的办法是,如果检测到系统不正常了,将设备重新启动,这样用户就能继续使用了。那么如何才能判断系统是否正常呢。通常的做法是在设备中增加一个硬件看门狗,软件系统必须定时的向看门狗硬件中写值来表示自己没出

2014-04-30 15:46:56 1496

原创 Android设置应用进程的安全上下文

理解了守护进程的安全上下文的创建过程后,我们再看看应用进程的安全上下文是如何创建的。应用进程是通过Zygote进程fork出来的,但是不会调用exec。在前面介绍Zygote进程时我们已经知道了创建应用进程时会调用函数ForkAndSpecializeCommon(),这个函数则通过调用selinux_android_setcontext()函数来设置应用进程的安全上下文,如下所示:rc =

2014-04-30 15:46:54 3418

原创 Android设置守护进程的安全上下文

前面我们已经介绍了客体的安全上下文是通过文件file_contexts来指定的。但是作为主体的进程,它的安全上下文又是在哪里指定的呢?我们知道,启动进程有两种方式,一种是通过init进程来启动守护进程,另一种是通过Zygote来启动应用进程。在“7.1.2节启动Service进程”中介绍service_star()t函数时有一段代码是关于获得守护进程的安全上下文的,让我们一起来看看:

2014-04-30 15:46:52 2561

原创 Init进程初始化安全上下文

selinux_initialize()函数调用selinux_android_load_policy()函数装载并向内核设置了策略文件后,接着调用了selinux_init_all_handles()函数,这个函数用来装载系统中所有文件和属性的安全上下文,下面我们看看这个函数的代码:voidselinux_init_all_handles(void){   sehandle =

2014-04-30 15:46:50 2546

原创 Init进程设置SELinux的Policy

Init进程的main()函数有一段代码用来初始化SELinux,如下所示:int main(......) { ......  //设置SELinux的回调函数union selinux_callback cb;cb.func_log = klog_write;                         selinux_set_callback(SELINUX

2014-04-30 15:46:48 3362

原创 SEAndroid的各种策略文件

在external/sepolicy目录存放了很多SELinux的策略定义文件。通过这些文件我们能了解到SEAndroid更多的细节,下面我们一起看看这些文件的内容。1.  角色定义文件roles角色定义文件用来定义SELinux系统的角色。文件roles的内容如下:roler;role rtypes domain;从这里可以看到,SEAndroid实际上只定义了一种

2014-04-30 15:46:46 2506

原创 SEAndroid简介

SEAndroid是Security Enhancementsfor Android(安全增强型Android)的缩写,这是一个把SELinux移植到Android中的项目,目前Android上的SELinux和标准Linux中的SELinux还有一些区别。如果希望了解这个项目的更多细节,可以访问网站http://selinuxproject.org/page/SEAndroid。SEAnd

2014-04-30 15:46:44 990

原创 Android图片资源的缩放问题

在Android的开发中,如何使用图片对很多开发人员是一个很头痛的事。最常见的问题是在一台手机上调试好的UI,在不同dpi的手机上会变形。Android提供了适配不同dpi的方案,每种dpi都有对应的资源目录。但是我们在开发程序时,对图片资源却不能这样处理,因为图片资源太大,如果我们每种类型的dpi都使用一套图片,应用的尺寸就会急剧膨胀,这可不是我们想

2014-04-30 15:46:42 1757

原创 Android资源匹配算法

当某种资源存在多个候选资源目录时,需要通过一种方式来找到最合适的资源。在Android的网站上提供了资源匹配的算法说明,让我们一起来学习。下面我们通过一个实际的例子来学习这个算法的执行过程。假设res目录下存在着下列资源目录:drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouc

2014-04-30 15:46:40 1877

原创 Mutex类使用Futex实现同步

下面我们将通过一个实际的例子来进一步的了解Futex的用法。前面我们介绍Bionic中的线程管理时介绍了pthread的临界区函数。临界区的实现中最重要的是上锁和解锁函数,下面我们看看它们的实现:1.       在Bionic的实现中,pthread_mutex_lock()调用了内部函数_normal_lock()来实现上锁功能,代码如下:static__inline__ voi

2014-04-30 15:46:37 3161

原创 Futex用户态操作

Futex的系统调用FUTEX_WAIT和FUTEX_WAKE只是用来挂起或者唤醒进程,Futex的同步机制还包括用户态下的判断操作。用户态下的操作没有固定的函数调用,只是一种检测共享变量的方法。下面将介绍如何将Futex用于临界区。首先需要创建一个整型计数器作为Futex变量,如果是进程间同步,这个变量必须位于共享内存。Futex变量的初始值为0。当进程或线程尝试持有锁的时候,检

2014-04-30 15:46:35 1551

原创 Android的Futex系统调用

在Linux中,Futex系统调用的定义如下#define __NR_futex             2401.       Futex系统调用的用法为:int futex (int *uaddr, int op,int val, const struct timespec *timeout,int *uaddr2, int val3);uaddr是Futex变量,一个共享的

2014-04-30 15:46:33 4129

原创 Futex同步机制简介

Futex是fast userspacemutex的缩写,意思是快速用户空间互斥体。它由HubertusFranke,MatthewKirkwood,IngoMolnar和RustyRussell设计并维护。我们这里讨论Futex是因为在Android中不但线程函数中使用到了Futex,甚至一些模块中在直接使用Futex作为进程间同步的手段,了解Futex的原理将有助于我们更深入的理解这

2014-04-30 15:46:31 2381

原创 Android build系统中常用LOCAL_变量

编写模块的编译文件,实际就是定义一系列以“LOCAL_”开头的编译变量,因此我们有必要弄明白这些变量的具体含义。下面是一些经常使用的LOCAL_编译变量的说明:变量名说明LOCAL_ASSET_FILES编译APK文件时用于指定资源列表,通常写成LOCAL_ASSET_FILES+= $(call find-subdir-assets)。LO

2014-04-30 15:46:29 5688

原创 Android签名漏洞分析

Android的签名在理论上可以防止别人破坏了软件后(例如加入恶意代码)还能以你的名义发布。但是Android的签名机制最近接连暴露了两个漏洞,导致整个签名机制形同虚设。第一个漏洞是由国外的安全公司 BlueboxSecurity发现的,这个漏洞自Android 1.6以来就一直存在,号称对99% 的android设备造成影响。恶意软件制作者可以在不破坏原有APK签名的前提下,利

2014-04-30 15:46:27 1360

原创 Android ART 的初始化和启动

ART的初始化 下面我们从JNI_GetDefaultJavaVMInitArgs(),JNI_CreateJavaVM()和JNI_GetCreatedJavaVMs()三个函数入手来了解ART的初始化过程。这三个函数的代码位于jni_internal.cc中。 JNI_GetDefaultJavaVMInitArgs()函数在ART中没有作为,只是返回JNI_ERR。如下所示: e

2014-04-30 15:46:25 1939

原创 Android ART模式简介

Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机。ART是AndroidRuntime的缩写,它提供了以AOT(Ahead-Of-Time)的方式运行Android应用程序的机制。所谓AOT是指在运行前就把中间代码静态编译成本地代码,这就节省了JIT运行时的转换时间。因此,和采用JIT的Dalvik相比,ART模式在总体性能有了很大的提升,应用程序不但运行效率更高,耗电量

2014-04-30 15:46:23 4000

原创 Android利用ptrace实现Hook API

Hook API的技术由来已久,在操作系统未能提供所需功能的情况下,利用HookAPI的手段来实现某种必需的功能也算是一种不得已的办法。笔者了解Hook API技术最早是在十几年前,当时是在Windows平台下开发电子词典的光标取词功能。这项功能就是利用HookAPI的技术把系统的字符串输出函数替换成了电子词典中的函数,从而能得到屏幕上任何位置的字符串。无论是16位的Windows9

2014-04-30 15:46:20 9598 5

原创 Bionic中的ptrace函数

ptrace函数的原型是:long ptrace(enum __ptrace_request request, pid_tpid, void *addr, void *data);q 参数request是请求ptrace执行的操作。q 参数pid是目标进程的ID。q 参数addr是目标进程的地址值。q 参数data的作用则根据request的不同而变化,如果需要向目

2014-04-30 15:46:18 1083

原创 Android原子操作的实现原理

Android原子操作的实现方式和CPU的架构有密切关系,现在的原子操作一般都是在CPU指令级别实现的,这样不但简单,而且效率非常高。下面看看arm平台下Android是如何实现原子操作的。虽然原子操作的接口函数有十来个,但是实际上只有两个函数中通过汇编代码实现了原子操作:函数android_atomic_add和android_atomic_cas,其他的函数都是在内部调用它们而已。这

2014-04-30 15:46:16 2837

原创 Android中的编译屏障和内存屏障

现代 CPU中指令的执行次序并不一定严格按顺序执行的,没有相关性的指令可以打乱次序执行,以充分利用CPU的指令流水线,提高执行速度。另外,编译器也会对指令进行优化,例如:调整指令顺序来利用CPU的指令流水线。这些优化方式,绝大部分情况工作的很好,但是在一些比较复杂的情况可能出问题,例如执行同步代码时就有可能因为这种优化导致同步原语之后的指令在同步原语前执行。内存屏障和编译屏障就是用来告诉CPU和

2014-04-30 15:46:14 2127

原创 gcc内嵌汇编介绍

阅读Android或Linux的源码时,有时会遇到使用内嵌汇编的代码。阅读内嵌汇编代码不是一件特别容易的事,如果只了解普通汇编语言,没学习过内嵌汇编,从语言上大概能明白内嵌汇编代码的作用,但是要精确的了解每行代码,每个寄存器的含义就不太可能了。内嵌汇编其实并不复杂,只不过gcc的内嵌汇编必须是AT&T格式,而且有自己一套独特的标记,加上资料很少,有限的资料写的又很晦涩,所以学习起来比较困难。本文争

2014-04-30 15:46:12 928

原创 AT&T汇编格式介绍

AT&T汇编格式主要用在Unix/Linux系统中,但是国内计算机课主要是以Intel汇编为主,其实这两种汇编只是语法格式不同而已,只要知道了两者的区别,有Intel汇编基础的人能很快的看懂AT&T汇编代码。下面是两种汇编主要的区别:1.  操作数大小AT&T中会在指令结尾用一个字母来表示操作数大小。其中:“b”表示byte;“w”表示word;“l ”表示long。Intel只是在处理内

2014-04-30 15:46:10 1274

原创 gcc汇编中的伪操作

学习gcc汇编编程,主要是学习gcc中定义的各种伪操作,下面是常见伪操作的说明:一、 段定义伪操作: 1. 标示段的开始伪操作:.text,.data,.bss说明:这三个伪操作分别表示代码段,数据段,未初始化数据段的开始。 2.  定义段指定段的属性。伪操作:.section格式为:.section name attr例如:.section .data,"a" 3.  设

2014-04-30 15:46:08 1725

原创 汇编语言的种类

汇编语言的种类 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令。不同架构的CPU指令并不相同,如x86,powerpc,arm各有各的指令系统;甚至同一种架构的CPU有几套指令集,典型的如arm除了有32位的指令集外,还有一套16位的thumb指令集。但是作为开发语言的汇编,本质上是一套语法规则和助记符的集合,它可以包容不同的指令集。如果从CPU体系来划分,常见的汇编有

2014-04-30 15:46:06 6996 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除