刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。
上节我们学习了API的概况,这节开始我们就循着API来分析实现。 对于解释器或者编译器来说,我们第一个感兴趣的当然是编译的过程。
v8这么好玩的东西,我们当然要冲起去看看它的内部是如何实现的了。 第一讲我们先从v8提供的api说起
Rust语言是一门没有GC的语言,那么,它是如何管理内存的呢?
Android M的Activity启动的完整流程
Android Studio的instant run会影响启动时间
二分法是针对一个排序后的容器的用法,如果是多个有序容器,我们就可以快速地在其基础上进行集合的求子集,交集,并集与差集等运算。
讲完容器之后,我们迅速进入到算法部分。首先我们就切入到传统认为算法中最重要的排序算法
第二讲我们迅速地为STL画一张大图,把13种基本容器的简单用法,迭代器和算法的概念快速地过一下。 有兴趣的同学就可以对照着手册去使用它们了。当然,细节问题还很多,我们还要花不小的篇幅的讲各种细节。
std::pair是C++98就有的功能,std::tuple是TR1新增的。C++11的两个特性为pair和tuple带来很大帮助,一个是auto的类型推断可以帮助我们少写代码,二是C++11支持变参数的模板,使得理论上可以支持任意多个数量的参数。tuple来自boost库,但是没有C++11支持
前面,我们对于快速编译器的知识有了一点了解,对于CompilerDriver,MIRGraph等都有了初步的印象。 下面,我们回头看一下优化编译器的编译过程。
关于bootchart,网上已经有很丰富的文章介绍了。但是,这些文章都是讲在Linux下如何使用。 做为开发Android的mac用户,还要使用Linux机器做中转,实在是太麻烦了。尤其是Ubuntu 12.04上默认的bootchart工具还有问题,需要更新python脚本。 事实可以更
下面我们正式开始分析InlineMethod将Dalvik字节码转成MIRGraph的过程.
我们从Dalvik指令开始讨论中层中间代码MIR
通过using定义类型的别名
ART快速编译器下的方法编译
正如Android有Activity, Service, ContentProvider和Broadcast四大组件,ART中也有几个大组件:CompilerDriver, ClassLinker和Runtime
ART的编译器为两种,一种是QuickCompiler,快速编译器;另一种是OptimizingCompiler,优化编译器。 下面我们就分析一下这两种编译器的基本结构。
dex2oat从main到编译每个类的流程
跟学院派的厚书给大家的印象不同,其实用LLVM写个简单的编译器是件容易的事情,因为大部分事情LLVM都替我们做了。
前面,我们花了相当多的篇幅把PackageManager的公开API分门别类,并按版本顺序讲解了发展的过程。 有的同学问了,既然installer相关的API在Android 5.0才引入,那么Android 4.4及之前的应用安装的程序是怎么写出来的呢? 答案是,还有未公开的内部API啊。
PackageManager武器库的完结篇,让我们梳理一下从Android 1.0到Android 7.0的发展过程吧。
Install相关的API,在Android 1.0时一个也没有。全是后续陆续增加进来的。 我们发现,除了4.2的是补充4.0的以外,基本上全是逢大版本才有更新:2.0,3.0,4.0,5.0都有新货。
这一节我们将学习: 如何查询系统中安装了哪些应用 如何获取一个包的信息 如何获取一个Application的信息 如何获取系统中安装的所有的ContentProvider的信息 如何获取一个uid中运行的所有的包 如何查询一个uid的进程名
PackageManager中提供的武器,可以用“既多又杂,版本变化大”来形容。 不过,我们通过分类和排序的方法将它们组织起来,让开发者同学们可以学会使用这些强大的武器! 这一节我们将学习: * 如何查询系统中都有哪些权限组 * 每个权限组都有些什么权限 * 如何查询是否被授予某一权限
PackageManager, ApplicationPackageManager和PackageManagerService之间的关系
前面我们讨论过dex2oat的过程,下面我们开始探索系统中的重要工具进程,installd守护进程。
ELF中的section和segment
既然是要探险,咱们就保持一定的深度,起码将来可以做个基于ART的黑客之类的。 所以我们针对细节多下一些工夫,先仔细分析一下OAT文件的格式。
希望给大家留个印象就是Go语言还是很容易上手的。
对于编译Java的话,有一个问题不能不考虑,就是异常处理的问题。异常处理是基于Java的语句块的,翻译成本地代码的话,需要针对这些指令的地址进行一下重排。 我们来看下ART是如何实现异常处理的。
synchronized关键字所对应的指令和实现
Java字节码是支持面向对象编程的,比如new和instanceof都是一条指令。它们被编成OAT之后变成了什么样子呢?
Java中有专门处理数组相关的指令,并且有对越界检查等操作。这样,OAT编译出来的数组相关的代码,与本地C++写出的类似代码之间,就有了很大的不同。
在jvm,arm, arm64, mips, x86, x86_64上都是如何实现分支和循环结构的
计算机的核心功能就是计算,Android为我们提供了一个让JVM,ARM, ARM v7a, ARM64, x86, x86_64, mips, mips64共舞的舞台,让我们一起看看它们的计算分别是如何实现的吧
指令系统的第一讲,我们学习一下数据传送指令和移位指令
我们从去年开始走入了ARM的64位时代,本文尝试用最少的知识量,让大家对ARM64-v8a有一个印象,希望篇幅控制在能够让大家在上个厕所或等个公交之类的时间看完
我们先看一下Java字节码的指令集,然后从一些简单指令,从java字节码一直讲到ARM64机器码!让大家先有一个整体的概念。
看了下很多书上和网上文章中介绍ECMAScript中的布尔值,都是干巴巴地一句话:如果值是null, undefined, 0, 空字符串和false,则值为false,其他值都是true.说得当然是没错,不过不利于初学的同学理解。 其实,借着学习真假值的时候,正好是可以将很多知识串在一起的时候。
ART世界探险,第一章
我们通过mmap为入门途径,开始探索ART的内存分配吧〜
生命不息,折腾不止,让我们一起跟随Android Studio继续折腾。
激动人心的时刻到了,从这一刻开始,我们可以通过Android的Java来调用go写的代码了!
如何用Go语言写跨平台的用于手机上的应用,我们以Android为例分析本地应用的写法。
ActivityManager的killBackgroundProcesses背后的故事
处理完广播之后,BroadcastQueue会记录一段历史用于调试
tips:性能攸关的广播,该发前台广播就发。CTS广播性能问题不过,也可以改成用前台广播。
现在让我们开始破解Android中的一个trick,普通广播都是并发的吗? 带着这个问题,我们来看ActivityManagerService.broadcastIntentLocked中的实现逻辑。
前面我们讲了,消息分为普通消息和有序消息两大类。普通消息是可以并发的,由于是并发的,这些广播的处理者之间互相是不依赖的。 另外,并发队列和串行队列都各维护了一条后台广播队列和前台广播队列。如果这个消息足够重要,想走快速通道的话,可以选择使用前台广播队列。 对于并发队列,如果是进程活着,动
关于Broadcast,有几点需要了解。首先是广播的类型,然后是广播的发送方法,最后是广播是如何被接收的。这三者相辅相承的,比如普通广播和有序广播只有在详细了解了广播的接收过程了之后,才能真正明白它的含义。