Skip to content

[Bug] App crashes on Android 9 (API 28) when WiFi is enabled - NotImplementedError in NetworkConnectionManager #190

@MohamedV0

Description

@MohamedV0

AndroidFaker v2.0-Beta-8 crashes immediately on launch when running on Android 9 (API 28) with WiFi enabled. The application throws a NotImplementedError (mb2) with the message "An operation is not implemented: VERSION.SDK_INT < Q" because the code attempts to use NetworkCapabilities.getSignalStrength(), which is only available on API 29+.

This behavior contradicts the README documentation which states "Support Android 8.1+".


Environment

Component Details
App Version v2.0-Beta-8 (versionCode: 25110715)
Android Version 9 (Pie)
API Level 28
Device/Emulator LDPlayer 9 Emulator (Samsung SM-S9280 emulation)
Network State WiFi enabled and connected
Root/Xposed LSPosed v1.9.3 + Kitsune Magisk v27.2

Note: Testing was performed only on LDPlayer 9 emulator. Physical Android 9 device testing was not conducted. Developer verification on physical hardware is recommended.


Steps to Reproduce

  1. Install AndroidFaker v2.0-Beta-8 on an Android 9 (API 28) device or emulator
  2. Ensure WiFi is enabled and connected
  3. Launch AndroidFaker
  4. Observe: Application crashes immediately with VERSION.SDK_INT < Q error

Expected Behavior

The application should launch successfully on Android 9 with WiFi enabled, consistent with the documented "Android 8.1+" support claim in the README.


Actual Behavior

The application crashes immediately during AppListFragment.onViewCreated() initialization. The crash prevents any functionality from being accessed.


Stack Trace

FATAL EXCEPTION: main
Process: com.android1500.androidfaker, PID: 5786
mb2: An operation is not implemented: VERSION.SDK_INT < Q
    at p92.b(NetworkConnectionManager.kt:77)
    at p92.<init>(NetworkConnectionManager.kt:107)
    at nb.invoke(R8$$SyntheticClass:70)
    at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:57)
    at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:10)
    at org.koin.core.instance.SingleInstanceFactory.get$lambda$0(SingleInstanceFactory.kt:7)
    at org.koin.core.instance.SingleInstanceFactory.a(SingleInstanceFactory.kt:1)
    at o83.invoke(R8$$SyntheticClass:5)
    at org.koin.mp.KoinPlatformTools.synchronized(KoinPlatformTools.kt:12)
    at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:13)
    at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:23)
    at org.koin.core.resolution.CoreResolver.resolveFromRegistry(CoreResolver.kt:19)
    ...
    at com.android1500.androidfaker.ui.screens.applist.AppListFragment.getViewModel(AppListFragment.kt:3)
    at com.android1500.androidfaker.ui.screens.applist.AppListFragment.setupPremiumDialog(AppListFragment.kt:1)
    at com.android1500.androidfaker.ui.screens.applist.AppListFragment.onViewCreated(AppListFragment.kt:42)
    at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:15)
    ...
    at android.app.ActivityThread.main(ActivityThread.java:6831)

Root Cause Analysis

Location

File: NetworkConnectionManager.kt (obfuscated as p92.java)
Method: b() (line 77)

Technical Details

The crash occurs in the network status detection logic. Based on decompilation analysis:

// Pseudo-code reconstruction from p92.java
fun getNetworkStatus(): NetworkConnection {
    val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
    
    if (networkCapabilities != null) {
        if (!networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            // Cellular/Ethernet path - works on Android 9
            return if (networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) Cellular else Other
        } else {
            // WiFi path - crashes on Android 9
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {  // Q = API 29
                throw NotImplementedError("VERSION.SDK_INT < Q")  // <-- CRASH POINT
            }
            val signalStrength = networkCapabilities.getSignalStrength()  // API 29+ only
            return WiFi(signalStrength)
        }
    }
    return None
}

API Compatibility Issue

The method NetworkCapabilities.getSignalStrength() was introduced in Android 10 (API 29):

API Level Android Version getSignalStrength() Available
28 Android 9 (Pie) NO
29 Android 10 (Q) Yes
30+ Android 11+ Yes

The code explicitly throws an exception for API levels below 29 instead of implementing a graceful fallback.

Initialization Chain

App Launch
  → MainActivity.onCreate()
    → AppListFragment.onViewCreated()
      → setupPremiumDialog()
        → getViewModel()
          → Koin DI resolves NetworkConnectionManager
            → p92 constructor calls registerNetworkCallback()
              → Network callback invokes b() method
                → WiFi detected + SDK < 29
                  → throw NotImplementedError  // CRASH

Verification Tests

Testing conducted on Android emulators:

Test Case Network State Android Version Emulator Result
A WiFi ON 9 (API 28) LDPlayer 9 CRASH
B WiFi OFF (Cellular) 9 (API 28) LDPlayer 9 Works
C WiFi ON 12 (API 32) MuMu Player Works
D WiFi OFF 12 (API 32) MuMu Player Works

Key Finding: The crash occurs specifically when WiFi is enabled on Android 9. Disabling WiFi allows the application to launch successfully on Android 9.


Possible Solutions

Option 1: Add Fallback for API < 29 (Recommended)

// In NetworkConnectionManager.kt, method b()
} else {  // WiFi connected
    val signalStrength = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        networkCapabilities.getSignalStrength()
    } else {
        // Fallback for Android 9: use default signal strength
        SignalStrength.UNKNOWN.value
    }
    return WiFi(signalStrength)
}

Option 2: Use Alternative API for Android 9

// Use WifiManager for signal strength on older APIs
private fun getWifiSignalStrength(): Int {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        networkCapabilities.getSignalStrength()
    } else {
        val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val rssi = wifiManager.connectionInfo.rssi
        WifiManager.calculateSignalLevel(rssi, 5)  // Returns 0-4
    }
}

Option 3: Conditional Initialization

// In Koin module - conditionally create implementation based on SDK version
single<NetworkConnection> { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        NetworkConnectionManagerImpl(get())
    } else {
        NetworkConnectionFallbackImpl(get())  // Simplified version for API < 29
    }
}

Temporary Workarounds

Until this issue is resolved, Android 9 users can:

  1. Disable WiFi before launching the application (use cellular data instead)
  2. Upgrade to Android 10+ emulator or device
  3. Use emulators with Android 12+ (e.g., MuMu Player Android 12)

Additional Context

  • The APK's minSdk is set to 28 (Android 9), indicating intended Android 9 support
  • The README documentation states "Support Android 8.1+"
  • This appears to be a regression introduced in the v2.0 beta series (Kotlin rewrite)
  • Similar crash reports exist in XDA Forums from other Android 9 users

Related Documentation

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions