Android版Chromium发行版构建启动后崩溃问题求助
问题描述
我按照Chromium官方文档步骤构建Android版Chromium,使用的构建命令如下:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH="$PATH:/path/to/depot_tools" mkdir ~/chromium && cd ~/chromium fetch --nohooks android cd src echo "target_os = [ 'android' ]" >> ../.gclient gclient sync -D --force gn args out/Default autoninja -C out/Default monochrome_public_bundle
当is_debug设为true时程序运行正常,但设为false时,生成的APK启动2秒后崩溃。使用的构建参数如下:
target_os = "android" target_cpu = "arm" is_debug = false symbol_level = 1
该参数配置在Chromium 107版本可用,但在109至115版本中均出现崩溃问题,且已在Android 10、11、12、13系统上测试,问题复现。
错误日志如下:
Failed to deliver inset state change to w=Window{e2e9dfb u0 org.chromium.chrome.stable/org.chromium.chrome.browser.firstrun.FirstRunActivity EXITING} android.os.DeadObjectException at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(BinderProxy.java:646) at android.view.IWindow$Stub$Proxy.insetsControlChanged(IWindow.java:551) at com.android.server.wm.WindowState.notifyInsetsControlChanged(WindowState.java:4374) at com.android.server.wm.InsetsStateController.lambda$notifyPendingInsetsControlChanged$5$com-android-server-wm-InsetsStateController(InsetsStateController.java:348) at com.android.server.wm.InsetsStateController$$ExternalSyntheticLambda4.run(Unknown Source:2) at com.android.server.wm.WindowAnimator.executeAfterPrepareSurfacesRunnables(WindowAnimator.java:357) at com.android.server.wm.WindowAnimator.animate(WindowAnimator.java:238) at com.android.server.wm.WindowAnimator.lambda$new$1$com-android-server-wm-WindowAnimator(WindowAnimator.java:109) at com.android.server.wm.WindowAnimator$$ExternalSyntheticLambda1.doFrame(Unknown Source:2) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1384) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1394) at android.view.Choreographer.doCallbacks(Choreographer.java:1013) at android.view.Choreographer.doFrame(Choreographer.java:904) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1366) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:211) at android.os.Looper.loop(Looper.java:300) at android.os.HandlerThread.run(HandlerThread.java:67) at com.android.server.ServiceThread.run(ServiceThread.java:46) shouldWaitAnimatingExit: isAnimating: Window{e2e9dfb u0 org.chromium.chrome.stable/org.chromium.chrome.browser.firstrun.FirstRunActivity EXITING} Exception thrown during dispatchAppVisibility Window{e2e9dfb u0 org.chromium.chrome.stable/org.chromium.chrome.browser.firstrun.FirstRunActivity EXITING} android.os.DeadObjectException at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(BinderProxy.java:646) at android.view.IWindow$Stub$Proxy.dispatchAppVisibility(IWindow.java:614) at com.android.server.wm.WindowState.sendAppVisibilityToClients(WindowState.java:3772) at com.android.server.wm.WindowContainer.sendAppVisibilityToClients(WindowContainer.java:1290) at com.android.server.wm.WindowToken.setClientVisible(WindowToken.java:419) at com.android.server.wm.ActivityRecord.setClientVisible(ActivityRecord.java:7277) at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8152) at com.android.server.wm.ActivityRecord.postApplyAnimation(ActivityRecord.java:5888) at com.android.server.wm.ActivityRecord.commitVisibility(ActivityRecord.java:5860) at com.android.server.wm.ActivityRecord.commitVisibility(ActivityRecord.java:5864) at com.android.server.wm.AppTransitionController.handleClosingApps(AppTransitionController.java:1196) at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:295) at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:1028) at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:895) at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:835) at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199) at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148) at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137) at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:211) at android.os.Looper.loop(Looper.java:300) at android.os.HandlerThread.run(HandlerThread.java:67) at com.android.server.ServiceThread.run(ServiceThread.java:46)
解决方法
1. 调整GN构建参数
尝试添加以下参数到你的GN配置中:
enable_android_InsetsController_support = true is_official_build = true
Chromium 109+版本对Android窗口Insets机制做了底层适配,显式开启enable_android_InsetsController_support可修复Release模式下的Binder通信异常;is_official_build=true会启用官方构建的兼容性配置,避免非官方Release模式下的潜在问题。
2. 升级NDK版本
确保使用Chromium对应版本要求的NDK(比如109+版本推荐r25b及以上),旧版NDK在Release编译时可能导致原生层Binder通信逻辑出错。
3. 优化FirstRunActivity生命周期处理
崩溃发生在FirstRunActivity退出阶段,可尝试:
- 同步Chromium主线的FirstRunActivity代码,官方在109+版本中可能修复了Insets相关的生命周期问题
- 临时修改启动逻辑,跳过FirstRun流程直接启动主Activity,验证是否为FirstRunActivity导致的崩溃
4. 调整符号级别与编译优化
如果以上方法无效,临时调整参数获取更详细的崩溃日志:
symbol_level = 2 enable_incremental_javac = false
更高的symbol_level能生成更完整的符号表,帮助定位具体崩溃点;禁用增量编译可避免Release模式下的代码混淆或编译产物异常。
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

