如何穿越到android底层

对于android开发,实际上大部分工作都是在应用层,但为了体现"技术含量",以及"知其所以然",以便在遇到问题是不至于束手无策。因此有必要了解底层的工作机制。

由于android是开源的系统,因此学习其内部的工作机制是非常容易的,目前也有一些关于android源码分析的书籍。

我一直认为,应用层的开发和底层没什么太大的关系,不过有一次因为应用权限的问题,也算是对android framework层有一些了解了,借助一本源代码分析的书籍了解android的工作原理并没有想象中那么困难。

与其他地方不同是本人使用了鲜为人知的代码注入技术(并非依赖注入),对于具有root权限的android设备,只需要往系统进程中注入一个.so文件,再用这个.so文件去获取jvm执行环境,就可以加载java代码,这样就将自己的java代码注入到系统进程中。

注入java代码以后就可以在framework层执行操作了,因此我们成功的从应用层穿越到android底层。

当然如果要在framework层执行自己编写的代码,直接替换系统文件也是可以的。一种方式是下载安卓源代码,构建编译环境,还有一种方式是对系统中的jar文件进行反编译在编译回去这也是可行的。参考(未测试):http://dss16694.iteye.com/blog/1436466

代码注入参考:http://blog.csdn.net/jiangwei0910410003/article/details/40949475

当然替换系统文件和代码注入都需要有root权限,最新的android默认启用了SELinux,获取root权限可能会遇到麻烦,因此最好是使用4.3以下的系统来研究。

android底层是基于linux的,系统开机后,首先运行的是linux,android的运行环境从app_process的可执行文件开始运行,由init.rc指定文件路径以及启动参数。app_process中启动了jvm,随后就进入了java的世界,java的程序都大部分都放在/system/framework文件夹下,与普通的jar包不同,这里的java是基于dalvik。反编译可以得到普通的jar文件,放在项目中可以作为lib使用,通过jar的函数调用系统的功能。

如果你想弹窗体出来玩玩可以参考这里。
http://blog.csdn.net/innost/article/details/47660193
(这可不是一般的窗体)

dalvik虚拟机的内容,以及最新的art的内容请自行百度或谷歌进行了解。

关于android的系统的加载过程,以及各种系统服务相关的内容的分析,请参考安卓源码分析的书籍。

从android系统的结构可以看出,android的很多代码是用java实现的,而java是可以跨平台的,理论上只要让启动程序app_process以及相关的可执行文件能在windows等系统上运行,android就可以直接运行于windows等其他的操作系统上。

实际上这样的移植已经有人实现了,Chrome ARC上就可以,虽然很多软件还运行不起来,目前看到的有WindowsAndroid也是通过移植的方式来运行android而不是通过虚拟机,可能还有其他的。

不过我还没有看到开源的项目,或者已经有这样的开源项目我还没有发现,如果有谁知道告诉我一下哈。

另外一个有意思的事件就是可以将android的UI,单独拿出来,这样就可以用开发安卓应用的方式开发桌面应用了,android的UI有现成的开发工具和众多的开发人员。java中的swt以及swing都已经快要被遗忘了。

好了,先就说这么多了,更多内容请关注我的微信公众号:zhaojieTec

时间: 2024-10-03 22:54:36

如何穿越到android底层的相关文章

Android底层驱动开发(一)

1   Android为什么要加入硬件抽象层HAL A    统一硬件调用接口,所以利用HAL屏蔽linux驱动的复杂不统一的接口 B   解决GPL版权问题,由于linux内核基于GPL协议,这个GPL协议需要开源,而Android遵守Apache License2.0协议,这个协议不要求开源,因此google玩了个穿越,将原本位于Linux驱动中的敏感代码(业务逻辑代码)向上移动了一层,这样这些敏感代码就拜托了GPL协议的束缚,那些不想开源的linux驱动作者不想开源现在就可以不用开源了.

[android底层] hal硬件抽象层编写

两个与hal有关的结构体 hw_module_t ,hw_device_t 一.jni和hal之间的关系 Tip:几种app,jni,hal,framework之间的关系框架     这篇文章用的框架是第二种框架的编写,他们的关系如下: 可以看出jni主要通过pModule和pdevice来获取hal中的变量来操作hal层 二.jni操作hal 获取hal层:1.jni获取hal层的module和device对象 操作hal层:2.jni操作hal层 jni操作hal完整代码参考[android

Android底层开发之Audio HAL

http://blog.csdn.net/kangear/article/details/44939429 Android底层开发之Audio HAL 在Android音频底层调试-基于tinyalsa中以「抛开Android的天生复杂,回归嵌入式Linux的本质」的方式介绍如何调试Linux内核中的音频驱动. 这里向上再伸展一下进入HAL层,看是如何将tinyalsa封装给Frameworks使用的. 基于4.2.2版本源码进行讨论.Android官方教程是Audio Implementing

【转】Android 底层开发的几点

我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径.根据前辈的经验,Android底层完全入门需要两年. 先说下我的入门过程:第零步,下载源码,我下的4.2的,框架层源码10G,内核2G多,ctags给框架层建的标签文件都有600M,当时让我有点震撼,用的vim+ctags+cscope来阅读,还算不错,架构挺清晰的. 第一步,我找到了一本好书<Android的设计与实现 第一卷>它讲了Android框架层的启动,初始化,服务框架初始化,Bin

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. http://blog.csdn.net/kangear/article/details/40072707 在调试一下红外遥控器input驱动时,直接採用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同一时候遇到了一些关于input输入子系统的疑惑. 按键一般有「按下和抬起」两个状态一般使用0和1

Android底层开发之音频输入通道的软硬件分析

Android底层开发之音频输入通道的软硬件分析 我们都知道耳机Mic集成在一直的那种四段耳机Mic插头是Android设备上比较常用.但是也会有分开的情况,比较如果在普通的PC机中装Android系统,那么就是这种情况.所以就有必要对音频输入通道的软件硬件进行统一的分析一下,接下来分析一个实例. 该设备的硬件连接为:基于3157的模拟开关实现的 通道切换. 设备是完全靠硬件实现的,那么就没有软件的什么工作了.但是这并不是一个理想的实现方法,真下的实现方法应该是所有的Mic都是并行的,每个Mic

Linux内存管理之mmap详解 (可用于android底层内存调试)

注:将android底层malloc换为mmap来获取内存,可将获取到的内存添加tag,从而再利用meminfo进行分析,可单独查看该tag的内存,从而进行分析. 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.munmap执行相反的操作,删除特定地址区域的对象映射. 当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用rea

Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值

Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是无用的,甚至是错误的.重点在最后,前边仅仅是一些假想推测. http://blog.csdn.net/kangear/article/details/40072707 在调试一下红外遥控器input驱动时,直接采用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同时遇到了一些关于input输入子系统的疑惑. 按键一般有「按下和抬起」两个状态一般使用0和1来分

写给Android App开发人员看的Android底层知识(2)

(五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管.估计是Android底层开发人员先写了ActivityManagerService用来管理Activity,后来写Service.Receiver.CP的时候发现代码都差不多,于是就全都用ActivityManagerService,但是却忘记改名字了——我也是猜的,纯属八卦. 由此而说到了插件化