错误日志:
2021-05-14 16:39:35.643 2730-8048/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
Process: com.android.systemui, PID: 2730
java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #3,5,main] that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:227)
at android.os.Handler.<init>(Handler.java:129)
at com.android.systemui.assist.AssistManager.<init>(AssistManager.java:215)
at com.android.systemui.assist.AssistManager_Factory.provideInstance(AssistManager_Factory.java:107)
at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:70)
at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:17)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16(StatusBar.java:2703)
at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16$StatusBar(Unknown Source:0)
at com.android.systemui.statusbar.phone.-$$Lambda$StatusBar$fPMIOsYMhFXVKHESAjUObpcgeJM.run(Unknown Source:10)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
根据log得出问题出现在:
com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard
查看该文件方法内的逻辑问题:
public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
final Callback callback, int flags) {
if (onlyProvisioned && !mDeviceProvisionedController.isDeviceProvisioned()) return;
final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
intent, mLockscreenUserManager.getCurrentUserId());
Runnable runnable = () -> {
mAssistManagerLazy.get().hideAssist();
intent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(flags);
int result = ActivityManager.START_CANCELED;
ActivityOptions options = new ActivityOptions(getActivityOptions(
null /* remoteAnimation */));
options.setDisallowEnterPictureInPictureWhileLaunching(
disallowEnterPictureInPictureWhileLaunching);
if (intent == KeyguardBottomAreaView.INSECURE_CAMERA_INTENT) {
// Normally an activity will set it's requested rotation
// animation on its window. However when launching an activity
// causes the orientation to change this is too late. In these cases
// the default animation is used. This doesn't look good for
// the camera (as it rotates the camera contents out of sync
// with physical reality). So, we ask the WindowManager to
// force the crossfade animation if an orientation change
// happens to occur during the launch.
options.setRotationAnimationHint(
WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS);
}
发现问题是mAssistManagerLazy.get().hideAssist();导致,在AsyncTask 中new Handler 失败。
解决方案:
--- a/alps/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/alps/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -2691,7 +2691,14 @@ public class StatusBar extends SystemUI implements DemoMode,
boolean dismissShade) {
startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, 0);
}
-
+ // Monkey SystemUI AsyncTask RuntimeException
+ private Runnable mRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mAssistManagerLazy.get().hideAssist();
+ }
+ };
+ // End
public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
final Callback callback, int flags) {
@@ -2700,8 +2707,11 @@ public class StatusBar extends SystemUI implements DemoMode,
final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
intent, mLockscreenUserManager.getCurrentUserId());
Runnable runnable = () -> {
- mAssistManagerLazy.get().hideAssist();
+ // Monkey SystemUI AsyncTask RuntimeException
+ //mAssistManagerLazy.get().hideAssist();
+ mHandler.post(mRunnable);
+ // End
intent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(flags);
int result = ActivityManager.START_CANCELED;