art和Dalvik的一些知识

 分类:Android, Java 阅读 (1,214)  art和Dalvik的一些知识已关闭评论
7月 072020
 
一、Art的诞生

  Art是在Android4.4系统中加入的,但是默认是不开启的

  Art和Dalvik的切换是通过指定一个系统设置项来切换的,见art/Android.mk中.PHONY: use-art下面那一段脚本

  本文摘录片段

  libdvm.so是DalvikVm的so库

  libart.so是Art Vm的so库

  之所以两个能同时切换,是因为他们都实现了JNI_Create_JavaVm的入口函数。

二、Art的崛起

  在Android4.4加入Art之后,一直是默认没有开启的,直到Android5.0,DalvikVm彻底被删除,art担当大任

  可以对比下4.4和5.0源码中dalvik/vm下的代码结构

  http://androidxref.com/4.4_r1/xref/dalvik/vm/

  http://androidxref.com/5.0.0_r2/xref/dalvik/vm/

  可以看到从5.0开始,dalvik的代码已经被删除掉了

 Posted by on 2020-07-07

Android中art虚拟机启动流程

 分类:Android, Java 阅读 (1,811)  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,961)  Flutter报Could not resolve io.flutter:flutter_embedding_debug问题解决已关闭评论
6月 132020
 

解决办法:

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

文字版:

 

 Posted by on 2020-06-13

Activity的onSaveInstanceState方法的官方解释

 分类:Android, Java 阅读 (1,303)  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,720)  顶栏phone.StatusBar中makeStatusBarView函数分析(未完)已关闭评论
6月 012020
 

本文 基于Android8.1系统

 

 Posted by on 2020-06-01

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

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

 

 Posted by on 2020-05-28

ActiveServices.bindServiceLocked代码分析

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

 

 Posted by on 2020-05-28

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

 分类:Android, Java 阅读 (2,097)  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 阅读 (908)  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