Actually, the fact that Android uses a virtual machine for it's code has pretty good security benefits over running native code as on iOS.
Howso? I'm trying to think of what a VM could guard against aside from illegal memory accesses, which of course iOS hardware (like any other modern hardware) guards against for native code.
As everything must eventually exit the VM to use hardware or certain features, you have more control over the boundary. On iOS, as you run native code, you could theoretically do direct device access in assembly and the OS has far less control over that. It is also possible to inspect the bytecode for a Java program and know with much more certainty what it's going to try and do, which instructions it will try and run, etc.
On iOS, as you run native code, you could theoretically do direct device access in assembly and the OS has far less control over that.
But the hardware access protection ensures user code doesn't access anything it's not supposed to. And its up to device drivers to manage devices and ensure that access to them by user code is done properly.
Static inspection of Java bytecode can allow you to verify the safety of some things and so do fewer checks at runtime; but to my understanding, native code has all the same protections in the end as code running in a VM.
Howso? I'm trying to think of what a VM could guard against aside from illegal memory accesses, which of course iOS hardware (like any other modern hardware) guards against for native code.