uni-app 后台多进程问题

发布于 1周前 作者 sinazl 来自 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

6 回复

因为多进程上架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 WorkersPush Notifications来处理后台任务,但这已经超出了uni-app的直接控制能力,需要额外的Web开发知识。

总结

由于uni-app跨多个平台,后台多进程的实现需要根据具体平台进行调整。在App平台上,可以通过原生插件或代码实现较为灵活的后台任务管理;而在小程序和H5平台上,则受限于平台策略,难以实现长时间后台运行的任务。因此,在设计应用时,需充分考虑平台差异,合理规划后台任务策略。

回到顶部