Android runtime的verifier要求entermonitor - exitmonitor之间的代码全部放在catch-all region中。
因此,soot会产生如下形式的代码:
$r8 = $r0.<com.android.server.pm.PackageManagerService: android.util.ArrayMap mPackages>;
entermonitor $r8;
label05:
staticinvoke <android.os.Trace: void traceEnd(long)>(1L);
$r9 = $r0.<com.android.server.pm.PackageManagerService: com.android.server.pm.Settings mSettings>;
r15 = (org.xmlpull.v1.XmlSerializer) r14;
virtualinvoke $r9.<com.android.server.pm.Settings: void writePreferredActivitiesLPr(org.xmlpull.v1.XmlSerializer,int,boolean)>(r15, $i0, 1);
label06:
exitmonitor $r8;
...
label08:
$r11 := @caughtexception;
label09:
exitmonitor $r8;
throw $r11;
catch java.lang.Throwable from label05 to label06 with label08; // label08就是catch-all region的入口