Setting a MutableLiveData within coroutine Main dispatcher returns InvocationTargetException | SecurityException: Permission Denial

Viewed 83

I pursue this coroutine use cases. In usecase10; a factorial of a number is calculated in a coroutine background thread (Default dispatcher), and then converted to a String to be displayed on the UI via a MutableLiveData object.

Simplified ViewModel:

class CalculationInBackgroundViewModel(
    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
)() {

    fun uiState(): LiveData<T> = uiState
    val uiState: MutableLiveData<T> = MutableLiveData()


    fun performCalculation(factorialOf: Int) {
        uiState.value = UiState.Loading
        viewModelScope.launch {
            try {

                var result: BigInteger = BigInteger.ZERO
                val computationDuration = measureTimeMillis {
                    result = calculateFactorialOf(factorialOf)
                }

                var resultString = ""
                val stringConversionDuration = measureTimeMillis {
                    resultString = convertToString(result)
                }

                uiState.value = 
                    UiState.Success(
                        resultString,
                        computationDuration,
                        stringConversionDuration
                    ) // <<<<< The exception raised here


            } catch (exception: Exception) {
                UiState.Error("Error while calculating result")
            }
        }
    }

    // factorial of n (n!) = 1 * 2 * 3 * 4 * ... * n
    private suspend fun calculateFactorialOf(number: Int): BigInteger =
        withContext(defaultDispatcher) {
            var factorial = BigInteger.ONE
            for (i in 1..number) {
                factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))
            }
            factorial
        }

    private suspend fun convertToString(number: BigInteger): String =
        withContext(defaultDispatcher) {
            number.toString()
        }
}

The following exception occurs exactly on setValue() on the MutableLiveData:

2021-12-27 22:45:12.484 21582-21582/? E/A: Exception while registering uid importance
    java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9)
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1)
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.SecurityException: Permission Denial: registerUidObserver from pid=21582, uid=10032 requires android.permission.PACKAGE_USAGE_STATS
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.app.IActivityManager$Stub$Proxy.registerUidObserver(IActivityManager.java:9032)
        at android.app.ActivityManager.addOnUidImportanceListener(ActivityManager.java:3641)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9) 
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1) 
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
2021-12-27 22:52:39.450 22273-22273/? E/A: Exception while registering uid importance
    java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9)
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1)
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.SecurityException: Permission Denial: registerUidObserver from pid=22273, uid=10032 requires android.permission.PACKAGE_USAGE_STATS
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.app.IActivityManager$Stub$Proxy.registerUidObserver(IActivityManager.java:9032)
        at android.app.ActivityManager.addOnUidImportanceListener(ActivityManager.java:3641)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9) 
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1) 
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
2021-12-27 22:55:23.110 1641-1641/? E/BackupTransportManager: Couldn't get transport name.
    android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:764)
        at com.android.internal.backup.IBackupTransport$Stub$Proxy.name(IBackupTransport.java:369)
        at com.android.server.backup.TransportManager$TransportConnection.onServiceConnected(TransportManager.java:339)
        at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1652)
        at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1681)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at com.android.server.SystemServer.run(SystemServer.java:416)
        at com.android.server.SystemServer.main(SystemServer.java:267)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:787)
2021-12-27 22:55:23.147 1641-1641/? E/BackupTransportManager: Couldn't get transport name.
    android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:764)
        at com.android.internal.backup.IBackupTransport$Stub$Proxy.name(IBackupTransport.java:369)
        at com.android.server.backup.TransportManager$TransportConnection.onServiceConnected(TransportManager.java:339)
        at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1652)
        at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1681)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at com.android.server.SystemServer.run(SystemServer.java:416)
        at com.android.server.SystemServer.main(SystemServer.java:267)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:787)
2021-12-27 22:56:07.007 23444-23444/? E/A: Exception while registering uid importance
    java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9)
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1)
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.SecurityException: Permission Denial: registerUidObserver from pid=23444, uid=10032 requires android.permission.PACKAGE_USAGE_STATS
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.app.IActivityManager$Stub$Proxy.registerUidObserver(IActivityManager.java:9032)
        at android.app.ActivityManager.addOnUidImportanceListener(ActivityManager.java:3641)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9) 
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1) 
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
2021-12-27 22:57:21.695 24065-24065/? E/A: Exception while registering uid importance
    java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9)
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1)
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.SecurityException: Permission Denial: registerUidObserver from pid=24065, uid=10032 requires android.permission.PACKAGE_USAGE_STATS
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.app.IActivityManager$Stub$Proxy.registerUidObserver(IActivityManager.java:9032)
        at android.app.ActivityManager.addOnUidImportanceListener(ActivityManager.java:3641)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.google.android.apps.gsa.assistant.shared.e.a.a.run(PG:9) 
        at com.google.android.apps.gsa.shared.util.c.a.bw.b(PG:1) 
        at com.google.android.apps.gsa.shared.util.c.a.by.run(PG:1) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

The expcetion is resolved by using postValue() instead of setValue(); but why shouldn't setValue safe here? it's already running within the Main dispatcher that is inherited by viewModelScope?

1 Answers

No, this error is something else. It has to do with IActivityManager, it could be triggered when you execute setValue but the exception is happening in one of the observers.

You will have more info once you find who that observer is and what is it doing.

Related