cloudfox-coreshift-core 2.33.0

Low-level Linux and Android systems primitives for CoreShift (CloudFox)
Documentation
//! Verify every DEX resolver lookup lands on a real framework.jar.
//!
//! Run:  cargo run --example verify_dex -- /path/to/framework.jar
//!
//! Exercises the same `find_transaction_code` parser the resolvers use,
//! against a jar pulled from a live device (`adb pull /system/framework/framework.jar`).
//! Each line: resolver -> value | MISSING.

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
        }};
    }

    // IActivityManager
    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"
    );

    // Observers
    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"
    );

    // Display / Power
    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"
    );
    // Deep-sleep-on-inactivity screen-on gate (dilemma §2/F1/F5): a screen-on
    // "is anything actually active" probe — the app-stability mailbox signal is
    // blind to music/cast/VoIP. One-shot DEX-resolved transactions at the
    // decision point: `getRunningAppProcesses` (RunningAppProcessInfo.importance
    // == IMPORTANCE_FOREGROUND_SERVICE) covers FGS holders; the IAudioService
    // query covers active playback.
    check!(
        "IActivityManager getRunningAppProcesses",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_getRunningAppProcesses"
    );
    check!(
        "IAudioService getActivePlaybackConfigurations",
        "Landroid/media/IAudioService$Stub;",
        "TRANSACTION_getActivePlaybackConfigurations"
    );
    // Deep-sleep-on-inactivity (utensil), live audio event source: register a
    // `IPlaybackConfigDispatcher` on `IAudioService` so an audio start/stop
    // lands on an eventfd (mirrors the display-callback pattern). Non-privileged
    // callers receive ONLY active anonymized configs, so a non-empty config list
    // in the callback IS "audio is active". The dispatcher side's transaction is
    // `dispatchPlaybackConfigChange(configs, flush)`.
    check!(
        "IAudioService registerPlaybackCallback",
        "Landroid/media/IAudioService$Stub;",
        "TRANSACTION_registerPlaybackCallback"
    );
    check!(
        "IAudioService unregisterPlaybackCallback",
        "Landroid/media/IAudioService$Stub;",
        "TRANSACTION_unregisterPlaybackCallback"
    );
    check!(
        "IPlaybackConfigDispatcher dispatchPlaybackConfigChange",
        "Landroid/media/IPlaybackConfigDispatcher$Stub;",
        "TRANSACTION_dispatchPlaybackConfigChange"
    );
    // Deep-sleep-on-inactivity (dilemma §3): the legacy force path is
    // `service call batterystats <noteDeviceIdleMode> i32 <mode>` — the
    // `IBatteryStats.noteDeviceIdleMode` stats hook (IDLE_LIGHT=1 / IDLE_DEEP=2).
    // The batterystats history entries the hook writes (`device_idle=light/full`)
    // are the observable that confirms the call reached the live system.
    check!(
        "IBatteryStats noteDeviceIdleMode",
        "Lcom/android/internal/app/IBatteryStats$Stub;",
        "TRANSACTION_noteDeviceIdleMode"
    );
    // Deep-sleep-on-inactivity, network-only force path (dilemma §3, decision
    // 2026-08-19): `INetworkPolicyManager.setDeviceIdleMode(boolean)` on the
    // "netpolicy" service — the network-suspension half of DeviceIdleController's
    // enforcement (netd blocks non-whitelisted apps), binder-exposed and
    // event-driven-compatible, chosen over the shell-only `cmd deviceidle
    // force-idle` trampoline (process spawn per force) and over the recording
    // hook `IBatteryStats.noteDeviceIdleMode` (stats history only, no
    // enforcement).
    check!(
        "INetworkPolicyManager setDeviceIdleMode",
        "Landroid/net/INetworkPolicyManager$Stub;",
        "TRANSACTION_setDeviceIdleMode"
    );

    // FPS / TaskStack
    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
    }
}