Severe Battery Drain & Overheating on HyperOS (Redmi Note 13 Pro 4G / MediaTek). Root Cause Found: Infinite Loop in SatelliteController
PSA: I am posting this root cause analysis to document a severe flaw in the Android 14 / AOSP telephony framework implementation on MediaTek devices. I am not asking for tech support, but sharing the ADB logs and AOSP source code flaw for community awareness and developer visibility.
Device: Redmi Note 13 Pro 4G (MediaTek)
OS: HyperOS (Android 14) - Build 3.0.301.0.WNFEUXM
There is a severe logic bug in the telephony framework of the current HyperOS build. Using Mobile Data triggers an infinite event loop inside com.android.phone, locking the CPU at 140%+ usage and causing massive battery drain and thermal throttling. The device overheats, and the only temporary workaround is to toggle Airplane Mode (just turning off mobile data does nothing).
Using top -m 15, com.android.phone (PID 3173) consistently shows >140% CPU usage. The MediaTek RIL daemon (mtkfusionrild) is also constantly stressed.
By analyzing the radio buffer via logcat, I was able to pinpoint the exact root cause: the system is trying to register satellite modem listeners on a device that does not have satellite hardware.
The following block of code repeats in an infinite loop (around 30 times per second) as soon as mobile data connects:
07-24 00:15:24.708 3173 3173 D SatelliteController: Satellite for carrier is not supported.
07-24 00:15:24.709 3173 3173 D SatelliteController: registerForSatelliteModemStateChanged: add Listeners for ModemState
07-24 00:15:24.709 3173 3173 E SatelliteController: registerForSatelliteModemStateChanged: mSatelliteSessionController is not initialized yet
07-24 00:15:24.709 3173 3173 E SatelliteController: unregisterForModemStateChanged: mSatelliteSessionController is not initialized yet
07-24 00:15:24.709 3173 3173 D SatelliteController: unregisterForModemStateChanged: remove Listeners for ModemState
After digging deeper and cross-referencing with the AOSP source code and MediaTek vendor trees, it is clear this is an issue rooted in the telephony framework handling for Android 14 on MediaTek devices (this exact same INVALID_ARGUMENTS and mSatelliteSessionController loop has also been reproduced on Custom ROMs like crDroid for the Redmi Note 13 5G 'stone').
Looking at the AOSP source code (frameworks/opt/telephony/.../SatelliteController.java), the exception is correctly generated here:
.SatelliteError public int registerForSatelliteModemStateChanged(int subId,
@NonNull ISatelliteStateCallback callback) {
if (mSatelliteSessionController != null) {
mSatelliteSessionController.registerForSatelliteModemStateChanged(callback);
} else {
loge("registerForSatelliteModemStateChanged: mSatelliteSessionController is not initialized yet");
return SatelliteManager.SATELLITEINVALIDTELEPHONYSTATE;
}
return SatelliteManager.SATELLITEERRORNONE;
}
The SatelliteController correctly handles the lack of satellite hardware by returning SATELLITE\INVALID_TELEPHONY_STATE. The fatal flaw is in the higher-level network manager (likely the MediaTek RIL or the telephony framework's state machine). When it receives this error during a network transition (Wi-Fi to Mobile Data), it fails to handle the exception properly. Instead of aborting the satellite registration, it immediately retries the call in an unconditional infinite loop.
A simple conditional check (if (hasSatelliteHardware)) before attempting to register the listener in the network state change event within the calling process will completely resolve this battery drain issue for all MediaTek devices without satellite capabilities.
https://redd.it/1v4x3rd
@reddit_android
Post #34455
173