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)"),
}
}