Android中art虚拟机启动流程

 分类:Android, Java 阅读 (1,379)  Android中art虚拟机启动流程已关闭评论
7月 072020
 

本文基于Android8.1系统进行研究

一、启动zygote

在Linux内核启动完成后,首先启动系统的第一个进程init进程

init进程会读取init.rc中的配置文件

其中有Zygote的配置,init进程将启动zygote进程

zygote的入口在app_main.cpp中的main函数中

二、解析传入参数,调用AndroidRuntime的start方法

在app_main.cpp中的main函数中,首先解析传入的相关参数,并通过如下代码进入ZygoteInit的main函数中

runtime是AppRuntime的一个实例,AppRuntim继承自AndroidRuntime

start函数定义在AndroidRuntime中,下面是start函数的注释

start函数中的这段代码切入到了startVm函数中

三、startVm函数

这个函数前边也是一堆处理Vm启动参数的逻辑

在函数的最好调用JNI_CreateJavaVM函数通过c++层的库创建虚拟机

四、JNI_CreateJavaVM函数

JNI_CreateJavaVM函数是在art/runtime/java_vm_ext.cc中实现的,代码如下:

Runtime是在art/runtime/runtime.h中定义的类

Runtime::Current()返回一个静态的Runtime实例,代码如下:

runtime-Start()启动虚拟机

五、其他参考文章

Android ART运行时无缝替换Dalvik虚拟机的过程分析

https://blog.csdn.net/zhu929033262/article/details/77053640

Android虚拟机art流程:从zygote开始梳理art的启动(1)

https://www.shennongblog.com/art-zygote/

 Posted by on 2020-07-07

Flutter报Could not resolve io.flutter:flutter_embedding_debug问题解决

 分类:Android, Java 阅读 (2,551)  Flutter报Could not resolve io.flutter:flutter_embedding_debug问题解决已关闭评论
6月 132020
 

解决办法:

打开build.gradle文件,增加如下maven仓库地址:

文字版:

 

 Posted by on 2020-06-13

Activity的onSaveInstanceState方法的官方解释

 分类:Android, Java 阅读 (971)  Activity的onSaveInstanceState方法的官方解释已关闭评论
6月 032020
 

基于Android8.1系统源码中的注释翻译

翻译如下:

  在一个Activity被杀死之前被调用以取出Activity中每个对象实例的状态,这些状态可以在onCreate或者onRestoreInstanceState方法中被重新加载到实例(此方法产生的Bundle将传递到那两个方法)。

  这个方法在一个Activity可能被杀掉之前(不是刚刚被杀之前)被调用,以便于之后某些时候Activity被重新打开时可以恢复它的(某些变量的)状态。比如,如果ActivityB被打开并显示在ActivityA之前(ActivityA被置于后台),在某些时候ActivityA由于系统资源回收被杀掉,AvtivityA将有机会使用此方法来保存用户界面的当前状态,以便当用户回到ActivityA时,用户界面的状态可以在Activity的onCreate或者onRestoreInstanceState中被恢复。

  不要把这个方法和Activity的生命周期比如onPause和onStop混淆。比如,当从ActivityB退出返回到ActivityA时,onPause和onStop将被调用,但是onSaveInstanceState不会被调用,此时没有必要对ActivityB调用此方法,因为ActivityB将被销毁,并且不会被恢复。另外一个例子,当ActivityB被打开并显示在ActivityA之前时,系统可能会避免调用ActivityA的onSaveInstanceState方法,因为在ActivityB的生命周期内,ActivityA的ui状态可能一直保持完整。

  大部分UI组件的实例的(状态保存)默认实现是通过对布局中有id属性的view调用view自身的onSaveInstanceState()方法,通过id保存当前有焦点的view(通过view的onRestoreInstanceState来恢复状态)。如果你想使用这个方法来保存某个view的状态,最好使用view自身的onSaveInstanceState来处理,否则每个(Activity中)的view实例都需要你写代码来维护。

  如果此方法被调用,将在onStop之前发生,但是不能保证肯定是在onPause之后发生

原文如下:

 

 Posted by on 2020-06-03

顶栏phone.StatusBar中makeStatusBarView函数分析(未完)

 分类:Android, Java 阅读 (1,369)  顶栏phone.StatusBar中makeStatusBarView函数分析(未完)已关闭评论
6月 012020
 

本文 基于Android8.1系统

 

 Posted by on 2020-06-01

Android8.1系统源码中如何判断一个ServiceRecord对应的服务是运行状态

 分类:Android, Java 阅读 (1,029)  Android8.1系统源码中如何判断一个ServiceRecord对应的服务是运行状态已关闭评论
5月 282020
 

 

 Posted by on 2020-05-28

ActiveServices.bindServiceLocked代码分析

 分类:Android, Java 阅读 (774)  ActiveServices.bindServiceLocked代码分析已关闭评论
5月 282020
 

 

 Posted by on 2020-05-28

Android8.1去除user模式下允许usb设备连接提示框

 分类:Android, Java 阅读 (1,768)  Android8.1去除user模式下允许usb设备连接提示框已关闭评论
5月 262020
 

去除下图所示提示框:

修改文件:frameworks/base/services/usb/java/com/android/server/usb/UsbDebuggingManager.java

增加import头

在处理MESSAGE_ADB_CONFIRM消息那一段,把startConfirmation(key, mFingerprints);去掉,改成如下代码

 

 Posted by on 2020-05-26

Android组件绘制流程

 分类:Android, Java 阅读 (633)  Android组件绘制流程已关闭评论
5月 212020
 

首先是在ViewRootImpl.java中的performTraversals中开始的?

最主要的有三个子函数

performMeasure、performLayout、performDraw

这三个函数分别对应View中的onMeasure、onLayout、onDraw

onMeasure是为了计算view的宽度和高度

最后使用setMeasuredDimension设置view的宽度和高度

onLayout是为了给子组件设置尺寸和位置(如果组件是个容器?)
onDraw是具体的窗体绘制函数
 Posted by on 2020-05-21

Choreographer学习记录

 分类:Android, Java 阅读 (869)  Choreographer学习记录已关闭评论
5月 202020
 
一、官方介绍

Choreographer是用于协调动画、输入和绘图的时间的。

Choreographer从显示子系统接收时间脉冲(比如垂直同步),然后安排下一个显示帧渲染工作。

应用通常通过动画框架和视图层次结构的高级抽象方法与choreographer进行交互。下面是一些可以通过高级api可以做的操作:

使用android.animation.ValueAnimator#start

未完……

二、Choreographer可以协调的操作类型

1. CALLBACK_INPUT = 0

输入回调,最先执行的,优先级比较高

2. CALLBACK_ANIMATION = 1

动画回调,在traversals之前运行

3. CALLBACK_TRAVERSAL = 2;

遍历回调,处理layout和draw,在所有的异步信息处理之后运行。

4. CALLBACK_COMMIT = 3;

处理frame的post-draw操作。在traversal操作完成后运行。

三、Choreographer是如何管理各种回调的

是由一个CallbackRecord组成的链表来记录要执行的各种回调的

是由一个CallbackQueue数组来管理这些链表的(添加、删除),每一种回调类型一个CallbackQueue

mHead是第一个CallbackRecord,执行时间最近的一个

为什么要重新写一个CallbackQueue?

因为这个队列使用的很频繁,所以自己封装一个轻量级的Queue

四、Choreographer是如何与上层Api交互的

如上图:上层框架创建Choreographer的实例,并循环进行调用

五、mCallbackPool对象的使用(性能优化)

其中obtainCallbackLocked是用于试图新建一个CallbackRecord,recycleCallbackLocked是用于回收一个CallbackRecord

重复利用mCallbackPool,尽量避免重复创建CallbackRecord

六、为什么不用Handler管理?

因为它还有自己其他的业务逻辑,比如CallbackQueue。

 

 Posted by on 2020-05-20