转载请注明出处:http://blog.csdn.net/llew2011/article/details/52822148
说起外挂特别是玩游戏的小伙伴估计对它很熟悉,肯定有部分小伙伴使用过,至于为什么使用它,你懂得(*^__^*) ……我最早接触外挂是在大二的时候,那时候盛行玩QQ农场,早上一睁眼就是打开电脑先把自己的菜收了,收完之后再去偷别人的;后来童靴说非凡软件上有一个偷菜外挂,于是赶紧整了一个,有了外挂之后就告别了体力时代,省时又省力……既然在PC上有外挂,那在智能手机上可以做外挂呢?答案是OK的,今天这篇文章就是讲解一下如何在Android设备上制作自己的小外挂,需要说明的是本文仅仅做技术交流……
产生做外挂的念头是在去年春节时支付宝推的咻一咻咻大奖活动,那时候每到咻一咻的时间点就赶紧打开支付宝进入咻一咻页面然后不停的点击咻一咻按钮,后来我就想与其这样一直重复点击按钮不如花点时间整个咻一咻小外挂,于是花了小半天时间写了一个,经过实践发现效果还挺理想的……其实在Android设备上制作小外挂并不是多么高深的技术,核心就是利用AccessibilityService,如果你对该类已经很熟悉,请跳过本文(*^__^*) ……
AccessibilityService是Google为了方便那些身体不便的用户来使用Android设备而提供的一种无障碍服务,该服务可以帮助那些身体不便的用户更加简单的使用和操作Android设备,这些操作包括文字转语音,触觉反馈,收拾操作,轨迹球和手柄操作等。AccessibilityService提供的这种服务就是用来监听指定的应用的,例如监听指定应用页面内容的边界,页面的跳转,焦点的变化等等。因此我们可以利用该服务做我们想做的小外挂,比如自动安装APP,抢红包外挂还有我之前写的咻一咻外挂,今天我们就讲解一下如何利用AccessibilityService来实现自动安装APP的小外挂。
AccessibilityService是Service的子类,但是它的声明周期是由系统来管理的,那也就是说我们要想启动该服务就不能够像平时那样直接startService()了而是需要在Android设备的辅助功能列表中手动开启该服务,当开启该服务后其生命周期就交由系统来管理和维护了。需要注意的是虽然不需要通过startService()等方式来启动AccessibilityService服务,但是AccessibilityService依然是需要在配置文件AndroidManifest.xml中配置。由于AccessibilityService是抽象类不能直接使用,所以需要先自定义一个类来继承AccessibilityService,自定义AutoInstallApkService服务类代码如下:
public class AutoInstallApkService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// 事件入口处
}
@Override
public void onInterrupt() {
}
}
AutoInstallApkService重写了AccessibilityServiced的俩抽象方法,onAccessibilityEvent()方法表示该服务接收系统传递进来的辅助事件(该事件可能是当前窗口内容发生变化触发的,也可能是当前窗口焦点发生变化触发的,还有可能是系统弹出Notification触发的等等),该方法为事件入口,每当监听的指定应用触发了指定事件的时候都会回调此方法。而onInterrupt()方法表示服务中断发生的回调,服务中断意味着不能接收回调了,但是可以在方法中做些相关业务等操作。
定义完了我们的AutoInstallApkService服务后,接下就是在AndroidManifest.xml文件中配置该服务了,根据官方文档,配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.llew.wb.project.service.accessibility.installapk">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>