[Milestone XT720 General] Mioze7Ae:
I've figured out how to decompile the framework into java using dex2jar and jd-gui. This makes it much easier read and understand what the smali is doing without tracing variables. For example, this is what's going on inside PhoneWindowManager$7 on Motoroi in smali:

.class Lcom/android/internal/policy/impl/PhoneWindowManager$7;
.super Landroid/content/BroadcastReceiver;
.source "PhoneWindowManager.java"

# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/android/internal/policy/impl/PhoneWindowManager;
.end annotation

.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation

# instance fields
.field final synthetic this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;

# direct methods
.method constructor <init>(Lcom/android/internal/policy/impl/PhoneWindowManager;)V
.registers 2
.parameter

.prologue
.line 2189
iput-object p1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$7;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;

invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V

return-void
.end method

# virtual methods
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.registers 5
.parameter "context"
.parameter "intent"

.prologue
.line 2190
invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;

move-result-object v0

const-string v1, "com.motorola.fmradio.start.running"

invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

move-result v0

if-eqz v0, :cond_13

.line 2191
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$7;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;

const/4 v1, 0x1

invoke-static {v0, v1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->access$102(Lcom/android/internal/policy/impl/PhoneWindowManager;Z)Z

.line 2195
:cond_12
:goto_12
return-void

.line 2192
:cond_13
invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;

move-result-object v0

const-string v1, "com.motorola.fmradio.end.running"

invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

move-result v0

if-eqz v0, :cond_12

.line 2193
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$7;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;

const/4 v1, 0x0

invoke-static {v0, v1}, Lcom/android/internal/policy/impl/PhoneWindowManager;->access$102(Lcom/android/internal/policy/impl/PhoneWindowManager;Z)Z

goto :goto_12
.end method

and decompiled:

package com.android.internal.policy.impl;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

class PhoneWindowManager$7 extends BroadcastReceiver
{
public void onReceive(Context paramContext, Intent paramIntent)
{
if (paramIntent.getAction().equals("com.motorola.fmradio.start.running"))
boolean bool1 = PhoneWindowManager.access$102(this.this$0, 1);
while (true)
{
return;
if (paramIntent.getAction().equals("com.motorola.fmradio.end.running"))
{
boolean bool2 = PhoneWindowManager.access$102(this.this$0, 0);
continue;
}
}
}
}

It's a matter of a few seconds to grok what's going on in the decompiled version compared to a few minutes in the smali. Diffing sources should also be much easier with the decompiled forms. I'll get Dexter's and Motoroi's frameworks decompiled and upload them somewhere.

I don't know enough about java/android to know whether recompiling the decompiled sources is possible/easy. But as a tool for improving code comprehension it will be well worth it I think.