use std::process::ExitCode;
fn main() -> ExitCode {
let jar = std::env::args().nth(1).unwrap_or_else(|| {
eprintln!("usage: verify_dex <framework.jar>");
std::process::exit(2);
});
let mut missing = 0usize;
macro_rules! check {
($name:expr, $class:expr, $field:expr) => {{
let v = coreshift_core::android::dex::find_transaction_code(&jar, $class, $field);
match v {
Some(code) => println!("{:<28} = {code}", $name),
None => {
println!("{:<28} = MISSING", $name);
missing += 1;
}
}
v
}};
}
check!(
"AM registerProcessObserver",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_registerProcessObserver"
);
check!(
"AM getFocusedRootTaskInfo",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_getFocusedRootTaskInfo"
);
check!(
"AM getFocusedStackInfo",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_getFocusedStackInfo"
);
check!(
"AM registerForegroundProcessObserver",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_registerForegroundProcessObserver"
);
check!(
"AM getContentProviderExternal",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_getContentProviderExternal"
);
check!(
"AM removeContentProviderExternalAsUser",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_removeContentProviderExternalAsUser"
);
check!(
"AM registerUidObserver",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_registerUidObserver"
);
check!(
"AM unregisterUidObserver",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_unregisterUidObserver"
);
check!(
"AM registerUidObserverForUids",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_registerUidObserverForUids"
);
check!(
"IProcessObserver onForegroundActivitiesChanged",
"Landroid/app/IProcessObserver$Stub;",
"TRANSACTION_onForegroundActivitiesChanged"
);
check!(
"IForegroundProcessObserver onForegroundProcessChanged",
"Landroid/app/IForegroundProcessObserver$Stub;",
"TRANSACTION_onForegroundProcessChanged"
);
check!(
"IUidObserver onUidGone",
"Landroid/app/IUidObserver$Stub;",
"TRANSACTION_onUidGone"
);
check!(
"IUidObserver onUidActive",
"Landroid/app/IUidObserver$Stub;",
"TRANSACTION_onUidActive"
);
check!(
"IUidObserver onUidIdle",
"Landroid/app/IUidObserver$Stub;",
"TRANSACTION_onUidIdle"
);
check!(
"IUidObserver onUidCachedChanged",
"Landroid/app/IUidObserver$Stub;",
"TRANSACTION_onUidCachedChanged"
);
check!(
"IUidObserver onUidStateChanged",
"Landroid/app/IUidObserver$Stub;",
"TRANSACTION_onUidStateChanged"
);
check!(
"IUidObserver onUidProcAdjChanged",
"Landroid/app/IUidObserver$Stub;",
"TRANSACTION_onUidProcAdjChanged"
);
check!(
"IDisplayManager registerCallback",
"Landroid/hardware/display/IDisplayManager$Stub;",
"TRANSACTION_registerCallback"
);
check!(
"IDisplayManager registerCallbackWithEventMask",
"Landroid/hardware/display/IDisplayManager$Stub;",
"TRANSACTION_registerCallbackWithEventMask"
);
check!(
"IDisplayManager getDisplayInfo",
"Landroid/hardware/display/IDisplayManager$Stub;",
"TRANSACTION_getDisplayInfo"
);
check!(
"IPowerManager isInteractive",
"Landroid/os/IPowerManager$Stub;",
"TRANSACTION_isInteractive"
);
check!(
"IActivityManager getRunningAppProcesses",
"Landroid/app/IActivityManager$Stub;",
"TRANSACTION_getRunningAppProcesses"
);
check!(
"IAudioService getActivePlaybackConfigurations",
"Landroid/media/IAudioService$Stub;",
"TRANSACTION_getActivePlaybackConfigurations"
);
check!(
"IBatteryStats noteDeviceIdleMode",
"Lcom/android/internal/app/IBatteryStats$Stub;",
"TRANSACTION_noteDeviceIdleMode"
);
check!(
"INetworkPolicyManager setDeviceIdleMode",
"Landroid/net/INetworkPolicyManager$Stub;",
"TRANSACTION_setDeviceIdleMode"
);
check!(
"IWindowManager registerTaskFpsCallback",
"Landroid/view/IWindowManager$Stub;",
"TRANSACTION_registerTaskFpsCallback"
);
check!(
"IWindowManager unregisterTaskFpsCallback",
"Landroid/view/IWindowManager$Stub;",
"TRANSACTION_unregisterTaskFpsCallback"
);
check!(
"ITaskFpsCallback onFpsReported",
"Landroid/window/ITaskFpsCallback$Stub;",
"TRANSACTION_onFpsReported"
);
check!(
"IActivityTaskManager registerTaskStackListener",
"Landroid/app/IActivityTaskManager$Stub;",
"TRANSACTION_registerTaskStackListener"
);
check!(
"IActivityTaskManager unregisterTaskStackListener",
"Landroid/app/IActivityTaskManager$Stub;",
"TRANSACTION_unregisterTaskStackListener"
);
println!("\nmissing: {missing}");
if missing == 0 {
ExitCode::SUCCESS
} else {
ExitCode::FAILURE
}
}