Androidはコードの中でadbを操作します
10829 ワード
package com.example.emu_ddd.tools;
import android.content.Context;
import android.graphics.Bitmap;
public class AdbManager {
public static boolean findPicArea(int x, int y, int wid, int het,
String md5Tag) {
AdbUtil util = AdbUtil.getIns();
return util.findPicArea(x, y, wid, het, md5Tag);
}
public static boolean findPicArea(int x, int y, int wid, int het,
String md5Tag, long time) {
AdbUtil util = AdbUtil.getIns();
return util.findPicArea(x, y, wid, het, md5Tag, time);
}
public static void kill(String packageName) {
AdbSuUtil.kill(packageName);
}
public static void screenshot(String sdfilename) {
AdbSuUtil.screenshot(sdfilename);
}
public static void clickScreen(int x, int y) {
AdbSuUtil.clickScreen(x, y);
}
public static void enterText(String text) {
AdbSuUtil.enterText(text);
}
public static String getImgMd5(Bitmap bp, int x, int y, int wid, int het) {
AdbUtil util = AdbUtil.getIns();
return util.getImgMd5(bp, x, y, wid, het);
}
public static String getImgMd5(Bitmap bp) {
AdbUtil util = AdbUtil.getIns();
return util.getImgMd5(bp);
}
public static void clearData(String packageName) {
AdbSuUtil.delData(packageName);
}
public static void clearDatas(String packageName, String[] folders) {
AdbSuUtil.delDatas(packageName, folders);
}
public static void sendKey(int key) {
AdbSuUtil.sendKey(key);
}
public static String getTopActName(Context context) {
AdbUtil util = AdbUtil.getIns();
return util.getTopActName(context);
}
}
package com.example.emu_ddd.tools;
import android.os.Environment;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
public class AdbSuUtil {
private static String tag = "Emu_suutil";
public static void kill(String packageName) {
try {
Process process = Runtime.getRuntime().exec("su");
OutputStream out = process.getOutputStream();
String cmd = "am force-stop " + packageName + "
";
try {
out.write(cmd.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
process.getOutputStream().close();
process = null;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void screenshot(String sdfilename) {
try {
Log.e(tag, "screenshot...");
Process sh = Runtime.getRuntime().exec("su");
OutputStream os = sh.getOutputStream();
os.write(("/system/bin/screencap -p /sdcard/" + sdfilename + "
")
.getBytes());
os.flush();
os.write("exit
".getBytes());
os.flush();
sh.waitFor();
os.close();
Log.e(tag, "screenshoted!");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void clickScreen(int x, int y) {
Log.e(tag, "click " + x + "," + y);
String[] cmds = { "sendevent /dev/input/event0 3 0 " + x,
"sendevent /dev/input/event0 3 1 " + y,
"sendevent /dev/input/event0 1 330 1",
"sendevent /dev/input/event0 0 0 0",
"sendevent /dev/input/event0 1 330 0",
"sendevent /dev/input/event0 0 0 0" };
try {
Process sh = Runtime.getRuntime().exec("su");
OutputStream os = sh.getOutputStream();
for (int i = 0; i < cmds.length; i++) {
os.write((cmds[i] + "
").getBytes());
os.flush();
}
os.write("exit
".getBytes());
os.flush();
sh.waitFor();
os.close();
sh = null;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void enterText(String text) {
Log.e(tag, "enter : " + text);
try {
Process sh = Runtime.getRuntime().exec("su");
OutputStream os = sh.getOutputStream();
os.write(("input text " + text + "
").getBytes());
os.flush();
os.write("exit
".getBytes());
os.flush();
sh.waitFor();
os.close();
sh = null;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void sendKey(int key) {
Log.e(tag, "sendKey : " + key);
try {
Process sh = Runtime.getRuntime().exec("su");
OutputStream os = sh.getOutputStream();
os.write(("input keyevent " + key + "
").getBytes());
os.flush();
os.write("exit
".getBytes());
os.flush();
sh.waitFor();
os.close();
sh = null;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void delDatas(String packageName, String[] folders) {
Log.e(tag, "del : " + packageName);
String basePath = Environment.getDataDirectory() + "/data/"
+ packageName + "/";
try {
Process sh = Runtime.getRuntime().exec("su");
OutputStream os = sh.getOutputStream();
for (int i = 0; i < folders.length; i++) {
os.write(("rm -r " + basePath + folders[i] + "
").getBytes());
os.flush();
}
os.write("exit
".getBytes());
os.flush();
sh.waitFor();
os.close();
sh = null;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void delData(String packageName) {
delDatas(packageName, new String[] { "files", "cache", "shared_prefs",
"databases" });
}
}
package com.example.emu_ddd.tools;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
public class AdbUtil {
private String tag = "emu_zutil";
private static AdbUtil ins = new AdbUtil();
public static AdbUtil getIns() {
return ins;
}
public String getSdpah() {
return Environment.getExternalStorageDirectory().getPath();
}
public byte[] bitmapToBytes(Bitmap bitmap) {
if (bitmap == null) {
return null;
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
return os.toByteArray();
}
public void quit(boolean result, String des) {
if (result)
Log.i(this.tag, des + " !");
else
Log.i(this.tag, des + " !");
}
public boolean findPicArea(int x, int y, int wid, int het, String md5Tag) {
return findPicArea(x, y, wid, het, md5Tag, 20111L);
}
public boolean findPicArea(int x, int y, int wid, int het, String md5Tag,
long time) {
try {
long tagTime = System.currentTimeMillis();
while (System.currentTimeMillis() - tagTime <= time) {
File xy1 = new File(getSdpah() + "/xy1.png");
if (xy1.exists()) {
xy1.delete();
}
AdbSuUtil.screenshot("xy1.png");
Thread.sleep(2000L);
while (!xy1.exists()) {
Log.e(this.tag, " !!!");
AdbSuUtil.screenshot("xy1.png");
Thread.sleep(5000L);
}
InputStream in = new FileInputStream(xy1);
Bitmap b = BitmapFactory.decodeStream(in);
while (b == null) {
Thread.sleep(2000L);
b = BitmapFactory.decodeStream(in);
}
Log.i(this.tag, " bitMap!");
String ct = getImgMd5(b, x, y, wid, het);
if (ct.equals(md5Tag)) {
return true;
}
Thread.sleep(3000L);
}
return false;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static String getMD5String(byte[] bytes) {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("MD5");
digest.update(bytes);
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public String getImgMd5(Bitmap bp, int x, int y, int wid, int het) {
try {
Bitmap nb = Bitmap.createBitmap(bp, x, y, wid, het);
String ct = "";
ct = getMD5String(bitmapToBytes(nb));
return ct;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String getImgMd5(Bitmap bp) {
try {
return getMD5String(bitmapToBytes(bp));
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
public String getTopActName(Context context) {
try {
ActivityManager am = (ActivityManager) context
.getSystemService("activity");
List list = am.getRunningTasks(5);
return ((ActivityManager.RunningTaskInfo) list.get(0)).topActivity
.getClassName().toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
説明:
adb shell sendevent/dev/input/event 0 3 0 110//x座標adb shell sendevent/dev/input/event 0 3 1 70//y座標adb shell sendevent/dev/input/event 0 1 330 1//押下状態、正確には圧力値adb shell sendevent/dev/input/event 0 0 0 0//必要な1行のデータadb shell sendevent/dev/input/event 0 330//持ち上げ状態、無圧力値adb shell sendevent/dev/input/event 0 0//必要な1行であり、完全なデータのラベルを終了することに相当する