Programming AspectJ with Android
AspectJ is the defacto choice for AOP program. So far I did not see any one trying AOP concept in Android. However, I did read one blog mentioning, it should be possible, hence I tried it.
AspectJ puts in pointcut across code and can execute advices around those pointcuts. The beautify of this is once you compile your java source, you add these pointcuts and advices to your program by injecting them in the byte code (of already generated class files).
Knowing this I knew aspectJ can be used in Android, as dex relies on .class files.
Stage 1- Let Java compile java to .class files
Stage 2- Let AspectJ compiler inject point cuts and advices to the .class files
Stage 3- Let Dex take these new class files and create .dex file.
There you should have AspectJ working for Android applications.
Case Study: Inject Tracing code to existing Android source.
Given the case that we have an existing android project, we want to trace the call graph of each thread (showing depth) and we also want to show the cumulative time for each method.
Step 1: Create an HelloWorld Android Project
Step 2: Add some code, so we can show some call graph
Run the program and you will see this on your android emulator
Also on the DDMS Log you will see
What we want to achieve?
We want to show the call graph for this flow. We know that the flow is this way
At the same time we would like to print the commutative time each method took
We would like to print this call graph by using AOP concepts. We would like to define pointcuts around all methods of all classes in package "com.test" and print these statements there.
Step 3: Add aspectjrt.jar to classpath of android
Step 4: Add Aspect file - Trace.aj
Following is the cut down version of the same Trace.aj file. See the inline comments
Step 5 - Compile using AspectJ
As we mentioned above we want to
1. Compile java to .class files using javac
2. Inject pointcuts and advices in .class files using aspectj compile
3. Compile these injected .class files into .dex file
For this we will use ant.
Here is the ant build.xml which I used to put aspectj compilation step between compile->dex target
Here is a snippet of my build.xml around compile and dex targets
Here is the complete build.xml for your reference
Run on command prompt or through eclipse
$> ant install
You should see following output for ant
Step 6 - Run the APK which has aspectj integrated into it (after ant install)