AllenWang的个人博客

小楼一夜听春雨


  • 首页

  • 分类

  • 归档

  • 标签

  • menu.ad

Andromeda:适用于多进程架构的组件通信框架

发表于 2018-05-16

引言

其实Android的组件化由来已久,而且已经有了一些不错的方案,特别是在页面跳转这方面,比如阿里的ARouter, 天猫的统跳协议, Airbnb的DeepLinkDispatch, 借助注解来完成页面的注册,从而很巧妙地实现了路由跳转。

但是,尽管像ARouter等方案其实也支持接口的路由,然而令人遗憾的是只支持单进程的接口路由。

而目前爱奇艺App中,由于复杂的业务场景,导致既有单进程的通信需求,也有跨进程的通信需求,并且还要支持跨进程通信中的Callback调用,以及全局的事件总线。

那能不能设计一个方案,做到满足以上需求呢?

这就是Andromeda的诞生背景,在确定了以上需求之后,分析论证了很多方案,最终选择了目前的这个方案,在满足要求的同时,还做到了整个进程间通信的阻塞式调用,从而避免了非常ugly的异步连接代码

阅读全文 »

bindService()过程解析

发表于 2018-04-25 | 分类于 android_deep_analysis

引言

在做IPC架构时,bindService()是一个绕不过的话题。基于此,本文打算深入研究bindService()的完整过程,并且尝试回答以下几个问题:

  • bindService()过程系统到底做了什么?
  • 使用Activity Context和Application Context进行bindService()的效果是一样的吗?

回答以上问题的目的其实是为了回答以下这个终极问题:

进行IPC通信是否一定要采用bindService(),有没有可能采用其他的方案

阅读全文 »

SkipList的原理与实现

发表于 2018-02-07 | 分类于 data_structure

简介

SkipList(跳表)这种数据结构是由William Pugh于1990年在在 Communications of the ACM June 1990, 33(6) 668-676 发表了Skip lists: a probabilistic alternative to balanced trees,在其中详细描述了他的工作。由论文标题可知,SkipList的设计初衷是作为替换平衡树的一种选择。

我们都知道,AVL树有着严格的O(logN)的查询效率,但是由于插入过程中可能需要多次旋转,导致插入效率较低,因而才有了在工程界更加实用的红黑树。

但是红黑树有一个问题

阅读全文 »

Pinoc:热修复的另一种可能性

发表于 2018-01-22

引言

从Qzone的超级补丁,阿里的AndFix, 到微信的Tinker再到美团的Robust,热修复经历了dex分包,方法hook到dex全量替换以及利用Instant Run原理往每个方法中插入一段跳转代码来实现,而这4种方法中,除了阿里的AndFix之外,其他三种都依赖DexClassLoader,这样做容易带来的问题有:

  • 兼容性问题,比如国产手机厂商对于ROM进行了魔改,那么就可能会在某些机型上失效甚至crash
  • 审核无法通过的问题,由于国内应用商店其实还处于群龙无首的激烈竞争状态,所以一般国内的应用商店不会对App有太严格的审核要求,但是对于那些想要进入国外市场的App,则会遭遇到Google Play严苛的审核,其中热修复又是最为敏感的,而且DexClassLoader类也不可能进行混淆,所以很容易被扫描到。

考虑到AndFix在5.0之后其实就已经由于ART的兼容性问题力不从心(虽然后面的Sophix在此基础上做了很多改进,但是在最新的系统上还是有一些兼容性问题),如果想要实现稳定的热修复,同时又能够使App能够顺利通过Google Play的审核,有什么好的办法呢

阅读全文 »

Annotation Processing 101 译文

发表于 2017-12-22 | 分类于 annotation

引言

在上一篇中引入了 Annotation Processing 101 这篇博客的全部内容,但是考虑到有些小伙伴的英文有些吃力,加上这篇博客的质量确实非常不错,所以还是把它翻译出来了。

简介

在本文的开头我将解释如何写一个注解解释器。如下是我的教程。首先,我将解释什么是注解解释,以及你利用这个强大的工具能够做什么。之后我们会一步步实现一个简单的注解解释

阅读全文 »

关于注解你需要知道的一切

发表于 2017-12-22 | 分类于 annotation

引言

还是在两年前看的一篇关于注解的文章,当时看的时候惊为天人,因为确实是把几乎所有注解的用法都总结好了。正好最近又要用到,就先引用一下,后面有时间再翻译。

原文出自 Annotation Processing 101 ,由于是2015 的droidcon上的一个话题,所以还有相应的视频,作者在视频里有详细的讲解,有梯子的小伙伴可以看下视频: Hannes Dorfmann-AnnotationProcessing 101.

如下是blog正文

阅读全文 »

RePlugin解析之ContentProvider

发表于 2017-12-19 | 分类于 android_plugin

引言

与插件中静态广播接收器类似,由于插件中的组件没有在Manifest中注册,如果没有宿主对广播进行注册和转发的话,那么就无法起到静态广播的作用(比如拉起进程),ContentProvider也是一样,也需要宿主对ContentProvider的CRUD操作进行转发

阅读全文 »

RePlugin解析之BroadcastReceiver

发表于 2017-12-16 | 分类于 android_plugin

引言

我看到的分析RePlugin中BroadcastReceiver的文章中,基本都放在了对于插件中静态注册的BroadcastReceiver的处理上,却忽略了还有动态注册的BroadcastReceiver,而实际上这部分也很重要,而且replugin-plugin-gradle中有一项重要的内容就是将插件中LocalBroadcastManager的调用替换为PluginLocalBroadcastManager的调用

阅读全文 »

RePlugin解析startService流程分析

发表于 2017-12-15 | 分类于 android_plugin

引言

在RePlugin解析-startActivity流程分析一文中,详细分析了插件的加载,进程的启动以及Activity坑位的分配等内容,由于Activity不仅涉及到process和taskAffinity属性,还涉及到launchMode属性,所以startActivity流程无疑是最复杂的。然后,startService的流程和startActivity还是有些不一样的,所以考虑再三,觉得还是有必要写一篇文章专门分析一下startService的流程

阅读全文 »

RePlugin解析之类的加载

发表于 2017-12-12

1. 类加载器层次

RePlugin号称只有一个唯一的hook点,这个唯一的hook点就是替换掉系统本身的PathClassLoader对象。那它是怎么做的呢?

1.1 替换PathClassLoader

调用路径为RePluginApplication.attachBaseContext()—>RePlugin.attachBaseContext()—>PMF.init()—>PatchClassLoaderUtils.patch(), 而PatchClassLoaderUtils.patch()方法如下

阅读全文 »
12…16
Allen Wang

Allen Wang

152 日志
25 分类
8 标签
© 2018 Allen Wang
由 Hexo 强力驱动
主题 - NexT.Muse