У меня есть приложение для частной компании, и сегодня я получил необычный отчет о сбое. Я не видел ничего подобного раньше, не мог найти совпадений в поиске Google и до сих пор не смог воспроизвести. Данный код был введен в действие в октябре, и сотрудники проверяли его примерно 40 раз в день, когда набирали или меняли работу.
Приложение скомпилировано для SDK 28 (9.0), и сбой произошел на 8.1.0.
Я изменил приведенные ниже фрагменты исходного кода, чтобы сгенерировать / упростить имена и удалить неактуальный код.
StackTrace:
java.lang.IllegalArgumentException: setTaskFromSourceRecord:
task=TaskRecord{f142380 #13 A=com.example.app U=0 StackId=1 sz=2} is in a different stack (1) than the parent of
r=ActivityRecord{120fce5 u0 com.sec.android.app.launcher/.activities.LauncherActivity t14} (0) at
android.os.Parcel.readException(Parcel.java:2033) at
android.os.Parcel.readException(Parcel.java:1975) at
android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4822) at
android.app.Instrumentation.execStartActivity(Instrumentation.java:1619) at
android.app.Activity.startActivityForResult(Activity.java:4621) at
androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767) at
androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:234) at
androidx.fragment.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:881) at
androidx.fragment.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:995) at
androidx.fragment.app.Fragment.startActivity(Fragment.java:1084) at
androidx.fragment.app.Fragment.startActivity(Fragment.java:1073) at
com.example.app.PunchOutFragment.goHome(PunchOutFragment.java:234) at
com.example.app.PunchOutFragment.access$100(PunchOutFragment.java:50) at
com.example.app.PunchOutFragment$2.onReceive(PunchOutFragment.java:269) at
androidx.localbroadcastmanager.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:313) at
androidx.localbroadcastmanager.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:121) at
android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at
com.example.app.MyApplication.onCreate(MyApplication.java:48) at
android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1127) at
android.app.ActivityThread.handleBindApplication(ActivityThread.java:6097) at
android.app.ActivityThread.-wrap1(Unknown Source:0) at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1791) at
android.os.Handler.dispatchMessage(Handler.java:106) at
android.os.Looper.loop(Looper.java:164) at
android.app.ActivityThread.main(ActivityThread.java:7000) at
java.lang.reflect.Method.invoke(Native Method) at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441) at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
PunchOutFragment.goHome ():
private void goHome() {
Activity activity = requireActivity();
activity.setResult(Activity.RESULT_OK);
Intent intent = new Intent(getContext(), HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent); // PunchOutFragment.java:234
activity.finish();
}
MyApplication.onCreate ():
@Override
public void onCreate() {
super.onCreate();
mWeakAppContext = new WeakReference<>(getApplicationContext());
CrashHandler crashHandler = new CrashHandler();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
try {
Looper.loop(); // MyApplication.java:48
} catch (Exception e) {
crashHandler.uncaughtException(Thread.currentThread(), e);
}
}
Другой соответствующий код, вызываемый, если активный перфоратор получен с сервера после входа в систему; Журналы сервера показывают, что это было вызвано примерно за минуту до запуска и сбоя:
private void selectPunch(Punch punch) {
Context context = requireContext();
Intent intentHome = new Intent(context, HomeActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getContext());
stackBuilder.addParentStack(HomeActivity.class);
stackBuilder.addNextIntent(intentHome);
Intent intentPunchedIn = new Intent(context, PunchedInActivity.class);
intentPunchedIn.putExtra(PUNCH_ID, punch.id);
stackBuilder.addNextIntent(intentPunchedIn);
stackBuilder.startActivities();
requireActivity().finish();
}