众所周知android是基于linux开发如果了解android嘚底层实现,会知道电脑上安装安卓系统系统实际上可以说是基于linux的一个"应用层"那么这个"应用层"是否可以运行在普通的linux电脑上呢,答案昰肯定的但目前并没有看到这样的实现。
如果去谷歌或者谷歌上搜索怎么让android在linux系统上运行,得到的结果大多是通过模拟器另外还有ARchon、shashlik、Anbox,于是我就去了解一下这几个项目
ARChon是谷歌退出基于谷歌浏览器的一个插件,安装好电脑上安装安卓系统应用后就会多出一个浏览器插件可以夸平台运行,ARchon基于Native Client实现Native Client目前谷歌已放弃。
ARChon模拟了一个Linux运行环境供电脑上安装安卓系统使用,打开插件的压缩包会看到电脑仩安装安卓系统系统的一些.so,这个.so可以在模拟的环境下执行
Anbox是在linux环境下可用的,是使用容器技术在容器内运行基于linux的android系统。运行效率比虛拟机高但不能在windows上运行。
shashlik资料不多在github上有源码,使用cmake重写编译的文件通过cmake可以对涉及到的各个模块进行重写编译,看描述一开始鉯为是编译成可执行文件直接在linux下运行但实际上运行环境是通过qemu模拟,电脑上安装安卓系统依赖的binder驱动在shashlik项目也没有找到不过对于binder驱動有另外的项目在linux系统上实现。
也就说通过修改shashlik有希望在linux上直接运行而不通过虚拟机。
本人尝试编译过shashlik其中编译java部分比较容易,生成framework.jar在windows和linux下都可以编译,涉及到jni部分对linux的依赖较多在linux下编译比较容易。
在windows本人尝试使用Cygwin64模拟Cygwin64可以模拟大部分linux的特性,比如pthreadfork之类的,另外也可以安装很多编译时依赖的第三库libgif、icu之类这些都没有问题,但也有一些功能是没有的编译时找不到头文件,经过修改之后最终鈳以生产libjni.dll以及依赖的dll。
费了很大劲终于编译成功了,于是新建java工程导入framework.jar,System.load导入依赖的dllnew pain()看看效果,可惜报错看错误报告是jni层报的错,于是又想办法调试进过一番研究,下载CLion之后设置环境为cygwin调试的问题解决了。
经过调试之后发现jni层在访问一个变量的时候程序就崩潰,可能是内存溢出了吧不管这个调用,直接注释掉然后又发现另外一个错误,错误是在调用icu库里面的函数我以为是有2个icu版本的原意导致的,改了之后还是不行
由于问题太多,没有办法只能放弃了后面肯定还会有各种莫名其妙的问题,编译就已经够麻烦太费时間。
本来打算是把依赖binder的系统服务都去掉只保留gui的部分,生成一个jar包(包含jni部分)通过引入这个jar,在windows上可以用电脑上安装安卓系统的布局方式来编写桌面应用
跟布局有关计算大小、摆放位置,是按钮、文本框样式这些都是在framework.jar中涉及到绘图部分就是jni的部分,可以用skia实现雖然电脑上安装安卓系统的绘图后来改为opengl,但是skia依然存在理论上可以通过修改继续使用skia绘图。
因此电脑上安装安卓系统的一套gui的框架是囿希望可以移植的可惜jni层的代码对linux的依赖太多,如果要在其他的平台上运行需要改动的地方太多。如果换成linux会容易很多由于用linux的人仳较少,本人并不想在linux下实验shashlik本身就是基于linux的,虽然使用了qemu我想去掉qemu也不会太难。
更多内容请关注我的公众号:nohave5