Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序如何实现多进程?从隔离角度出发,看完你就会懂!

小程序如何实现多进程?从隔离角度出发,看完你就会懂!

作者头像
极乐君
发布于 2020-03-10 13:43:44
发布于 2020-03-10 13:43:44
4.6K0
举报
文章被收录于专栏:极乐技术社区极乐技术社区

小程序这个名词相信大家已经不陌生了,继微信之后,阿里巴巴、百度、头条等大厂相继实现了自己的小程序。小程序是一种全新的开放能力,开发者能够快速开发出小程序并集成进宿主,实现推广等目的。

从使用角度看,小程序有轻量,易用等特点;

从技术角度,以Android端为例,小程序有部分组件原生化、UI和逻辑线程隔离、小程序之间进程隔离等等。

本篇文章主要从小程序进程隔离角度出发,分析BAT的小程序多进程的实现方案,并自己实现一个小程序的多进程。

01

多进程的意义

多进程,顾名思义,即每一个小程序都是一个单独的进程。这个效果只在Android端独有。那为什么我们希望小程序之间实现进程隔离呢?原因大致有三点:

  1. 由于是单独进程,无论小程序内部因为何种原因的崩溃,对主进程都没有影响,增强用户体验。
  2. 由于每个进程都有一片单独的内存区域,小程序不会占用主进程的内存,降低了内存溢出的风险。
  3. 由于不同进程间的内存是隔离的,当同时开启多个小程序时,内存变量、参数等数据互不影响,也可达到一个解耦的目的。

02

微信小程序的分析

既然是分析多进程这种用户感知不强烈的技术点,我们需要通过一些工具或命令。

一. 进程分析

首先,我们把微信完全杀死又重新开启,然后通过 adb shell ps | grep com.tencent.mm 命令,可以查看正在运行的进程名称和数量,其中 grep com.tencent.mm 是过滤微信相关的进程,因为微信的包名是com.tencent.mm。此时进程运行状况如下图:

此时我们只能看出微信从完全关闭到启动,开启了6个进程,但是还看不出这些是否与小程序相关。于是,我们打开一个小程序,再次执行 adb shell ps | grep com.tencent.mm 命令,此时进程运行状况如下图:

对比之后,就可以做一些分析了。其中,com.tencent.mm是主进程,com.tencent.mm:push应该是与推送相关的进程,com.tencent.mm.tools和com.tencent.mm:toolsmp应该都是一个类似于Helper的相关进程,因此我认为最有可能的是com.tencent.mm:appbrand2,因为这个命名比较特殊,前面分别有appbrand0和appbrand1两个进程出现过。那么为什么新开的第一个小程序,反而多出来的进程是appbrand2呢?我个人猜测这与微信小程序的预加载有关系,很有可能是,这个进程是空的,只是先fork出来,并没有做过多的事情,真正承载我们开启的那个小程序的进程,很有可能不是这个appbrand2。那么如何验证呢?进入第二步,Activity分析。

二. Activity分析

首先打开一个小程序,然后通过 adb shell dumpsys activity activities 命令,可以看到所有栈内的Activity信息,滑到顶部,查看正在与用户交互的Activity信息,如下图:

关键的信息我已经用红色圈了出来,这大致已经验证了我们刚才的猜想,即:com.tencent.mm:appbrand系列,是与小程序相关的进程。

微信预加载2个空进程作为预加载,避免用时再fork进程,耗时过长影响用户体验。

为了进一步验证猜想是否正确,我下载了微信最新版本的apk,进行了逆向操作,也就是第三步,分析apk。

三. 微信Apk分析

反编译的方法大家自行搜索,这里就不赘述了。我们打开反编译后的AndroidManifest.xml文件,搜索刚才的的Activity名称,结果如下:

得到的信息与刚才一致。然而,我们又发现了另一个问题,那就是AppBrandUI还有另外4个兄弟,即AppBrandUI1,AppBrandUI2,AppBrandUI3,AppBrandUI4,而这四个Activity的名称与绑定的进程,又能够与一开始的appbrand对应起来,经过试验,我发现微信最多只可以启动5个小程序,而这些小程序的载体就是这5个Activity,不断轮询,超过5个时,将第一个结束掉。这样,我们就基本可以确定,微信是通过apk内置的5个Activity,来实现小程序的多开与进程隔离的。

因此,理论上这5个Activity应该是除了进程不同,内部逻辑应该都是相同的,于是我们继续验证,反编译代码后找到AppBrandUI1这个Activity,结果如下图:

AppBrandUI2,AppBrandUI3,AppBrandUI4与此完全一样,都是继承了AppBrandUI,做了极少的事,由于微信代码混淆过,我们无法看出那几行代码具体做了什么,但是基本可以理解为完全复用。至于为什么分开写,而不是复用同一个。

我猜测原因可能有二:

  1. 由于语法限制,为Activity开辟进程需要在AndroidManifest.xml中预先配置
  2. 微信不仅将小程序进程隔离,并且还进行了栈隔离,当我们同时开启多个小程序时,长按Home键,可以发现存在多个小程序任务卡片,这种效果同样需要在AndroidManifext.xml中配置taskAffinity属性,这在上图中也有体现。

另外,我还注意到,微信在AndroidManifest.xml中配置了这样的Receiver:

这种Receiver共有5个,每个小程序进程有一个,其它4个只是继承了这个AppBrandTaskPreloadReceiver,由于混淆的原因,无法看出具体做了什么事,但是通过名字判断,是实现小程序进程预加载的,空闲时开启这个广播,至少可以提前开启进程,避免用时再加载耗时过长影响用户体验。

同样的,我分析了百度和支付宝的apk,通过命令和反编译等方法,发现他们的方案几乎一样,只是预加载的数量等一些小细节不同,感兴趣的同学可以自己逆向之后做对比。

03

分析总结

1. 微信对每个小程序都做了进程隔离和栈隔离,互不影响。

2. 实现这一功能的载体Activity是预先配置在AndroidManifest.xml中的。

3. 通过某种方法,微信将小程序的最大运行数量控制在5个。

4. 微信对多进程做了一些优化,已知的是预加载2个空进程。

5. BAT等大厂的小程序多进程方案大同小异。

04

实现小程序多进程的关键点

一. Application初始化

Android的app在开启多进程时,每开启一个进程,Application都会重新创建,也就是onCreate函数会被调用,如果没有做进程判断,所有东西会初始化多次,造成卡顿或意料之外的bug。

二. 分配与管控

由于进程之间的内存无法共享,小程序的生命周期需要在某一个进程中维护,不然无法做到动态分配进程和栈,而这个进程选择主进程最为合适。因此需要创建一个管理器,这个管理器负责以下几件事:

1. 接收外界开启、关闭等对小程序的操作

2. 合理的为接收到的请求分配空闲的进程

3. 接收远程小程序的生命周期回调并通过某个uuid进行维护

4. 在空闲时预加载进程

5. 根据设置的可开启的最大小程序数量,对进程进行新建、销毁等操作

6. 所有这些管理和维护的操作,对小程序接入者都应是透明的,无需关心具体实现流程,仅在需要时开启小程序即可。

三. 进程生命周期问题

Android系统对于内存有一套自己的管控机制,当内存较为紧张时会在不做任何通知的情况下kill掉活跃度较低的进程,至于进程活跃程度,就与Android的进程保活有关了,可通过设置前台进程、唤醒等方式去尽量保活。但是无论应用端再怎么做,都无法逾越操作系统的权限,系统在某些情况下依然会把进程杀死来保证整个系统的正常运行。因此,开发时需要做容错处理,不能仅以Activity的onDestroy回调为准,因为一旦出现系统级的回收,很可能导致整个分配管理器的错乱。

四. 通讯

通信又分为两个方面,第一,小程序进程与app主进程是隔离的,需要进程间的IPC通信;第二,小程序的本质是一个web容器,这就少不了js与原生的通信,需要jsbridge。下面分别说一下这两个方面。 进程通信:

IPC的实现已经不是什么问题,这里仅说几个需要注意的点:

1. 通信一定是双向的,无论哪个进程,最好绑定同一个服务,方便数据的维护。

2. 由于通信较为频繁,建议使用基于Binder的通信机制,可以提高运行效率。

05

js与原生通信:

js与原生通信一定是通过jsbridge,最好做法是将原生方法的实现写在主进程,分布在不同进程的小程序向主进程请求某个bridge的实现结果,主进程根据相应的参数去执行并返回结果,类似于一套CS的架构。即小程序客户端无需关心具体操作,只关心结果并响应给web端。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极乐技术社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自动化-Appium-微信小程序(Python版)
微信小程序其实也是正常的webview,但需要在微信里打开X5调试页面进行设置,脚本添加androidProcess参数才可以执行自动化测试。
wangmcn
2022/07/25
5.9K0
自动化-Appium-微信小程序(Python版)
聊聊 Python 做微信小程序自动化,那些踩过的坑?
之前写过 微信小程序的几种方式,对于有源码的小程序推荐使用微信开放的 SDK 来做自动化,否则只能使用原生或 WebView 的方式。
AirPython
2020/05/18
2.5K0
自动化-Appium-微信小程序(Java版)
微信小程序其实也是正常的webview,但需要在微信里打开X5调试页面进行设置,脚本添加androidProcess参数才可以执行自动化测试。
wangmcn
2022/07/25
2.8K0
自动化-Appium-微信小程序(Java版)
Android开发高级进阶——多进程间通信
当一个应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名。
trampcr
2018/09/28
1.1K0
Android开发高级进阶——多进程间通信
一篇文章带你入门移动安全
这篇文章集合了一些入门移动安全的基础渗透知识,希望可以能给想入门移动安全小伙伴们一些收获。
重生信息安全
2020/07/28
1.6K0
一篇文章带你入门移动安全
appium+python自动化56-微信小程序自动化
最近微信的小程序越来越多了,随之带来的问题是:小程序如何做自动化测试? 本篇以摩拜小程序为例,介绍如何定位小程序里面的元素
上海-悠悠
2018/07/25
1.7K0
appium+python自动化56-微信小程序自动化
Appium之测试微信小程序
如果用手机自带的浏览器去访问各种网页。自然而然都能获取到 WebView 的,不需要开启什么。用原生的、手机自带的浏览器去试下,也能得到对应的结果。
清菡
2020/12/16
3K0
Appium之测试微信小程序
使用Xposed进行微信小程序API的hook
  上一篇文章讲了安卓的虚拟定位相关的内容,最后编写了一个frida脚本来对Framework层的API进行hook实现虚拟定位。但是有几点局限性:
大A
2023/02/14
7.2K0
一种 Android 端 Web 多进程情况下支持 Web 自动化测试的方法
本文介绍了应用宝在Android平台支持Web自动化测试的方案,主要从架构设计、实现细节、流程梳理、支持Web自动化测试方案、Web多进程后的支持方案、Web自动化测试方案的插件化设计等方面进行了详细阐述。方案采用的主要技术包括Java、Android、JavaScript、Appium、Selenium、XWalk等,并介绍了如何通过插件化的方式实现Web自动化测试,以支持多进程、提高测试效率、保证测试准确性和稳定性,同时也为其他平台的Web自动化测试提供了参考和借鉴。
腾讯移动品质中心TMQ
2017/07/12
2.2K0
一种 Android 端 Web 多进程情况下支持 Web 自动化测试的方法
微信小程序之自动化亲密接触
导读 山雨欲来风满楼,最近微信小程序相关开发文章吹遍大江南北,亦有摧枯拉朽万象更新之势。问小程序形为何物,直教IT众生怡情悦性高潮迭起。作为一名有着远大理想“包袱”与互联网变革 “使命感”的测试工程师,我再也按耐不住内心中的渴望与好奇,代表测试行业各大门派肩负起了迎接时代变革的挑战。话说经历了围观查看、溜边打探等种种过程,终于在隔壁老王那里弄到了测试体验资格,开始了一场对小程序的自动化亲密接触。 上篇---小程序初探 上手的小程序是微信官方的测试Demo,类似Android Api Demos一样,官方小程
腾讯移动品质中心TMQ
2018/02/08
2.7K0
微信小程序之自动化亲密接触
微信小程序自动化测试最佳实践(附 Python 源码)
随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序、微信公众号等。小程序项目页面越来越多,业务逻辑也越来越复杂,全手工测试已无法满足快速增长的业务需求。
霍格沃兹测试开发
2020/08/18
1.3K0
微信小程序自动化测试最佳实践(附 Python 源码)
自动化测试微信小程序
Mac 环境下搭建 appium 1 安装homebrew 首先命令行检查是否安装:
赵云龙龙
2019/09/25
2.8K0
自动化测试微信小程序
Appium如何开展小程序自动化测试?
现阶段,小程序越发的火,微信也给了巨量的流量诱惑。很多公司都有进行小程序开发。 那么小程序可以进行自动化测试吗? 当然是可以的!
测试开发技术
2021/11/04
2.2K0
Android多进程总结1
正常情况下,一个apk启动后只会运行在一个进程中,其进程名为apk的包名,所有的组件都会在这个进程中运行,以下为DDMS的进程截屏:
随心助手
2019/10/14
1.5K0
Android十八章:多进程基础
这一章主要讲述多进程的作用,序列化和反序列化,Serializable和Parcelable
ppjun
2018/09/05
4750
小程序逆向分析 (一)
小程序是一个以 wxapkg 为后缀的文件,在android手机的 /data/data/com.tencent.mm/MicroMsg/用户id/appbrand/pkg/ 里面找, 例如在我的测试手机里面就在
奋飞安全
2021/09/08
2.3K0
Android技能树 — 多进程相关小结
这次是讲Android存储路径及IO的基本操作。因为我们在开发的时候会经常这种方便的需求。这篇文章的内容我写的可能很少,都没有细写。别吐槽。o( ̄︶ ̄)o
青蛙要fly
2018/08/29
4590
Android技能树 — 多进程相关小结
Android中多进程通信有几种方式?需要注意哪些问题?
在Android中,多进程通信(Inter-Process Communication,IPC)是指不同进程之间进行数据交换和协同工作的过程。由于Android的每个应用都在其自己的沙箱环境中运行,进程间默认是隔离的,因此当需要在不同应用或同一应用的不同组件之间共享数据时,就需要使用IPC机制。
AntDream
2024/09/19
4320
Android中多进程通信有几种方式?需要注意哪些问题?
adb 命令大全_整理磁盘碎片的命令
大家好,又见面了,我是你们的朋友全栈君。 adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来
全栈程序员站长
2022/08/03
2.8K0
关于 Android 应用多进程的整理
在计算机操作系统中,进程是进行资源分配和调度的基本单位。这对于基于Linux内核的Android系统也不例外。在Android的设计中,一个应用默认有一个(主)进程。但是我们通过配置可以实现一个应用对应多个进程。
技术小黑屋
2018/09/05
1K0
相关推荐
自动化-Appium-微信小程序(Python版)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档