use coreshift_core::android::dex::{find_transaction_code, resolve_uid_observer_codes};
fn main() {
let jar = std::env::args().nth(1).unwrap_or_else(|| "/system/framework/framework.jar".to_string());
let am = "Landroid/app/IActivityManager$Stub;";
let uid_obs = "Landroid/app/IUidObserver$Stub;";
println!("jar = {jar}");
for (name, desc, field) in [
("registerUidObserver", am, "TRANSACTION_registerUidObserver"),
("registerUidObserverForUids", am, "TRANSACTION_registerUidObserverForUids"),
("unregisterUidObserver", am, "TRANSACTION_unregisterUidObserver"),
("onUidGone", uid_obs, "TRANSACTION_onUidGone"),
("onUidActive", uid_obs, "TRANSACTION_onUidActive"),
("onUidIdle", uid_obs, "TRANSACTION_onUidIdle"),
("onUidStateChanged", uid_obs, "TRANSACTION_onUidStateChanged"),
("onUidProcAdjChanged", uid_obs, "TRANSACTION_onUidProcAdjChanged"),
("onUidCachedChanged", uid_obs, "TRANSACTION_onUidCachedChanged"),
] {
match find_transaction_code(&jar, desc, field) {
Some(c) => println!("OK {name:32} {c}"),
None => println!("MISS {name:32}"),
}
}
match resolve_uid_observer_codes() {
Some(codes) => println!(
"resolver: reg={} unreg={} for_uids={:?} gone={} active={} idle={} cached={} state={} adj={}",
codes.register_code,
codes.unregister_code,
codes.register_for_uids_code,
codes.on_gone_code,
codes.on_active_code,
codes.on_idle_code,
codes.on_cached_code,
codes.on_state_code,
codes.on_adj_code,
),
None => println!("resolver: FAILED (hardcoded /system path — needs device run)"),
}
}