因为要做自动化测试,需要对已发布的包进行回归手测,这个时候需要手动安装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机安装到手机上,当然第一次你需要手动点"继续安装"

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

  1. Linux系统上查找已安装软件的路径

    在Linux系统上查找已安装软件路径的命令,以查找pcre的安装路径为例: [root@localhost doc]# rpm -ql pcre /lib64/libpcre.so. /lib64/l ...

  2. Window Server 2019 配置篇(6)- 利用组策略实现域内自动安装软件

    上次我们建立了WSUS实现了更新管理,那么现在我们需要的是让集群内的客户机(之后会建立在hyper-v集群上)和服务器都能装上三个软件 1. Microsoft Team 2. Notepad++ 3 ...

  3. 在mac上利用homebrew安装软件

    在mac经常需要安装一些软件,你可以通过app store下载,或者可以通过浏览袭搜索下载.这里介绍通过homebrew安装一些软件,它会自动为你下载一些软件的相关依赖,免去安装的烦恼. 首先我们需要 ...

  4. 在 mac 上利用 homebrew 安装软件

    在mac经常需要安装一些软件,你可以通过app store下载,或者可以通过浏览袭搜索下载.这里介绍通过homebrew安装一些软件,它会自动为你下载一些软件的相关依赖,免去安装的烦恼. 首先我们需要 ...

  5. [转载]--用Python 自动安装软件

    脚本使用了  Python 2.3 + Com 对象,所以你的系统必须安装Python2.3或更高版本同时必须安装  Mark Hammond's Win32all 模块 (特别感谢Mark Hamm ...

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

    CLS@echo offECHO.ECHO 安装 Diskeeper 7.0.428ECHO 请稍等...start /wait %systemdrive%\install\Applications\ ...

  7. Linux上使用源代码安装软件

  8. day3 自动部署安装软件到其他的机器设备上

    PS:原理是在本机创建boot.sh指向每一台主机,使用脚本命令去执行,然后就会自动安装软件 PS:boot.sh里面放着1.免密登录 2.发送每台机器install.sh 这个install.sh中 ...

  9. Window平台下的静默下载并安装软件脚本bat

    一,隐藏命令窗口 当我们运行bat脚本的时候,弹出CMD窗口.如果要隐藏窗口可以在bat脚本开头处写一下代码: @echo off if "%1" == "h" ...

随机推荐

  1. 【Partition List】cpp

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  2. iOS笔记052- Quartz2D-绘图

      简介 Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作       绘制图形 : 线条\三角形\矩形\圆\弧等       绘制文字       绘 ...

  3. Python subprocess.Popen中communicate()和wait()区别

    刚开始我是使用的wait(),但是当adb命令返回太多时,程序就会卡死,查询得知原因后,才使用了communicate(),communicate()返回一个元组:(stdoutdata, stder ...

  4. 深入学习之mysql(二)表的操作

    1.表:是数据库中的存储数据的基本单位,一个表包含若干个字段和值 2.创建表: CREATE TABLE 表名称 ( 字段名1 数据库类型1 [约束条件1], 字段名2 数据库类型2 [约束条件2], ...

  5. Jquery版放大镜效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. java主要集合类的数据结构学习

    http://www.cnblogs.com/beanmoon/archive/2012/11/22/2782442.html 在程序中,集合类每天都在使用,以致于某些代码充斥着List和Map,一直 ...

  7. Vue2.0 - 构造器的延伸 Vue.extend

    Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元 ...

  8. 理解点击屏幕的事件响应--->对- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法的理解

    要理解这两个方法.先了解一下用户触摸屏幕后的事件传递过程. 当用户点击屏幕后,UIApplication 先响应事件,然后传递给UIWindow.如果window可以响应.就开始遍历window的su ...

  9. CLion 使用笔记

    我并不会写 CMakeFiles . 我要对拍,所以需要按下 Ctrl + F9 后同时编译 main.cpp 和 ref.cpp 两个文件,并生成 main.exe 和 ref.exe 以备进一步处 ...

  10. 关于可图化序列的一点结论 NEU 1429

    Graphic Sequence A graphic sequence is a sequence of numbers which can be the degree sequence of som ...