Whichever way HelloWorld gets launched there is a point at which the runtime will start to execute the code in the HelloWorld package HelloWorld.apk. Which is a problem. HelloWorld.apk is a standard Android package built using the Android development tools so what is in it, as you might expect, is a classes.dex file, which is nice if you are the Dalvik VM but not so great if you are another kind of JVM that does not talk Dalvik bytecode, and ours does not.
So why not put the class files in the package when its being built and use them ? Where’s the fun in that ? The contents of classes.dex started out as some class files, so lets turn it back into the class files on demand !
To do this we need a specialized ClassLoader which is pretty simple, in this case at least, a Dex loader, likewise, and a DVM to JVM bytecode compiler, which is a bit trickier. Fortunately the HelloWorld application is doing nothing much at all so there are not a large number or variety of instructions to compile.
Loading the Dex file and compiling the code back into JVM bytecode on-the-fly is not necessarily how you would solve this problem for real but it will work in this case.
Compiling is not the most visual of activities so instead here is the trace from the compiler which is invoked by the ClassLoader when the first class in the HelloWorld application is accessed by the runtime. To make life simpler at this point we load the entire Dex file and compile everything in sight, which is not a lot as you can see. The compiler is printing each DVM instruction as it compiles it.
Process[25001]: Process[25001]: Class standalone/helloworld/HelloWorldActivity Process[25001]: Process[25001]: compiling <init> Process[25001]: Process[25001]: invoke-direct Landroid/app/Activity; <init> ()V Process[25001]: return-void Process[25001]: Process[25001]: compiling onCreate Process[25001]: Process[25001]: invoke-super Landroid/app/Activity; onCreate (Landroid/os/Bundle;)V Process[25001]: const #+2130903040 Process[25001]: invoke-virtual Lstandalone/helloworld/HelloWorldActivity; setContentView (I)V Process[25001]: return-void Process[25001]: Process[25001]: Process[25001]: Process[25001]: Class standalone/helloworld/R$attr Process[25001]: Process[25001]: compiling <init> Process[25001]: Process[25001]: invoke-direct Ljava/lang/Object; <init> ()V Process[25001]: return-void Process[25001]: Process[25001]: Process[25001]: Process[25001]: Class standalone/helloworld/R$drawable Process[25001]: Process[25001]: compiling <init> Process[25001]: Process[25001]: invoke-direct Ljava/lang/Object; <init> ()V Process[25001]: return-void Process[25001]: Process[25001]: Process[25001]: Process[25001]: Class standalone/helloworld/R$layout Process[25001]: Process[25001]: compiling <init> Process[25001]: Process[25001]: invoke-direct Ljava/lang/Object; <init> ()V Process[25001]: return-void Process[25001]: Process[25001]: Process[25001]: Process[25001]: Class standalone/helloworld/R$string Process[25001]: Process[25001]: compiling <init> Process[25001]: Process[25001]: invoke-direct Ljava/lang/Object; <init> ()V Process[25001]: return-void Process[25001]: Process[25001]: Process[25001]: Process[25001]: Class standalone/helloworld/R Process[25001]: Process[25001]: compiling <init> Process[25001]: Process[25001]: invoke-direct Ljava/lang/Object; <init> ()V Process[25001]: return-void
Copyright (c) 2009 By Simon Lewis. All Rights Reserved.





