IOS 也能使用 Android 程序

Good News ! 以后各种 IOS 设备将可以安装和运行 Android 的 apk 程序。

最近偶然间看到这么一家叫myriad公司,他们将运行android的虚拟机移植到了IOS 上,因此IOS的用户也可以在上面使用Android的程序了。

Q1:为什么之前不能运行?

IOS系统本身就不支持java,因为他们的程序是用Objective-C 开发的,据说因此Sun的高层还专门对其口诛笔阀过。

Q2:为什么Android上面的程序需要java支持?

确切地说,Android 上面的程序是在用java语言进行编写,但是并不是sun或者是oracle的java虚拟机在起作用。

Google专门针对自家的Android系统开发了Dalvik 虚拟机。

Q3:什么是Java 虚拟机?

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行, 至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。

Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

Q4:Dalvik 虚拟机是什么样子的?

一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息;而DEX文件格式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。 原来每个类文件中的常量池,在DEX文件中由一个常量池来管理。

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。

不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。

Zygote 是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

相对于基于堆栈的虚拟机实现,基于寄存器的虚拟机实现虽然在硬件通用性上要差一些,但是它在代码的执行效率上却更胜一筹。在基于寄存器的虚拟机里,可以更为有效的减少冗余指令的分发和减少内存的读写访问。

Q5:什么是DEX?有什么优化?

Java文件—–应用程序源文件 
android 本身相当一部分都是用java 编写而成(基本上架构图里头蓝色的部份都是用Java 开发的),android 的应用必须使用java 来开发。 
Class文件——Java编译后的目标文件 
不像J2se,java 编译成class 就可以直接运行,android 平台上class 文件不能直接在android 上运行。由于Google 使用了自己的Dalvik 来运行应用,所以这里的class 也肯定不能在AndroidDalvik 的java 环境中运行,android 的class 文件实际上只是编译过程中的中间目标文件,需要链接成dex 文件后才能在dalvik 上运行。 
Dex文件—–Android平台上的可执行文件 
Android 虚拟机Dalvik 支持的字节码文件格式Google 在新发布的Android 平台上使用了自己的Dalvik 
DEX文件的结构是紧凑的,但是如果我们还想要求运行时的性能有进一步提高,我们就仍然需要对DEX文件进行进一步优化。优化主要是针对以下几个方面:

  -调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域
  -验证DEX文件中的所有类
  -对一些特定的类进行优化,对方法里的操作码进行优化

优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。

优化发生的时机有两个:

  -对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的ODEX文件;
  -对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。

Myriad 上的介绍页面

4 Comments

iHenry says:

也就是说有人把android上的运行环境移植到iOS上去了?我估计大多数人关心的是怎么把iOS移植到WebOS上去。。
话说如果这样的话岂不是什么WP、WebOS甚至Symbian都可以用Android上的应用程序了?

* 笑得海潮 says:

不是所有的架构都适合ios的,也不是所有架构都能跑Dalvik 虚拟机。不过能够移植过去尝试下还是很值得赞扬的。

iHenry says:

好吧好吧我第一句话想说的是把iOS移植到Android上去,脑袋抽掉了才写成WebOS的==

* 笑得海潮 says:

😛

Leave a Reply to iHenry Cancel Reply

Your email address will not be published.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax