最近在研究 monkey 源码,准备进行二次开发或是抠出部分代码用于其他用途,遇到不少坑
最主要是 android 源码调用的问题
一. 调用 android 隐藏类,会报 Unknown Source,比如下面这个代码
public class MonkeyNetworkMonitor extends IIntentReceiver.Stub
我使用 Eclipse 新建的 java 工程,导入 android.jar 和 framwork.jar 后是没报错的,但是重新编译转成二进制 jar 包的时候提示解析错误如下
D:\adt-bundle-windows-x86_64-20140321\sdk\build-tools\19.0.2>dx --dex --output=monkey.jar D:\adt-bun
dle-windows-x86_64-20140321\sdk\build-tools\19.0.2\SmarMonkey.jar

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.jav
a:388)
at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
at com.android.dx.command.dexer.Main.processClass(Main.java:665)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
at com.android.dx.command.dexer.Main.access$600(Main.java:78)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
at com.android.dx.command.dexer.Main.processOne(Main.java:596)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)
...while parsing com/android/commands/monkey/MonkeyNetworkMonitor.class

1 error; aborting
在 eclipse 按 java 工程运行提示
Exception in thread "main" java.lang.UnsatisfiedLinkError: android.os.Binder.init() V
at android.os.Binder.init(Native Method)
at android.os.Binder.(Unknown Source)
at android.content.IIntentReceiver$Stub.(Unknown Source)
at com.android.commands.monkey.MonkeyNetworkMonitor.(MonkeyNetworkMonitor.java:32)
at com.android.commands.monkey.Monkey.(Monkey.java:216)
at com.android.commands.monkey.Monkey.main(Monkey.java:471)

疑问的时,没看见有复制 aidl 文件呀,居然没报错,跟获取 mWm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 一样,这个也没报错
重新编译的时候就报错了,不知道为啥

二. 看见 zhangzhao_lenovo 利用 monkey 进行二次开发的 fastmonkey 不需要 root 权限,而且可以匹配不同的 android 版本
很想知道是怎么做到的,求各路大神提供思路


↙↙↙阅读原文可查看相关链接,并与作者交流