这种方法的好处可以使用 shell 用户的权限调用 Android 系统中的一些特殊接口,比如模拟点击,屏幕截图。
比如一个 Android 的包名是 com.example.helloworld
,首先拿到包在手机上的安装路径
$ adb shell pm path com.example.helloworld
# expect: package:/data/app/com.example.helloworld-1.apk
然后使用一个很长的命令调用启动 helloworld 中的 Console.java 中的代码
$ adb shell CLASSPATH=/data/app/com.example.helloworld-1.apk exec app_process /system/bin com.example.helloworld.Console --help
Usage of helloworld:
-h, --help print this message
-v, --version show current version
... other ...
具体用法大概就是这样,接下来说下这个 Console.java 该怎么写
Console.java
的文件。把下面的代码直接粘贴过去package com.example.helloworld;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by hzsunshx on 2017/5/11.
*/
public class Console {
private static final String PROCESS_NAME = "helloworld.cli";
private static final String VERSION = "1.0";
public static void main(String[] args) {
setArgV0(PROCESS_NAME);
for (String arg : args) {
if (arg.equals("--help")) {
System.out.println("TODO: Usage of " + PROCESS_NAME);
return;
} else if (arg.equals("--version")) {
System.out.println(VERSION);
return;
} else {
System.err.println("Error: unknown argument " + arg);
System.exit(1);
}
}
}
private static void setArgV0(String text) {
try {
Method setter = android.os.Process.class.getMethod("setArgV0", String.class);
setter.invoke(android.os.Process.class, text);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
这个代码比较简单,但是足够使用了。接下来用下外部的common-cli库,完善命令行的解析。
将compile group: 'commons-cli', name: 'commons-cli', version: '1.3.1'
加入到build.gradle
文件中
将main(String[] args)
中的代码修改成
public static void main(String[] args) {
setArgV0(PROCESS_NAME);
Options options = new Options();
options.addOption("v", "version", false, "show current version");
options.addOption("h", "help", false, "show this message");
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
System.err.println(e.getMessage());
formatter.printHelp(PROCESS_NAME, options);
System.exit(1);
return;
}
if (cmd.hasOption("help")) {
formatter.printHelp(PROCESS_NAME, options);
return;
}
if (cmd.hasOption("version")) {
System.out.println(VERSION);
return;
}
}
然后代码的上部加入import org.apache.commons.cli.*;
编译,然后安装到手机上,试试效果
$ adb shell CLASSPATH=/data/app/com.example.helloworld-2.apk exec app_process /system/bin com.example.helloworld.Console --help
usage: helloworld.cli
-h,--help show this message
-v,--version show current version
关于这个库的更详细的用法参考 https://commons.apache.org/proper/commons-cli/
好久没写文章了,另一方面也说明我很久没看新的东西了,罪过罪过。赶紧擦干净书上的灰尘,倒上一杯龙井茶。