scottyab / rootbeer

Simple to use root checking Android library and sample app
Apache License 2.0
2.42k stars 432 forks source link

ANR in Android App triggered by Java_com_scottyab_rootbeer_RootBeerNative_checkForRoot #224

Closed vayush750 closed 4 weeks ago

vayush750 commented 4 months ago

ANR (Application Not Responding) has been caught up in our Android App, where the main thread waited for too long causing the ANR. This has occurred multiple time.

Attaching the stack trace for reference -: `main (native):tid=1 systid=12526

00 pc 0x9c3d6 libc.so (syscall + 22)

01 pc 0x20bcae libart.so (art::ConditionVariable::WaitHoldingLocks(art::Thread*) + 110)

02 pc 0x46fae7 libart.so (art::JNI::GetObjectArrayElement(_JNIEnv, _jobjectArray, int) + 519)

03 pc 0xa87 libtoolChecker.so (Java_com_scottyab_rootbeer_RootBeerNative_checkForRoot + 151)

   at com.scottyab.rootbeer.RootBeerNative.checkForRoot(RootBeerNative.java)
   at com.scottyab.rootbeer.RootBeer.checkForRootNative(RootBeer.java:459)
   at com.scottyab.rootbeer.RootBeer.isRooted(RootBeer.java:46)
   at com.zscaler.retrievers.DeviceInfoRetriever.isRooted(DeviceInfoRetriever.java:94)
   at com.zscaler.retrievers.DeviceInfoRetriever.<init>(DeviceInfoRetriever.java:70)
   at com.zscaler.retrievers.DeviceInfoRetriever.getInstance(DeviceInfoRetriever.java:83)
   at com.zscaler.fragments.WebSecurityFragment.populateValues(WebSecurityFragment.java:139)
   at com.zscaler.fragments.WebSecurityFragment.updateUI(WebSecurityFragment.java:239)
   at com.zscaler.fragments.WebSecurityFragment.onCreateView(WebSecurityFragment.java:91)
   at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3104)
   at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:524)
   at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
   at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
   at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1808)
   at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751)
   at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2976)
   at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2886)
   at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java)
   at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:351)
   at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
   at com.zscaler.activities.MainActivity.onStart(MainActivity.java:675)
   at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1453)
   at android.app.Activity.performStart(Activity.java:8034)
   at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3486)
   at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
   at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
   at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2077)
   at android.os.Handler.dispatchMessage(Handler.java:106)
   at android.os.Looper.loop(Looper.java:223)
   at android.app.ActivityThread.main(ActivityThread.java:7741)
   at java.lang.reflect.Method.invoke(Native method)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:966)`

   The device on which it has occurred is a Android 11 Intel Gemini Lake Chromebook
daniel-nzuma commented 1 month ago

From the docs

You can also call each of the checks individually as the sample app does. It is advisable to call isRooted() from a background thread as it involves disk I/O.