关于android系统运行纯java的讨论

dong_shuai 2011-09-07 01:46:28
请看完整篇帖子,不管你能不能解答对你都将很有帮助eoe上闲逛看到了一片帖子

http://www.eoeandroid.com/thread-26027-1-1.html

[Android 机制] 请教一个sendkey的问题 [color=rgb(153, 153, 153) !important][复制链接]
bit_eric


写了一个android的测试程序,发现在通话状态下测试程序不能sendCharacterSync(KeyEvent.KEYCODE_ENDCALL);

抛出异常java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission

权限什么的都加了,键盘锁也解了,在非通话状态下sendCharacterSync(KeyEvent.KEYCODE_ENDCALL);是可以的

所以我猜是不是android不允许向通话这种底层程序发送sendkey事件?

请路过帮顶,高人解答,感激不尽




[tr][/tr]
zhengmine


哈哈,我知道怎么解决,我监听和注入任意外部输入事件都实现了

zhengmine



google的权限设置很白痴,要绕过权限很容易,你不写android,纯java就不会有权限问题,google在android系统中相当于一个集成者的角色,我在其中很少看到智慧的光芒,可以说Android在设计上不怎么样







[tr][/tr]
zhengmine


励精图治 Ⅳ

Android 有系统service提供此功能 你查查injectKeyEvent,你可以写个纯java的程序调用此service,系统则不会检查你的权限

zhengmine




是你没看清楚我说的,我说让你写一个纯java的程序,不是android的apk,系统不会提示没权限的,因为写的不是android,就相当于linux下的java









LCamel




試了injectKeyEvent, zhengmine 兄的方法確實可行, 也不用 root, 感謝!



android能运行纯java而且还没有权限限制,那岂不是。。。。让人有很多想象空间,所以觉得研究下这个方法


在网上找到一片基本的文章 http://disanji.net/2011/05/10/android-basic-dalvik-vm-call/

是写在android系统里边运行
class Foo {
public static void main(String[] args) {System.out.println("Hello, world"); }}能正常运行,之后又写了一个纯java的联网程序也正常运行且不需要<uses-permission android:name="android.permission.INTERNET"></uses-permission>感觉很爽,终于能突破android权限做一些事了。



于是我又写了一个
import android.app.Instrumentation;
class Press {

public static void main(String[] args) {

System.out.println("Hello, world");

Instrumentation inst=new Instrumentation();

inst.sendKeyDownUpSync(4);

}
}
模拟按键的程序,编译打jar包都没有问题,可运行时却出现了
Hello, world
java.lang.UnsatisfiedLinkError: getContextObject
at com.android.internal.os.BinderInternal.getContextObject(Native Method
)
at android.os.ServiceManager.getIServiceManager(ServiceManager.java:39)
at android.os.ServiceManager.getService(ServiceManager.java:55)
at android.app.Instrumentation.sendKeySync(Instrumentation.java:859)
at android.app.Instrumentation.sendKeyDownUpSync(Instrumentation.java:87
1)
at Press.main(Press.java:8)
at dalvik.system.NativeStart.main(Native Method)



错误,这个错误已经困扰我好几天了,今天把研究成果和问题拿出来和大家一起讨论下,看看有没有大侠能够解决的






...全文
1508 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
xumin198908 2014-02-10
  • 打赏
  • 举报
回复
楼主可否贴出代码来学习下? jar中能实现模拟按键功能吗?我现在公司的项目需要模拟键盘按键。。。
windfan_sky 2013-08-22
  • 打赏
  • 举报
回复
不知道LZ解决了吗?我也是碰到这个问题了。
memechashang 2012-06-07
  • 打赏
  • 举报
回复
SDK上怎么写纯java哟。是要在源码环境下吧。。。。刚开始学,不太懂,忘指教。
bobo826 2012-01-13
  • 打赏
  • 举报
回复
你好问题解决来吗?请问你的代码是windows下编译的么?
另外模拟鼠标在源码下参考
http://hi.baidu.com/zhouhanqing/blog/item/1bfbaec593f4b5a48326acc7.html
dong_shuai 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 othereyeopen 的回复:]

引用 29 楼 dong_shuai 的回复:
纯java只是一种代称吧。。不要纠结我发帖所要解决的重点问题不是这个,是用这种方式写在android下能运行的程序能够绕过系统权限。如果再纠结这个问题还是不要回帖了,没有意义

支持你的探索,但你没明白真正的意思。
android机制是每人都有自己的vm,而jvm是一个的
你要跑去用系统级别的东西,相当于跨越android的vm来相互之间……
[/Quote]

你可以动手试一下就明白了
OtherEyeOpen 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 dong_shuai 的回复:]
纯java只是一种代称吧。。不要纠结我发帖所要解决的重点问题不是这个,是用这种方式写在android下能运行的程序能够绕过系统权限。如果再纠结这个问题还是不要回帖了,没有意义
[/Quote]
支持你的探索,但你没明白真正的意思。
android机制是每人都有自己的vm,而jvm是一个的
你要跑去用系统级别的东西,相当于跨越android的vm来相互之间调用,逃不过android的。
你的java无论如何都在你启动的那个java环境中。。。
这就是你根本的问题,当然漏洞这种东西就在于探索,不能说没有。
而你还没找到方向,单纯改造你的代码本就没什么意义。
dong_shuai 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 hijovi 的回复:]

总结下

UnsatisfiedLinkError 应该是连接库文件错误


sendKeyDownUpSync--》sendKeySync--->IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
.injectKeyEvent(event, true);

……
[/Quote]
好的,谢谢回复
hijovi 2011-09-09
  • 打赏
  • 举报
回复
总结下

UnsatisfiedLinkError 应该是连接库文件错误


sendKeyDownUpSync--》sendKeySync--->IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
.injectKeyEvent(event, true);

错误应该是ServiceManager.getService("window")

ServiceManager.getService("window")---》 BinderInternal.java native IBinder getContextObject();
底层实现 android_util_Binder.cpp --》jobject android_os_BinderInternal_getContextObject
编译后库文件 libandroid_servers.so

暂时没头绪 可以考虑jni来玩



dong_shuai 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hijovi 的回复:]

引用 21 楼 dong_shuai 的回复:

引用 20 楼 hijovi 的回复:

你可以发apk出来看看。:-)。。
是否使用adb?
呵呵


朋友,你到底会不会android 啊。。。。。。。。。。。。。。。。。。。在apk里边执行 Process process = Runtime.getRuntime().exec("dalvikvm -cp /sdcard/……
[/Quote]

不会就整明白再发表激烈言论,还是很感谢你的热心
hijovi 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 dong_shuai 的回复:]

引用 20 楼 hijovi 的回复:

你可以发apk出来看看。:-)。。
是否使用adb?
呵呵


朋友,你到底会不会android 啊。。。。。。。。。。。。。。。。。。。在apk里边执行 Process process = Runtime.getRuntime().exec("dalvikvm -cp /sdcard/foo.jar Foo");

在电脑命令行里执行……
[/Quote]

我是小白。。不会 我是菜鸟。。。。给高手跪下了
dong_shuai 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hijovi 的回复:]

你可以发apk出来看看。:-)。。
是否使用adb?
呵呵
[/Quote]

朋友,你到底会不会android 啊。。。。。。。。。。。。。。。。。。。在apk里边执行 Process process = Runtime.getRuntime().exec("dalvikvm -cp /sdcard/foo.jar Foo");

在电脑命令行里执行 adb shell dalvikvm -cp /sdcard/foo.jar Foo 这还要我跟你讲????????
hijovi 2011-09-08
  • 打赏
  • 举报
回复
你可以发apk出来看看。:-)。。
是否使用adb?
呵呵
dong_shuai 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hijovi 的回复:]

引用 11 楼 dong_shuai 的回复:

引用 10 楼 hijovi 的回复:

引用 9 楼 dong_shuai 的回复:

引用 8 楼 l417584711 的回复:

我引用错了。。。
import java.lang.instrument.Instrumentation;
有空再看看


恩,这是一个很有意思的方向,可以研究讨论一下


怎么……
[/Quote]

没确定不要下定论谢谢

我早就试过了朋友。。。你去试试再说吧。。你才傻呢好吗
hijovi 2011-09-08
  • 打赏
  • 举报
回复
你是否好好看了文章。
你是否使用了adb?这个是要adb的!
hijovi 2011-09-08
  • 打赏
  • 举报
回复
你根本没认真看文章。甚至没理解
这完全是要依靠 adb来实现的。。
hijovi 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dong_shuai 的回复:]

引用 10 楼 hijovi 的回复:

引用 9 楼 dong_shuai 的回复:

引用 8 楼 l417584711 的回复:

我引用错了。。。
import java.lang.instrument.Instrumentation;
有空再看看


恩,这是一个很有意思的方向,可以研究讨论一下


怎么给别人安装》??(叫别人用命令行装么) = =b
打……
[/Quote]

傻呀你。!! 这样不行的 你打包apk就要权限的。。汗!
你确定打包了 apk? 没确定不要下定论谢谢
你太天真了。。
ps:如果可以 流氓应该漫天飞了。。
dong_shuai 2011-09-08
  • 打赏
  • 举报
回复
没有人理。。。
dong_shuai 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 othereyeopen 的回复:]

引用 4 楼 hen_hen_hen_hen 的回复:
总之,是不能“纯”java的。

Android已不是原来那个java了,很多地方都改动过,只能是语法上的纯了。

甲骨文公司起诉Google就是因此缘故。

正解。本质上是因为
android的dalvik vm跟sun的jvm不一致
即便部分class能通用,有问题也是正常的。
lz这是在做两者的磨合试验么?
[/Quote]

纯java只是一种代称吧。。不要纠结我发帖所要解决的重点问题不是这个,是用这种方式写在android下能运行的程序能够绕过系统权限。如果再纠结这个问题还是不要回帖了,没有意义
dong_shuai 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hen_hen_hen_hen 的回复:]

引用 5 楼 dong_shuai 的回复:
引用 4 楼 hen_hen_hen_hen 的回复:

总之,是不能“纯”java的。

Android已不是原来那个java了,很多地方都改动过,只能是语法上的纯了。

甲骨文公司起诉Google就是因此缘故。


谢谢你的回答,但是你并没有仔细看我的帖子 http://disanji.net/2011/05/10/andr……
[/Quote]

纯java只是一种代称吧。。不要纠结,我发帖所要解决的重点问题不是这个,是用这种方式写在android下能运行的程序能够绕过系统权限。如果再纠结这个问题还是不要回帖了,没有意义
OtherEyeOpen 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hen_hen_hen_hen 的回复:]
总之,是不能“纯”java的。

Android已不是原来那个java了,很多地方都改动过,只能是语法上的纯了。

甲骨文公司起诉Google就是因此缘故。
[/Quote]
正解。本质上是因为
android的dalvik vm跟sun的jvm不一致
即便部分class能通用,有问题也是正常的。
lz这是在做两者的磨合试验么?
加载更多回复(17)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧