为了方便开发者尽快熟悉脚本,提供如下脚本仅供参考:
function main() {
if (1 == launchApp('com.xunmeng.pinduoduo', 'txt:个人中心|txt:多多视频')) {
console.log('进入拼多多成功');
var index = 0;
while (index < 3) {
scroll('up', {distance: Math.random() * 0.5 + 0.45, duration: parseInt(Math.random() * 200 + 300), afterWait: 3000});
++index;
console.log('滚动:' + index);
}
console.log('任务结束,退出');
} else {
console.log('启动拼多多失败');
}
}
// app不存在则安装,版本低则更新,最后再启动app
function main(packageName, autoInstall=true, checkUpdate=true, afterWait=6000) {
var result = false, version = getAppVersion(packageName), appName = getAppName(packageName);
if (appName == '') {
console.log('没有安装app');
if (autoInstall) {
if (installApp(packageName)) {
result = 1 == launchApp(packageName);
}
}
} else {
if (checkUpdate) {
var latestVersion = getLatestAppVersion(packageName);
if (latestVersion != '') {
var version = getAppVersion(packageName);
if (compareVersion(latestVersion, version)) {
// update
if (!installApp(packageName)) {
console.log('安装失败');
}
}
}
}
result = 1 == launchApp(packageName);
}
if (result) {
clickByTag('txt:允许', {click: true, maxStep: 8});
sleep(afterWait);
}
return result;
}
function compareVersion(newVersion, oldVersion) {
if (newVersion && oldVersion) {
newVersion = newVersion.trim();
oldVersion = newVersion.trim();
var newArr = newVersion.split('.'), oldArr = oldVersion.split('.');
var size = Math.min(newArr.length, oldArr.length);
for (var i = 0; i < size; ++i) {
var newV = parseInt(newArr[i]);
var oldV = parseInt(oldArr[i]);
if (newV > oldV) {
return true;
} else if (newV < oldV) {
break;
}
}
}
return false;
}
function installApp(packageName) {
var savedPath = downloadApp(packageName);
if (savedPath != '') {
if (install(savedPath)) {
// 开始点击界面
console.log('开始点击安装界面');
sleep(2000);
var findInstall = false, clickInstall = false, startTime = new Date().getTime();
while (!clickInstall && (new Date().getTime() - startTime) < 100000) {
var ret = findView('txt*:解析软件包时出现问题|id:com.miui.packageinstaller:id/install_btn|txt:继续安装|txt*:无视风险安装|txt:退出登录');
if (ret.length > 0) {
if (ret.tag == 'com.miui.packageinstaller:id/install_btn' || ret.tag == '继续安装') {
click(ret.views[0], {click: true});
} else if (ret.tag == '退出登录') {
break;
} else if (ret.tag == '无视风险安装') {
var view = ret.views[0];
gestureClick(view.right - 100, (view.top + view.bottom) / 2, {afterWait:1000});
} else {
console.log('解析软件包失败');
clickByTag('txt:确定', {click: true});
break;
}
findInstall = true;
}
if (findInstall) {
ret = findView('txt:确定|id:com.miui.packageinstaller:id/done_button');
if (ret.length > 0) {
click(ret.views[0], {click: true});
clickInstall = true;
}
}
}
console.log('完成安装:' + clickInstall);
return clickInstall;
} else {
console.log('install failed:');
}
}
return false;
}
// 禁止app「获取手机中已安装的应用信息」权限
function main(appName) {
if (!launchApp('com.android.settings')) {
return false;
}
var ret = findView('txt:设置', {failed: exitPopup, maxStep: 30});
if (ret.length <= 0) {
console.error('启动设置程序失败');
return false;
}
scroll('up', {distance: 0.99, afterWait: 1000});
var result = false, scrollCount = 0, target = 'txt:应用设置|txt:授权管理|';
while(scrollCount <= 3 && target!= '') {
ret = findView(target, {failed: exitPopup});
if (ret.length <= 0) {
console.log('没找到tag,滚动后继续找');
scrollCount++;
scroll('up', {distance: 0.99, afterWait: 1000});
} else {
result = true;
if (ret.tag == '应用设置') {
result = switchPage('txt:应用设置', 'txt:授权管理', {failed: exitPopup, click: true}).length > 0;
}
if (result) {
result = false;
ret = switchPage('txt:授权管理', 'txt:应用权限管理', {failed: exitPopup, click: true});
if (ret.length > 0) {
ret = switchPage('txt:应用权限管理', 'txt:应用管理', {failed: exitPopup, click: true});
if (ret.length > 0) {
if (clickByTag('txt$:个应用程序', {click: true})) {
ret = findView('cn:miui.widget.ClearableEditText');
if (ret.length > 0) {
paste(ret.views[0], appName, {type: 'paste', afterWait: 3000});
var container = findView('cn:androidx.recyclerview.widget.RecyclerView');
if (container.length > 0 && container.views[0].size > 0) {
click(container.views[0][0], {click: true, afterWait: 1000});
ret = findView('txt:读取应用列表', {maxStep: 6});
if (ret.length > 0) {
if (ret.views[0].parent.parent[1].text != '拒绝') {
ret = switchPage('txt:获取手机中已安装的应用信息', 'txt:取消', {click: true, failed: exitPopup});
if (ret.length > 0) {
result = clickByTag('txt:拒绝', {click: true, afterWait: 2000});
} else {
console.error('失败');
}
} else {
console.error('已经是拒绝了');
result = true;
}
}
} else {
console.error('can not find recyclerView');
}
} else {
console.error('can not find edit');
}
}
} else {
console.error('没进入应用管理');
}
}
}
break;
}
}
return result;
}
function exitPopup() {
var ret = findView('txt:暂不开启', {maxStep: 1});
if (ret.length > 0) {
click(ret.views[0], {click: true});
}
}
// 删除长时间没有使用的app,系统app和白名单中的app不删除
function main(whiteList=[]) {
if (!launchApp('com.miui.securitycenter')) {
return;
}
var ret = findView('txt:安全中心', {maxStep: 30});
if (ret.length <= 0) {
console.log('启动安全中心失败');
return;
}
whiteList.push('微信');
whiteList.push('支付宝');
ret = switchPage('txt:应用管理', 'txt:应用卸载', {click: true});
if (ret.length > 0) {
ret = switchPage('txt:应用卸载', 'txt^:卸载选中应用|txt^:一键卸载', {click: true});
if (ret.length > 0) {
ret = findView('txt:存储占用|txt:使用频率|txt:安装时间');
if (ret.length > 0) {
if (ret.tag != '使用频率') {
click(ret.views[0], {click: true, afterWait: 1000});
ret = findView('txt:使用频率');
if (ret.length > 0) {
click(ret.views[0], {click: true, afterWait: 1000});
}
}
var selectedCount = 0, index = 0;
var container = findView('cn:androidx.recyclerview.widget.RecyclerView');
while (container.length > 0 && index < container.views[0].size) {
var item = container.views[0][index];
if (item[0].size == 4) {
if (item[0][1][1].text.includes('未使用')) {
if (!item[0][3][0].checked) {
if (whiteList.indexOf(item[0][1][0].text) < 0) {
click(item, {click: true});
selectedCount++;
}
}
} else {
break;
}
} else if (item[0].size == 3 && item[0][1].size == 3) {
console.log('item[0][1][2].text:' + item[0][1][2].text);
if (item[0][1][2].text.includes('未使用')) {
if (!item[0][2].checked) {
console.log('txt:' + item[0][1][0].text);
if (whiteList.indexOf(item[0][1][0].text) < 0) {
click(item[0], {click:true});
selectedCount++;
}
}
} else {
break;
}
} else {
console.log('忽略一个item');
}
++index;
container = findView('cn:androidx.recyclerview.widget.RecyclerView');
}
if (selectedCount > 0) {
ret = switchPage('txt^:卸载选中应用|txt^:一键卸载', 'txt:确定|txt:卸载选中应用', {click: true});
if (ret.length > 0) {
click(ret.views[0], {click: true, afterWait: 3000});
var startTime = new Date().getTime();
ret = findView('txt:应用卸载');
while (ret.length <= 0 && (new Date().getTime() - startTime) < 120000) {
ret = findView('txt:应用卸载', {afterWait: 1000});
}
console.log('卸载成功');
}
} else {
console.log('没有需要卸载的');
}
}
}
} else {
console.error('进入优化加速失败');
}
}
function main() {
var result = 0;
if (!launchApp('com.android.settings')) {
console.error('启动失败');
return result;
}
var ret = findView('txt:设置', {failed: exitPopup, maxStep:50});
if (ret.length <= 0) {
console.error('找不到容器');
return result;
}
var target = 'txt:我的设备|txt:双卡和移动网络|txt:锁屏|txt:电池与性能|txt:应用设置|txt:授权管理|', scrollCount = 0, successCount = 0;
while (scrollCount <= 3 && target != '') {
ret = findView(target, {failed: exitPopup});
if (ret.length <= 0) {
scrollCount++;
console.log('scroll');
scroll('up', {distance: 0.99, afterWait: 1000});
} else {
var text = ret.views[0].text;
console.log('text:' + text);
if (text == '我的设备') {
if (update()) {
successCount++;
} else {
result = -4;
console.error('我的设备设置失败');
}
} else if (text == '双卡和移动网络') {
if (network()) {
successCount++;
} else {
result = -8;
console.error('移动网络设置失败');
}
} else if (text == '锁屏') {
if (lockScreen()) {
successCount++;
} else {
result = -5;
console.error('锁屏设置失败');
}
} else if (text == '电池与性能') {
if (performance()) {
successCount++;
} else {
result = -6;
console.error('电池与性能失败');
}
} else if (text == '应用设置') {
target = target.replace('授权管理|', '');
result = app();
if (result == 1) {
successCount++;
}
} else if (text == '授权管理') {
target = target.replace('应用设置|', '');
result = app(false);
}
target = target.replace(text+'|', '');
}
}
if (successCount == 4) {
result = 1;
}
console.log('end:' + result);
exitAppDeal();
return result;
}
function app(doFirst=true) {
var result = -7, success = true;
if (doFirst) {
var ret = switchPage('txt:应用设置', 'txt:授权管理', {click: true, failed: exitPopup});
success = ret.length > 0;
}
if (success) {
var ret = switchPage('txt:授权管理', 'txt:应用权限管理', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = switchPage('txt:应用权限管理', 'txt:应用管理', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = findView('txt$:个应用程序');
if (ret.length > 0) {
click(ret.views[0], {click: true});
ret = findView('cn:miui.widget.ClearableEditText');
if (ret.length > 0) {
console.log('do paste:' + getAppName());
paste(ret.views[0], getAppName(), {type: 'paste', afterWait: 4000});
var container = findView('cn:androidx.recyclerview.widget.RecyclerView');
if (container.length > 0 && container.views[0].size > 0) {
console.log('click sub item');
click(container.views[0][0], {click: true, afterWait: 1000});
scroll('up', {distance: 0.99, afterWait: 1000});
if (setAppPermission('允许应用在锁屏上显示')) {
if (setAppPermission('允许应用在后台弹出界面')) {
result = 1;
} else {
console.log('设置 允许应用在后台弹出界面失败');
}
} else {
console.log('设置 锁屏上显示应用失败');
}
} else {
console.log('can not find recyclerView:' + container.views[0].size);
}
} else {
console.log('can not find edit');
}
}
if (result == 1) {
result = -2;
if (back2Page('txt:授权管理', {failed: exitPopup})) {
ret = switchPage('txt:自启动管理', 'txt:更多', {click: true, failed: exitPopup});
if (ret.length > 0) {
console.log('start find');
var container = findView('cn:androidx.recyclerview.widget.RecyclerView', {failed: exitPopup});
var count = 0, appName = getAppName();
while (container.views[0].size > 0 && count < 20) {
var find = false;
for (var item of container.views[0]) {
if (item[1].className=='android.widget.TextView' && item[1].text==appName) {
if (!item[2].checked) {
click(item[2], {click:true});
}
find = true;
break;
} else if (item[1][0][0].className=='android.widget.TextView' && item[1][0][0].text==appName) {
if (!item[2].checked) {
click(item[2], {click: true});
}
find = true;
break;
}
}
if (find) {
console.log('ok----');
result = 1;
break;
}
console.log('scroll--');
count ++;
scroll('up', {root: container.views[0], type: 2, afterWait:1000});
container = findView('cn:androidx.recyclerview.widget.RecyclerView', {failed: exitPopup});
}
} else {
console.error('进入自启动失败');
}
} else {
console.log('没有进入授权管理');
}
}
} else {
console.log('没进入 应用管理');
}
}
}
return result;
}
function setAppPermission(itemName) {
var result = false;
var ret = findView('txt:' + itemName, {maxStep: 6});
if (ret.length > 0) {
console.log('找到 锁屏显示');
if (ret.views[0].parent.parent[1].text == '拒绝') {
ret = switchPage('txt:' + itemName, 'txt:取消', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = findView('txt:始终允许|txt:允许');
if (ret.length > 0) {
click(ret.views[0], {click: true, afterWait: 2000});
result = true;
}
}
} else {
result = true;
console.log('已经不是拒绝,所以不再');
}
} else {
console.error('无法找到:' + itemName);
}
return result;
}
function performance() {
var result = false;
var ret = switchPage('txt:电池与性能', 'txt:省电模式', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = switchPage('txt:设置', 'txt:锁屏后断开数据', {click: true, failed: exitPopup});
if (ret.length > 0) {
if (ret.views[0].parent.parent[1][0][0][0].text!='从不') {
ret = switchPage('txt:锁屏后断开数据', 'txt:30分钟后', {click: true, failed: exitPopup});
if (ret.length > 0) {
click(ret.views[0].parent.parent.parent.parent.parent[3], {click: true});
result = true;
}
} else {
result = true;
}
} else {
console.log('找不到 锁屏后断开数据');
}
back2Page('txt:隐私保护|txt:锁屏', {failed: exitPopup});
} else {
console.log('进入性能失败');
}
return result;
}
function update() {
var result = false;
var ret = switchPage('txt:我的设备', 'txt:MIUI 版本', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = switchPage('txt:MIUI 版本', 'txt:菜单|txt:发现新版本', {click: true, failed: exitPopup});
if (ret.length > 0) {
if (ret.tag == '菜单') {
ret = switchPage('txt:菜单', 'txt:系统更新设置', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = switchPage('txt:系统更新设置', 'txt:自动下载', {click: true, failed: exitPopup});
if (ret.length > 0) {
if (ret.views[0].parent.parent[1][0].checked) {
click(ret.views[0], {click: true, afterWait: 1000});
}
ret = findView('txt:智能更新');
if (ret.length > 0 && ret.views[0].parent.parent[1][0].checked) {
click(ret.views[0], {click: true, afterWait: 1000});
}
ret = findView('txt:自动更新');
if (ret.length > 0 && ret.views[0].parent.parent[1][0].checked) {
click(ret.views[0], {click: true, afterWait: 1000});
}
ret = findView('txt:加入优先升级计划');
if (ret.length > 0 && ret.views[0].parent.parent[1][0].checked) {
click(ret.views[0], {click: true, afterWait: 1000});
}
result = true;
} else {
console.log('找不到自动下载');
}
} else {
console.log('找不到系统更新设置');
}
} else {
console.log('直接找到 发现新版本');
result = true;
}
} else {
console.log('进入设置失败');
}
back2Page('txt:蓝牙', {failed: exitPopup});
} else {
console.log('进入我的失败');
}
return result;
}
function network() {
var result = false;
var ret = switchPage('txt:双卡和移动网络', 'txt:启用数据网络', {click: true, failed: exitPopup});
if (ret.length > 0) {
if (ret.views[0].parent.parent[1][0].checked) {
click(ret.views[0], {click: true, afterWait: 1000});
ret = findView('txt:始终接收彩信');
if (ret.length > 0 && ret.views[0].parent.parent[1][0].checked) {
click(ret.views[0], {click: true, afterWait: 1000});
}
result = true;
}
back2Page('txt:蓝牙', {failed: exitPopup});
}
return result;
}
function lockScreen() {
var result = false;
var ret = switchPage('txt:锁屏', 'txt:自动锁屏', {click: true, failed: exitPopup});
if (ret.length > 0) {
if (ret.views[0].parent.parent[1][0][0].text!='屏幕永不休眠') {
ret = switchPage('txt:自动锁屏', 'txt:永不', {click: true, failed: exitPopup});
if (ret.length > 0) {
click(ret.views[0], {click: true});
result = true;
}
} else {
result = true;
}
back2Page('txt:蓝牙', {failed: exitPopup});
}
return result;
}
function exitPopup() {
var ret = findView('txt:暂不开启|txt:关于自启动的说明|txt:进入首页', {maxStep:1});
if (ret.length > 0) {
console.log('text:' + ret.tag);
if (ret.views[0].text == '关于自启动的说明') {
clickByTag('txt:确定', {click: true});
} else {
click(ret.views[0], {click: true, afterWait: 1000});
}
return true;
}
return false;
}
import sys_xiaomi_runtime;
function main() {
var result = -1;
if (!launchApp('com.miui.securitycenter')) {
console.error('启动失败');
return result;
}
var ret = waitAppLaunched('txt:安全中心', {failed: exitPopup, maxStep:30});
if (ret.length <= 0) {
console.error('找不到容器');
return result;
}
ret = switchPage('txt:设置', 'txt:优化加速', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = switchPage('txt:优化加速', 'txt:锁定任务', {click: true, failed: exitPopup});
if (ret.length > 0) {
ret = switchPage('txt:锁定任务', 'txt:屏幕录制|txt:收音机', {click: true, failed: exitPopup});
if (ret.length > 0) {
var container = findView('cn:androidx.recyclerview.widget.RecyclerView', {maxStep:10});
var count = 0, appName=getAppName();
while (container.length > 0 && count < 20) {
var find = false;
for (var item of container.views[0]) {
if (item[1].className=='android.widget.TextView' && item[1].text==appName) {
if (!item[2].checked) {
click(item, {click: true, afterWait: 1000});
}
find = true;
break;
} else if (item[1][0].className=='android.widget.TextView' && item[1][0].text==appName) {
if (!item[2].checked) {
click(item, {click: true, afterWait: 1000});
}
find = true;
break;
}
}
if (find) {
result = 1;
break;
}
count++;
console.log('scroll');
scroll('up', {type: 2, root: container.views[0], afterWait: 1000});
container = findView('cn:androidx.recyclerview.widget.RecyclerView', {maxStep:10});
}
} else {
console.error('进入锁定任务失败1');
}
} else {
console.error('进入锁定任务失败');
}
} else {
console.error('进入优化设置失败');
}
exitAppDeal();
return result;
}
function exitPopup() {
var ret = findView('txt*:用户须知', {maxStep:1});
if (ret.length > 0 && ret.views[0].text.includes('用户须知')) {
clickByTag('txt:同意', {click: true});
} else {
globalExitPopup();
}
}