Android Binder原理(五)系统服务的获取过程
本文首发于微信公众号「后厂技术官」
前言在本系列的此前文章中,以MediaPlayerService为例,讲解了系统服务是如何注册的(addService),既然有注册那肯定也要有获取,本篇文章仍旧以MediaPlayerService为例,来讲解系统服务的获取过程(getService)。文章会分为两个部分进行讲解,分别是客户端MediaPlayerService请求获取服务和服务端ServiceManager处理请求,先来学习第一部分。
1.客户端MediaPlayerService请求获取服务要想获取MediaPlayerService,需要先调用getMediaPlayerService函数,如下所示。frameworks/av/media/libmedia/IMediaDeathNotifier.cpp
IMediaDeathNotifier::getMediaPlayerService(){ ALOGV("getMediaPlayerService"); Mutex::Autolock _l(sServiceLock); ...
Android Binder原理(四)ServiceManager的启动过程
本文首发于微信公众号「后厂技术官」
前言在上一篇文章中,我们以MediaPlayerService为例,讲解了系统服务是如何注册的(addService),既然有注册就势必要有获取,但是在了解获取服务前,我们最好先了解ServiceManager的启动过程,这样更有助于理解系统服务的注册和获取的过程。
另外还有一点需要说明的是,要想了解ServiceManager的启动过程,需要查看Kernel Binder部分的源码,这部分代码在内核源码中,AOSP源码是不包括内核源码的,因此需要单独下载,见Android AOSP基础(二)AOSP源码和内核源码下载这篇文章。
1.ServiceManager的入口函数ServiceManager是init进程负责启动的,具体是在解析init.rc配置文件时启动的,init进程是在系统启动时启动的,因此ServiceManager亦是如此,不理解init进程和init.rc的可以看Android系统启动流程(一)解析init进程启动过程这篇文章。rc文件内部由Android初始化语言编写(Android Init Language)编写的 ...
Android Binder原理(三)系统服务的注册过程
本文首发于微信公众号「后厂技术官」
前言在上一篇文章中,我们学习了ServiceManager中的Binder机制,有一个问题由于篇幅问题没有讲完,那就是MediaPlayerService是如何注册的。通过了解MediaPlayerService是如何注册的,可以得知系统服务的注册过程。
1.从调用链角度说明MediaPlayerService是如何注册的我们先来看MediaServer的入口函数,代码如下所示。frameworks/av/media/mediaserver/main_mediaserver.cpp
int main(int argc __unused, char **argv __unused){ signal(SIGPIPE, SIG_IGN); //获取ProcessState实例 sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm(defaultServiceManager()); ALOGI(" ...
Android Binder原理(二)ServiceManager中的Binder机制
本文首发于微信公众号「后厂技术官」
前言在上一篇文章中,我们了解了学习Binder前必须要了解的知识点,其中有一点就是Binder机制的三个部分:Java Binder、Native Binder、Kernel Binder,其中Java Binder和Native Binder都是应用开发需要掌握的。Java Binder是需要借助Native Binder来工作的,因此需要先了解Native Binder,Native Binder架构的原型就是基于Binder通信的C/S架构,因此我们先从它开始入手。源码是基于Android 9.0。
1.基于Binder通信的C/S架构在Android系统中,Binder进程间的通信的使用是很普遍的,在Android进阶三部曲第一部的最后一章,我讲解了MediaPlayer框架,这个框架基于C/S架构,并采用Binder来进行进程间通信,如下图所示。
从图中可以看出,除了常规C/S架构的Client端和Server端,还包括了ServiceManager,它用于管理系统中的服务。首先Server进程会注册一些Service到Servic ...
Android Binder原理(一)学习Binder前必须要了解的知识点
本文首发于微信公众号「后厂技术官」
前言Binder原理是掌握系统底层原理的基石,也是进阶高级工程师的必备知识点,这篇文章不会过多介绍Binder原理,而是讲解学习Binder前需要的掌握的知识点。
1.Linux和Android的IPC机制种类IPC全名为inter-Process Communication,含义为进程间通信,是指两个进程之间进行数据交换的过程。在Android和Linux中都有各自的IPC机制,这里分别来介绍下。
1.1 Linux中的IPC机制种类Linux中提供了很多进程间通信机制,主要有管道(pipe)、信号(sinal)、信号量(semophore)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket)等。
管道管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。管道的主要思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。这个共享文件比较特殊,它不属于文件系统并且只存在于内存中。另外还有一点,管道采用的是半双工通信方式的,数据只能在一个方向上流动 ...
Android Jetpack架构组件(六)一文带你了解ViewModel的使用和原理
本文首发于微信公众号「后厂技术官」
前言在本系列的第4和第5篇文章中,介绍了LiveData的使用和原理,LiveData和ViewModel是一对好搭档,这篇文章我们一起来学习什么是ViewModel、ViewModel基本使用、ViewModel的原理。
1.什么是ViewModel在说ViewModel前,我们需要解一下MVVM和DataBinding,在Android进阶三部曲第一部《Android进阶之光》中,我简单介绍了下MVVM和DataBinding。MVVM最早于2005年被微软的架构师John Gossman提出,在2015年Google I/O大会上发布了MVVM的支持库DataBinding,DataBinding遭到了一些开发者的诟病,主要是绑定数据时如果出现问题会很难排查,这样就没有一个合适的ViewModel规范来帮助开发者来实现MVVM。在2017年的Google I/O大会上,谷歌推出了ViewModel组件,来规范化ViewModel层。
ViewModel顾名思义,是以感知生命周期的形式来存储和管理视图相关的数据。ViewModel主要有以 ...
Android Jetpack架构组件(五)带你了解LiveData(原理篇)
本文首发于微信公众号「后厂技术官」
前言在上一篇文章中我们学习了LiveData的基本用法,我们知道LiveData是一个可观察的数据持有者,他是具有组件生命周期感知的,那么它是如何观察组件生命周期变化的呢?LiveData和RxJava的不同的是,LiveData并不是通知所有观察者,它只会通知处于Active状态的观察者,如果一个观察者处于DESTROYED状态,它将不会收到通知,这一点又是如何做到的?还有另外一点,Transformations的map方法其内部进行了什么操作?等等问题,会在这篇文章中给大家进行讲解。
1.LiveData如何观察组件生命周期变化通过调用LiveData的observe方法来注册观察者,LiveData的observe方法如下所示。frameworks/support/lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java
@MainThread public void observe(@NonNull LifecycleOwner owner, @No ...
Android Jetpack架构组件(四)带你了解LiveData(使用篇)
本文首发于微信公众号「后厂技术官」
前言在2017年前后,RxJava一直很火,我在Android进阶三部曲第一部《Android进阶之光》中就介绍了RxJava的使用和原理。谷歌推出的LiveData和RxJava类似,也是基于观察者,你可以认为LiveData是轻量级的RxJava。起初LiveData并不被看好,随着谷歌的大力推广,LiveData也慢慢的进入了大家的视野。一般来说,LiveData很少单独使用,它更多的和Android Jetpack的其他组件搭配使用,比如和ViewModel。这篇文章就来介绍LiveData的使用。
1.什么是LiveDataLiveData如同它的名字一样,是一个可观察的数据持有者,和常规的observable不同,LiveData是具有生命周期感知的,这意味着它能够在Activity、Fragment、Service中正确的处理生命周期。LiveData的数据源一般是ViewModel,也可以是其它可以更新LiveData的组件。当数据更新后,LiveData 就会通知它的所有观察者,比如Activiy。与RxJava的方法不同 ...
Android Jetpack架构组件(三)带你了解Lifecycle(原理篇)
本文首发于微信公众号「后厂技术官」
前言在上一篇文章中,我们学习了如何去使用Lifecycle,当然之会使用是不够的,还需要了解它的原理,这是成为优秀工程师必备的。这篇文章就来学习Lifecycle的基本原理。
1.Lifecycle的生命周期状态事件和状态Lifecycle使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。State指的是Lifecycle的生命周期所处的状态。Event代表Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。
Android 9.0的Lifecycle的源码如下所示。frameworks/support/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java
public abstract class Lifecycle { @MainThread public abstract void addObserver(@NonNull LifecycleObs ...
Android Jetpack架构组件(二)带你了解Lifecycle(使用篇)
本文首发于微信公众号「后厂技术官」
前言在上一篇文章中,我们基本了解了什么是Android Jetpack,这一篇文章来介绍Android Jetpack架构组件的Lifecycle,Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期,由于Lifecycle是LiveData和ViewModel的基础,所以需要先学习它。
1.为什么需要Lifecycle在应用开发中,处理Activity或者Fragment组件的生命周期相关代码是必不可免的,官方文档中举了一个例子,这里简化一下,在Activity中写一个监听,在Activity的不同生命周期方法中调用这个监听。
public class MainActivity extends AppCompatActivity { private MyListener myListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedI ...
Android Jetpack架构组件(一)带你了解Android Jetpack
本文首发于微信公众号「后厂技术官」
前言Android已经发展了11年,可以说是比较成熟的技术了,一开始时框架很少,也没有什么规范,所有的代码都是要自己写,比如网络请求,数据库请求,数据解析等等。后来出现了一些框架来帮助开发者快速进行开发,比如XUtils、Volley、OKHttp、EventBus等,随着框架越来越多,一个应用可以有多种技术选型,直接导致应用开发越来越不规范,导致做出来的应用质量参差不齐,这显然不是谷歌想看到的。谷歌随后推出了MVP和MVVM相关的官方例子,效果很一般,而且覆盖面只是在架构上,Goole I/O 2018大会上推出的Android Jetpack有望解决以上的问题。
1.Android Jetpack简介Jetpack并不是一个框架或者组件,它是一套库、工具和指南的集合,可帮助开发者更轻松地编写优质应用。这些组件可帮助开发者遵循最佳做法、摆脱编写样板代码的工作并简化复杂任务,以便将精力集中放在所需的代码上。Android Jetpack中的很多组件并不都是新开发的,而是很早就有了,比如在Goole I/O 2017大会时推出了 Android ...
Android Gradle (二)签名配置和依赖管理
本文首发于微信公众号「后厂技术官」
相关文章Gradle核心思想(一)为什么现在要用Gradle?Gradle核心思想(二)Gradle入门前奏Gradle核心思想(三)Groovy快速入门指南Gradle核心思想(四)看似无用,实则重要的Gradle WrapperGradle核心思想(五)通俗易懂的Gradle插件讲解Gradle核心思想(六)自定义Gradle插件的三种方式Android Gradle (一)Gradle的Android插件入门
前言本系列上一篇,我介绍了Gradle的Android插件的入门,这一篇来介绍一些Gradle进阶的内容,当然进阶内容非常多,这篇文章就总结一些相对重要的、常用的一些知识点,比如Gradle的签名配置和依赖管理。
1.Android签名文件配置在一般公司中,当团队比较小的时候,App的签名信息都是放到项目中的,甚至会上传到github上,这样做很是方便。但随着团队人数的增多,这样做的风险会越来越大,因为签名信息是重要的资源,这样就不能将签名上传到github上,也就不应该在build.gradle中直接配置签名。主要有以下的几种解 ...
Flutter基础(十三)Flutter与Android的相互通信
本文首发于微信公众号「后厂技术官」
ReactNative入门系列React Native组件Flutter基础系列
前言本来这篇文章应该讲一下Flutter的插件开发,但是在插件开发的基础是PlatformChannel,也就是Flutter与Android/iOS Native的通信,理解了这一个知识点,Flutter的插件开发也就不在话下。
1.PlatformChannel概述Flutter不能完成所有Native的功能,因此需要Flutter与Native的通信,Flutter提供了一套Platform Channel的机制,来满足Flutter与Native通信的需求。下面是PlatformChannel架构。图中可以看到,Flutter是Client端,Native是Host,Client和host通信是通过PlatformChannel,Client通过PlatformChannel向Host发送消息,Host监听PlatformChannel并接收消息,然后将响应结果发送给Client。消息和响应以异步方式传递,以确保UI不阻塞。另外,PlatformChann ...
Flutter基础(十二)路由(页面跳转)与数据传递
本文首发于微信公众号「后厂技术官」
ReactNative入门系列React Native组件Flutter基础系列
前言在Android开发中我们使用Intent来进行页面跳转,也称之为原生路由,后来出现了一些路由框架,比如ARouter。在Flutter中进行界面跳转的就是路由,路由用Route类来进行表示,Navigator是对Route进行管理的Widget。这一篇文章我们来学习路由和数据传递。flutter路由的使用方式主要有两种,一种是新建路由,一种是注册路由。
1.新建路由创建两个页面,第一个页面有一个按钮,点击这个按钮跳到第二个页面。先来实现第一个页面:
class FirstPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("第一页"), ), body: Center( ...
Flutter基础(十一)网络请求(Dio)与JSON数据解析
本文首发于微信公众号「后厂技术官」
ReactNative入门系列React Native组件Flutter基础系列
前言在Android开发中如果我们想要请求网络,可以使用HttpClent、HttpURLConnection,但在项目中一般都会使用OkHttp和Retrofit。在Flutter也是如此,系统提供了HttpClient,但在项目中一般会使用第三方库,比如http和Dio,如果你想找到更多的第三库,可以在pub.dartlang.org/ 上查找想要的库。本篇文章以Dio为例,另外还会介绍JSON数据解析方面的知识。
1.Dio的使用入门Dio是一个强大的Dart Http请求库,支持拦截器,全局配置,FormData,请求取消,文件下载,超时等。
添加依赖在pubspec.yaml中添加依赖。
dependencies: dio: 2.1.7
官网给出了一个简单的例子:
import 'package:dio/dio.dart';void getHttp() async { try { Response r ...
Flutter基础(十)布局Widget快速入门
本文首发于微信公众号「后厂技术官」
ReactNative入门系列React Native组件Flutter基础系列
前言Flutter的布局在此前的文章多多少少用过,但是没有具体讲过,Flutter的布局实际上也由Widget来控制的,在Flutter官网上并没有对布局Widget进行分类,这里将布局Widget根据子元素排列方式分为以下几种:
线性布局Widget
流式布局Widget
层式布局Widget
弹性布局Widget
下面分别介绍这几种布局Widget。
1.线性布局Widget线性布局类似于Android中的LinearLayout,可以垂直也可以水平排列,Flutter的线性布局有两个:
Row:水平方向的线性布局。
Column:垂直方向的线性布局。
Row和Column的使用方法类似,举个Row的例子,Column自然而然也就会了。
import 'package:flutter/material.dart';void main() => runApp(RowWidget());class RowWidget extend ...