在红米note4上实现自动安装软件

因为要做自动化测试,需要对已发布的包进行回归手测,这个时候需要手动安装APK,但是红米会弹出继续安装的按钮,手点一次比较烦,想自动点"继续安装"按钮!

感谢先行者们的分享

本文参考:

http://blog.csdn.net/itfootball/article/details/21953763

https://testerhome.com/topics/3800

http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

0. 干货区

如果你想知道一下什么是AccessibilityService,可自行搜索学习或看官方介绍 http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

开启方法:
普通手机: 设置 -> 无障碍/辅助功能 -> 服务 -> AutoInstall -> 开启 -> 确定
某些手机:设置 -> 其它高级设置 -> 辅助功能 -> 服务 -> AutoInstall -> 开启 -> 确定

注意:
开启自动安装不仅适用于adb install,也适用于主动点击apk来启动安装。所以有安全风险,建议仅在测试机器上安装

git地址  https://github.com/guhan121/autoinstall.git

1. 代码区

不需要Activity,仅需要一个继承AccessibilityService的服务,在服务里兼听onAccessibilityEvent,当出现安装界面的时候,自动去点击。在安装完成后,到辅助功能里开启即可。

AutoInstallService.java
package com.mrqyoung.autoinstall;

import android.accessibilityservice.AccessibilityService;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;

import java.util.List;

public class AutoInstallService extends AccessibilityService {

    private static final String TAG = "AutoInstallService";
    private static String PACKAGE_INSTALLER = "com.miui.securitycenter";

    public AutoInstallService() {
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        //log(event.toString());
        if (event.getSource() == null) {
            log("<null> event source");
            return;
        }
        int eventType = event.getEventType();
        if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            log("event Perform: " + event.getPackageName());
            if( event.getPackageName().equals(PACKAGE_INSTALLER)) {
                boolean r = performInstallation(event);
                log("Action Perform: " + r);
            }
        }

    }

    @Override
    public void onInterrupt() {
        log("AutoInstallServiceInterrupted");
    }

    private void log(String s) {
        Log.d(TAG, s);
    }

    private boolean performInstallation(AccessibilityEvent event) {
        List<AccessibilityNodeInfo> nodeInfoList;
        String[] labels = new String[]{"确定", "继续安装", "下一步", "完成"};
        for (String label : labels) {
            nodeInfoList = event.getSource().findAccessibilityNodeInfosByText(label);
            if (nodeInfoList != null && !nodeInfoList.isEmpty()) {
                boolean performed = performClick(nodeInfoList);
                if (performed) return true;
            }
        }
        return false;
    }

    private boolean performClick(List<AccessibilityNodeInfo> nodeInfoList) {
        for (AccessibilityNodeInfo node : nodeInfoList) {
            if (node.isClickable() && node.isEnabled()) {
                return node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
        }
        return false;
    }

}

AndroidManifest里面要声明权限,除了上面从代码里面可以过滤,通过meta-data的xml里也可直接配置过滤

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mrqyoung.autoinstall" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black" >
        <service
            android:name=".AutoInstallService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibilityservice" />
        </service>
    </application>

</manifest>

在AndroidManifest里面引用的meta-data文件,样例

@xml/accessibilityservice.xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:description="@string/description"
    android:accessibilityFeedbackType="feedbackVisual"
    android:notificationTimeout="1000"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    xmlns:android="http://schemas.android.com/apk/res/android" />
<!--  第3行等同于过滤 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED --><!-- android:packageNames="com.android.packageinstaller" 无这个参数主要是开始也不知道那个包在管理安装 -->
gradle build 编译,使用的是2.2版本的gradle

adb uninstall com.mrqyoung.autoinstall 卸载这个应用adb install app-debug.apk 将这个应用直接从PC机安装到手机上,当然第一次你需要手动点"继续安装"

时间: 2024-10-14 18:12:27

在红米note4上实现自动安装软件的相关文章

ubuntu自动安装软件apt-get命令

转自:http://blog.csdn.net/chen861201/article/details/7035021 apt-cache search package  搜索包 apt-cache show package  获取包的相关信息,如说明.大小.版本等sudo apt-get install package  安装包sudo apt-get install package - - reinstall  重新安装包sudo apt-get -f install  强制安装sudo ap

通过puppet批量自动安装软件

通过puppet安装软件.以shotgun_desktop为例: # install shotgun_desktop package { 'shotgun_desktop': } -> file { 'remove shotgun desktop libQt':     path   => "/opt/Shotgun/Qt/lib",     ensure => absent,     force  => true, } file { '/usr/lib64/l

windows上一键自动安装zabbix-agent

一.简介 zabbix是开源界流行的监控程序,C/S架构,运行多种系统平台安装,个人认为windows平台的 zabbix-agent安装最为烦琐,unix及linux平台通过自动化运维工具可一键远程安装,而windows目前没有好的方法,所以就参考网上写了一个脚本(包含zabbix-agent 2.4.5客户端),一键安装并配置好防火墙. 二.安装脚本(配置文件) 请先修改脚本中zabbbix_server 为自己的zabbix服务器ip @Echo off setlocal enablede

openwrt 在无usb的wifi 路由器上用opkg 安装软件

前言 前几天把dir615 刷成了openwrt,在安装完毕之后,发现最大的问题是自身的内存太小,导致可用存储空间不足,安装几个软件后就报存储空间不足了.由于这个路由没有usb接口,所以无法外挂存储.为了仍能愉快的安装各种软件,我设计了用NFS 扩展路由器存储空间的办法: 工具准备 wifi Router:Dir615nfs Server :Mac Mini nfs Server 配置 条件有限,我手上只有一台Mac Mini,所以就利用Mac OS 自带的NFS 进行配置了 sudo vi /

vs2010 setup 打包 安装 BAT批处理实现自动安装软件功能

[email protected] offECHO.ECHO 安装 Diskeeper 7.0.428ECHO 请稍等...start /wait %systemdrive%\install\Applications\diskeeper\Setup.exe /s /v/qn ECHO.ECHO 更新 Diskeeper 7.0.428 到 7.0.430ECHO 请稍等...start /wait %systemdrive%\install\Applications\diskeeper\us_d

Linux在本地使用yum安装软件(转)

经常遇到有的linux服务器由于特殊原因,不能连接外网,但是经常需要安装一些软件,尤其是在编译一些包的时候经常由于没有安装一些依存包而报的各种各样的错误,当你找到依存的rpm包去安装的时候,又提示你有其他的依存包没有安装,非常烦人.记得刚开始玩linux的时候曾经因为要安装一个包安装了一上午而大为恼火,折磨得人几乎崩溃! 我们知道linux下有一个很好的工具,为我们广大的工作在linux平台下的劳苦大众带来了福音,那就是大名鼎鼎的yum软件.在可以连网的时候非常方便,那么我们如何在不能连接外网的

软件自动安装

需要的工具:AUTOIT 只需要几行代码,便可以模拟整个软件的安装过程,非常的方便. 需要了解的代码:Run 执行某个exe程序 WinWait 等待某个窗口出现 Send 发送消息给窗口 ControlClick 点击窗口上的某个按钮 以安装优酷APP为例: 整个的安装代码如下所示 Run("youku.exe") WinWait("优酷 V7.0版","A:\Program Files (x86)\YouKu\YoukuClient") Se

rsync自动同步软件安装和使用

一.介绍 (不想看直接可以跳过) Rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync本来是用以取代rcp的一个工具,它当前由 rsync.samba.org维护.Rsync使用所谓的"Rsync演算法"来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快.运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据:也可以

在 Linux 实例上自动安装并运行 VNC Server

原文网址:https://help.aliyun.com/knowledge_detail/41181.html?spm=5176.8208715.110.11.4c184ae8mlC7Yy 您可以使用本文提供的脚本在Linux实例上自动安装并运行VNC Server,实现远程图形化管理Linux服务器.目前,该脚本仅适用于CentOS实例,会在CentOS实例中安装GNOME桌面环境. VNC Server脚本 适用镜像:目前仅适用于CentOS镜像. 使用方法:以root身份执行命令 bas