#Android 历史版本
参考链接:一篇文章让你了解Android各个版本的历程 - 知乎 (zhihu.com)
三个部分:api等级、版本号、代号(这三个东西都是指的同一个系统)
API等级:在APP开发的时候写在清单列表里面的
版本号:在创建工程的时候是写的版本号
需要特别注意的是从安卓5.0开始,Android系统开始改用ART虚拟机,安卓系统也开始分32位和64位版本。
#安卓体系结构
一、应用层
应用层包括手机上的所有APP,无论是系统自带的还是用户开发的。他们都是基于第二层应用框架层开发的。除了用到java的一些代码之外还会用到android提供的一些api。(指纹js就是要取浏览器东西,比如取cookie)
二、应用框架层
Android开发人员接触最多的就是框架层,该层提供了各种各样的系统API,开发人员通过使用这些API来构建上一层的各种各样的APP。这些API包括且不限于:Activity Manager(控制Activity的生命周期等)、Notification Manager(提供通知相关的功能)、Content Provider(实现应用程序间的数据共享)、Resource Manager(管理非代码资源,比如布局文件,图片资源,字符资源等等)、View(提供常见的视图控件)、Alarm Manager(提供闹钟相关服务)等等。
三、库层
第三层包含两部分内容:
第一部分是Native C\C++系统库层,主要提供一系列第三方类库,常见的有系统C库、多媒体库(播放媒体文件)、SGL(2D图像引擎)、Free Type(渲染位图和矢量字体)、Sqlite(轻量级数据库)、SSL(Secure Socket Layer)、Webkit(提供网络工具)等等;
第二部分是运行环境,包括Dalvik虚拟机和Java核心库。关于Dalvik虚拟机和JVM的区别:Dalvik是基于寄存器的,JVM是基于栈的。JVM运行.class文件,每个.class文件对应一个类;Dalvik虚拟机将.class文件转为.dex文件,只有一个.dex文件,包含了所有的类,并且通过性能优化转为.odex文件。基于寄存器的虚拟机运行速度更快,文件更小,效率更高,适合移动端。另外Dalvik虚拟机需要更多的指令空间。
四、内核层
Android系统底层是基于Linux系统的,主要提供各种硬件驱动。
#需要学习的代码
java (java不能直接操控底层的一些代码 所以需要用到C++)
JNI (java和C、C++之间不能直接调用 需要中间人JNI)
C/C++ (so文件 PC端的一些线程写好的一些库文件 可以直接拿来用 java调用一下C即可 就不用再写代码了)C、C++反编译的难度比较大 java反编译比较容易 一些重要的业务逻辑的代码会放到C或者C++里面去写 如果so里面调用的不是现成的加密库,那就还需要自己学一点ARM汇编的知识 C代码反编译的难度比较大 反编译出来的还是伪C的代码 伪C的代码还是不太靠谱 所以需要学到一些汇编的知识。但是只是在so使用自定义算法的时候。如果使用的是现成的加密库,那我们通过IDEA 的f5插件反编译出来的c的代码就可以简单的猜一下,调用了那个加密库,传进去什么值,给了什么密钥,使用了哪种模式,哪种填充方式,再配合一下动态调式即可。
Android (这里面许多so文件就是用C或者C++写的 )
打包成一个APK 反编译之后 正常的代码是smali代码 并不是java源代码
smali 我们在动态调试的时候也是smali代码 不是源代码 所以也需要对smali代码了解