uni-app 后台多进程问题
uni-app 后台多进程问题
产品分类
uniapp/App
操作步骤
Android的APP运行后台,集成了uni-push,进行消息推送,在后台出现多个APP进程
预期结果
后台Android的APP只出现一个进程
实际结果
后台Android的APP只出现多个进程
bug描述
Android的APP在后台显示多进程,iOS版APP正常
开发环境与版本信息
项目创建方式 | HBuilderX |
---|---|
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | window11 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.15 |
手机系统 | Android |
手机系统版本号 | Android 10 |
手机厂商 | 小米 |
手机机型 | xiaomi 12 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
App下载地址 | http://file.jiustech.cn/uploads/soft/cxy3/jsy1.7.0-3_20240518162511.apk |
因为多进程上架vivo已被拒,官方没回复,没办法只能自己排查了,类似问题安卓、鸿蒙打开uni一键登录后,后台出现多个进程,下面问题解决只是我的项目,可以参考
1、使用uni-push,按上面文章中怀疑是推送导致,移除uni-push和mainfest中push模块,重新打包,仍然多进程
2、从百度上查询Android多进程,说组件中android:process可另开进程,使用jadx反编译apk,查询只有个推打包中才有,移除个推后没有了,又怀疑问题出现在引用原生组件上,移除所有原生组件,再重新打包,仍然多进程
3、没办法了,怀疑uniapp本身的问题,使用官方hello示例打包,发现没有多进程,说明问题不在uniapp,肯定是我配置问题了
4、现在mainfest基本都是默认了,唯一就是设置启动图,那恢复为通用启动界面,打包,没有多进程了,最后原因出在我设置自定义启动图。
5、项目又想使用自定义启动图怎么办呢?从uniapp某个文章看到对于启动图存放位置放在unpackage目录,否则可能出现意外情况,我把启动图放到unpackage/res下打包,现在没有多进程了,程序终于恢复正常了
本以为解决问题了,其实运行一段时间可能仍然出现,而在新版小米和荣耀经常出现,苹果就没这问题
因为多进程一直未能通过荣耀上架审核,正好利用中秋假期再次测试了下,应该就是hasTaskAffinity导致,已经测试了一天了,移除这个打包目前运行平板、小米、华为未再出现多进程,后来查看了官方文档中说明
Strandhogg漏洞 风险描述 StrandHogg之所以独特,是因为它无需进行植根即可启用复杂的攻击,它利用Android的多任务系统中的一个弱点来实施强大的攻击,使恶意应用程序可以伪装成该设备上的任何其他应用程序。此漏洞利用基于一个称为“ taskAffinity”的Android控件设置,该控件允许任何应用程序(包括恶意应用程序)自由地采用其所需的多任务处理系统中的任何身份。 修复方案 该漏洞已于2020.4.1的安全补丁中修复(涵盖Android 8.0 / 8.1 / 9.0+)。由于已经通过系统补丁封堵。理论上该漏洞不会对高版本系统的手机设备构成威胁。 而app客户端开发并没有彻底规避该漏洞的方案。各检测平台推荐配置android:taskAffinity=“”,但仅是临时方案。但该方案会导致应用运行到android11+系统设备时任务堆栈窗口变成两个的问题。 由于android:taskAffinity=“”配置存在bug!所以我们并不会默认这样配置。但为开发者提供的云打包配置选项。由开发者决定是否配置临时封堵该漏洞
当时未注意其中两个窗口的说明,主要为安全加上官方所有说的安全防范措施,结果导致软件在后台总是有两个以上窗口,其中有一个窗口一直显示资源同步中…
目前算是暂时解决了,已经移除这个设置,目前未发现多窗口的问题了
唉,苦不堪言
提了好久的问题,最后也解决了,这里分享一下。
多进程主要是问题出在按官方说为防止漏洞 Strandhogg漏洞而在manifest.json中设置的"hasTaskAffinity" : true。官方也进行了说明,我当时没注意下面的官方解释。只要关闭这个或注释这个,就没多进程了
在 uni-app 中处理后台多进程问题,通常涉及到如何在应用进入后台时保持某些任务继续运行,或者在后台启动新的任务。由于 uni-app 主要面向跨平台开发(如小程序、H5、App等),其后台行为会受到不同平台的限制。以下是一些在不同平台上可能用到的代码示例和思路,但请注意,具体实现和可行性可能因平台而异。
1. App平台(如Android和iOS)
在 App 平台上,你可以利用原生插件或原生代码来实现后台多进程。以下是一个简单的示例,展示如何在 uni-app 中调用原生代码来启动一个后台服务(以Android为例):
Android原生代码(Java)
创建一个后台服务类:
public class MyBackgroundService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 在这里执行后台任务
new Thread(() -> {
// 模拟长时间运行的任务
try { Thread.sleep(10000); } catch (InterruptedException e) {}
}).start();
return START_STICKY;
}
}
uni-app中调用原生服务
在manifest.json
中配置插件或直接在HBuilderX中通过原生代码模块调用这个服务。由于这部分涉及较多原生开发,通常建议封装成插件或直接修改原生工程代码。
2. 小程序平台
小程序平台严格限制后台运行,不允许长时间后台任务。但你可以利用小程序的后台任务接口(如微信的wx.setKeepAlive
)来保持某些任务在后台存活一段时间。
// 微信小程序示例
wx.setKeepAlive({
success: function () {
console.log('设置成功,任务将在后台保持一段时间');
// 在这里执行后台任务,但注意任务执行时间受限
},
fail: function (err) {
console.error('设置失败', err);
}
});
3. H5平台
在H5平台上,浏览器对后台任务的限制更为严格。通常,你可以使用Service Workers
和Push Notifications
来处理后台任务,但这已经超出了uni-app的直接控制能力,需要额外的Web开发知识。
总结
由于uni-app跨多个平台,后台多进程的实现需要根据具体平台进行调整。在App平台上,可以通过原生插件或代码实现较为灵活的后台任务管理;而在小程序和H5平台上,则受限于平台策略,难以实现长时间后台运行的任务。因此,在设计应用时,需充分考虑平台差异,合理规划后台任务策略。