业务需求
获取安卓后台正在运行的应用,不依赖无障碍服务,将白名单之外的应用全部杀掉。
主要分以下步骤:
1、获取后台应用列表,得到总的数组
2、定义一个白名单列表,白名单中的应用不处理
3、对比总表和白名单表,白名单之外的应用逐个杀掉。
如果应用有无障碍权限,杀掉别的应用是很容易的。
没有无障碍的话,就要麻烦一些。需要进行一些模拟操作。
获取后台的应用列表
编写一个获取后台应用列表的方法getBackstageAppList()
该方法在AiWork、autojs、easyclick等基于JavaScript的脚本框架中,都可以使用。
Android 系统从5.1以后,通过getRunningTask或getRunningService的方式已经无法获得应用进程了(只能获得自己的进程),之后出现了以AndroidProcess库为首的一种通过读取/proc/ 进程信息的库。
但是从android 7.0开始,系统已经不支持读取/proc/
注意:有用户反馈说有的不在后台运行的应用,也拿到了。
这可能是由于安卓不同版本,以及厂商魔改的安卓版本,存在一些API差异导致的。
此问题需要自行处理。如果拿到了没在后台运行的应用,杀死应用的方法会提前结束,并不影响程序的继续执行。
获取后台应用列表
在手机上打开一些应用用作测试。调用该方法,返回一个应用信息数组。
[{
"appName": "美团",
"packageName": "com.sankuai.meituan",
"isSystemApp": false,
"versionName": "12.24.406",
"versionCode": 1200240406,
"firstInstallTime": 1721627433000,
"lastUpdateTime": 1725615187225
}, {
"appName": "微信",
"packageName": "com.tencent.mm",
"isSystemApp": false,
"versionName": "8.0.50",
"versionCode": 2701,
"firstInstallTime": 1722076544619,
"lastUpdateTime": 1722076544619
}, {
"appName": "微信输入法",
"packageName": "com.tencent.wetype",
"isSystemApp": false,
"versionName": "1.3.2",
"versionCode": 32201,
"firstInstallTime": 1722136097957,
"lastUpdateTime": 1725614828215
}, {
"appName": "AIWork",
"packageName": "com.autoapp.autoapp",
"isSystemApp": false,
"versionName": "3.0.8",
"versionCode": 89,
"firstInstallTime": 1722097567801,
"lastUpdateTime": 1725441855656
}, {
"appName": "苏宁易购",
"packageName": "com.suning.mobile.ebuy",
"isSystemApp": false,
"versionName": "9.5.170",
"versionCode": 556,
"firstInstallTime": 1721627433000,
"lastUpdateTime": 1726361185885
}, {
"appName": "携程旅行",
"packageName": "ctrip.android.view",
"isSystemApp": false,
"versionName": "8.74.0",
"versionCode": 1842,
"firstInstallTime": 1721627433000,
"lastUpdateTime": 1726433273987
}, {
"appName": "淘宝",
"packageName": "com.taobao.taobao",
"isSystemApp": false,
"versionName": "10.40.11",
"versionCode": 661,
"firstInstallTime": 1721627433000,
"lastUpdateTime": 1726342858236
}]
定义一个白名单列表
白名单中的应用,不做任何处理。
let appWhiteList = [
{
'appName': 'AIWork',
'packageName': 'com.autoapp.autoapp',
},
{
'appName': '微信',
'packageName': 'com.tencent.mm',
},
]
列表对比
获取到全部的后台应用后,和白名单列表做对比。
遇到白名单,则跳过。
不在白名单列表的,进行进程清理。
// 获取后台应用列表
let totalList = getBackstageAppList()
printl(JSON.stringify(totalList))
// 遍历总表
totalList.forEach(app => {
// 检查packageName是否在白名单中
let isWhiteListed = appWhiteList.some(whiteApp => whiteApp.packageName == app.packageName);
// 如果不在白名单中,则执行一些动作
if (!isWhiteListed) {
console.log(`执行动作:${app.appName}`);
// 在这里添加你的动作代码
let packageName = app.packageName; // 得到包名
// 执行清理操作
}
});
清理指定应用的进程
自己封装一个ocr找字点击的方法ocrFindEx
,调用这个方法进行HID点击
/**
* 杀死应用进程
* @author 飞云
* @wechat imfeiyun
* @link http://www.feiyunjs.com
*/
function killApp(packageName) {
let result = false;
let clickNum = 0;
// 进入应用设置页面
app.openAppSeting(packageName);
sleep.millisecond(3 * 1000);
while (clickNum < 3) {
let OCRResult = screen.MLKitOcr('zh', 1);
if (ocrFindEx(OCRResult, [
'/.*(强行|停止|结束|运行).*/',
'强行停止',
'结束运行',
], true, 1 * 1000, [0.5, 0.5, 1, 1, '右下角'], 0.8)) {
printl('点击:确认停止');
result = true;
break;
} else if (ocrFindEx(OCRResult, [
'/.*(强行|停止|结束|运行).*/',
'强行停止',
'结束运行',
], true, 1 * 1000, [0.5, 0, 1, 0.5, '右上角'], 0.8)) {
printl('点击:停止');
clickNum++;
// } else if (ocrFindEx(OCRResult, appName, true, 1 * 1000, [0, 0, 0.5, 0.5], 0.8)) {
// printl('已打开应用设置');
} else {
printl('无法识别');
clickNum++;
}
sleep.millisecond(1 * 1000);
}
hid.back();
return result;
}
此外,还可以使用无障碍的节点、代理模式等方法来实现特征的查找和点击。
AiWork简介
AIWork是一款安卓和IOS手机的自动化测试开发引擎,采用免root技术,自研IDE代码编辑器,自研图色引擎2.0,自研agent adb代理模式,自研hid硬件自动化,脚本代码采用javascript脚本代码(rhino引擎),提供了众多的工具,方便自动生成js代码。
AiWork开发文档
在官方文档的基础上,进行重新排版和优化。
一个优雅的文档,对于开发体验的提升,是效果显著的。
永久域名:aiwork.wiki
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » AiWork、autojs、easyclick等获取并杀死后台正在运行的应用,不用无障碍清理后台应用