1,拍摄页面拍摄视频是接入的视频中台的拍摄sdk,它拍摄过程中是占用内存比较高的,因为拍摄的时候需要把视频流加载道内存然后编码,拍摄时间越长,内存就占用越多,就造成了卡顿和内存溢出的问题。
2,基于以上原因的话,我们就考虑给拍摄页面单独开一个进程,去降低拍摄页卡顿和内存溢出的概率。
3.1,能解决内存溢出,是因为,拍摄页单独占一个进程,能占用的内存更大,自然就会降低内存溢出概率。 3.2,之所以可以降低卡顿概率是因为,占用内存过多,可能会触发gc,占用程序运行时间,可能会导致本次需要渲染的界面没有在规定的时间计算完成,系统收到vsync信号的时候,就没法进行渲染,造成丢帧,我们看到的仍然是上一帧画面,导致了卡顿,让它在一个进程独享内存,可以降低gc概率
4,多进程遇到的一些问题
1 Application多次创建
新开进程,Application再次创建,其实是正常的。 (因为新进程会分配一个独立的虚拟机,启动进程的过程实际上就是一个应用启动的过程,自然会使得Application再次创建。)
但是会导致一个问题,就是主进程中Application初始化的一些sdk会在我们进程中国呢全部初始化,这个的话显然是没有必要的,而且会拖慢我们新进程的初始化时间,这时,可根据进程名判断,只进行有必要的初始化。
2 静态成员的失效 进程的内存空是隔离的,主进程中初始化的静态变量,在新进程中肯定是没有值的。 检测这个静态变量失效的问题,主要是更加崩溃日志去查,看是哪些静态变量导致崩溃,然后对这些静态变量进行初始化。
3 文件共享问题 我遇到的是我们项目中有个日志文件系统,它是先将日志存储到本地,然后一定量之后在统一上报给服务端。 这样就可能会导致,我们进程在写日志的时候,主进程在读日志上报。造成文件错乱问题。
我们的解决的方法:不同进程使用不同文件存储日志。
4,打开拍摄页面白屏 进程初始化需要时间 解决的方法是, 1,给这个白屏窗口设置一个透明背景。 2,在播放页的时候提前创建这个拍摄进程。 通过绑定拍摄进程的一个sevice,让一个sevice运行在这个进程中,避免这个进程被杀死。 3,让新进程application中初始化的sdk或者模块并发初始化。
5,进程通信问题 视频拍摄上传完成之后,需要关闭拍摄页,之前是在上传成功页发用eventbus发一个消息到拍摄页让拍摄页finish,现在多进程,而eventbus是不支持多进程的,我们这里使用进程通信是aidl,还是在上传成功页用eventbus发出一个消息,在这个消息的处理中,通过之前绑定service,获取的binder,将这个消息传递到新进程中的eventbus消息监听方法中,关闭页面。(去调用新进程的一个方法,在这个方法中,再去发一个关闭页面的消息)这样就保证了我们ab方案中不管是不是用多进程,都是用eventbus发消息关闭界面。