bcoder

Android中一些系统类的研究

 分类:Android, Java 阅读 (8)  Android中一些系统类的研究已关闭评论
7月 152020
 
1. ResolveInfo

用于根据intent获取AndroidManifest.xml中的Activity或者Service或者Provider中包含对应的intent-filter的信息?

成员包括ActivityInfo、ServieInfo、ProviderInfo、Icon等。

2. ActivityInfo

从AndroidManifest.xml中获取的应用的activity或者receiver的信息。

3. ActivityStackSupervisor

ActivityStack主管,在ActivityManagerService中使用一个ActivityStackSupervisor来管理所有的ActivityStack?

通过查找系统所有代码发现,只有在此类的createStack函数中新建了ActivityStack实例(并不是说只创建了一个实例),所以所有的ActivityStack是通过这个对象来管理的。

也只有在ActivityManagerService中新建了一个ActivityStackSuperVisor实例,也就是系统中只有一个ActivityStackSupervisor对象

另外这个类还负责和PackmanagerService的一些交互,还用于判断进程是否存在(调用ams的函数),并起动新进程(调用ams的函数)

4. ActivityRecord

用于表示Activity的一结构,包括Activity相关的很多信息。

5. ActivityStarter

诠释如何启动Activity的控制器。

根据intent和flag信息,并将这些信息准备相应的activity、Activity Task和Activity Stack的信息。

我看了一下代码,主要是根据intent中的flag信息处理相关的Activity、Activity Task和Activity Stack的相关信息。

6. ActivityStack

Activity栈类,用于管理某个Activity栈。

其中:

final ArrayList<ActivityRecord> mLRUActivities – 是用于存储正在运行Activity列表,列表中最外面一条记录,是最近使用的Activity

7. TaskRecord

final ArrayList<ActivityRecord> mActivities – 此Task中的Activity列表

private ActivityStack mStack; – 此Task所在的Activity栈

 

 

 Posted by on 2020-07-15

art和Dalvik的一些知识

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

解决办法:

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

文字版:

 

 Posted by on 2020-06-13

Activity的onSaveInstanceState方法的官方解释

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

本文 基于Android8.1系统

 

 Posted by on 2020-06-01

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

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

 

 Posted by on 2020-05-28

ActiveServices.bindServiceLocked代码分析

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

 

 Posted by on 2020-05-28

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

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