Android 端 SDK 为什么要使用多进程来实现?
Android 端运行时 SDK 采用多进程机制实现,所谓多进程是指小程序与宿主 App 分隔开,各自运行在独立的进程中,进程之间互不干扰,通过跨进程通信相互传递数据。之所以选用多进程,原因主要有以下几点:
不占用宿主 App 的内存。系统会为小程序进程分独立的内存空间,小程序不会占用主进程的内存,因此 App 不用担心内存溢出等问题;
保证宿主 App 安全稳定运行。小程序进程中发生的一切异常都不会影响到宿主 App,即使小程序进程中发生了崩溃,宿主 App 照样能够继续正常运行;
更容易实现数据解耦。进程之间内存是天然隔离的,除非通过跨进程通信手段,否则一个进程中的数据永远都不会被另一个进程直接读写,因此不用担心数据耦合问题。
多进程如何实现?
因为 Android 没有提供动态创建进程的 API,所以采用为 Activity 绑定进程的方式来实现进程的创建,即在 AndroidManifest.xml 中为 Activity 指定 android:process 属性,当 Activity 被第一次启动时,系统会创建新的进程并将 Activity 所在的栈放到这个进程里面;
为了增强用户体验,需要将同时打开的不同小程序放在系统最近任务栏的不同位置展示,这样用户就能清楚地看到当前打开了哪些小程序并随意切换。为了实现这个效果,需要在过 AndroidManifest.xml 中为 Activity 设置 android:taskAffinity 属性,将不同小程序进程的 Activity 压入不同的任务栈。
小程序进程如何管理?
SDK 支持最多同时创建5个小程序进程,当小程序进程数量没有超过5个时,每启动一个新的小程序都会创建一个新的进程,当小程序个数达到最大数量之后,再启动新的小程序时,将会复用现有的小程序进程来打开小程序;
打开相同的小程序时,会先检查小程序是否已启动,如果已启动则会直接唤起对应的进程;
小程序进程的创建、复用、唤起等逻辑都是在主进程中完成的,由主进程统一调度。
小程序进程和主进程间如何通信?
小程序进程和宿主进程之间的双向通信是通过 AIDL 实现的,小程序进程和主进程绑定同一个远程服务,通过 Binder 机制获取到服务的代理对象,通过代理对象调用 AIDL 接口实现跨进程通信。
进程安全、线程安全问题如何处理?
目前小程序运行过程中需要写入的资源均存放在应用沙盒内小程序对应的目录下,没有对全局共享资源的写操作,因此不存在进程间竞争同一系统资源的问题。对于将来可能存在的进程安全问题,在开发过程中会使用进程安全的方式来读写数据,例如使用文件锁访问文件、通过 ContentProvider 代替 SharedPreferences 共享数据等;
进程间并不存在直接的线程安全问题,只有不同的小程序进程通过跨进程通信并发访问主进程的内存时,或者进程内部并发读写内存时才会带来线程安全问题,SDK 通过锁、同步方法、java 并发类集等方式来解决中线程安全相关问题。
本页内容是否解决了您的问题?