RKAndroid11集成Chrome崩溃问题-经验分享

提示:RKAndroid11 内置Chrome 浏览器

文章目录


前言-需求

在RKAndroid11 RK3566平台项目上,集成Chrome apk,这里说的是调用webView,跟webView 内核不相关的,其实就是打开网页默认用这个浏览器:内置Chrome浏览器,并默认apk调用时webview调用此浏览器


一、参考资料

这里首先要搞清楚,如何内置 APK 的问题,拿到apk 直接内置不就行了嘛,我们看看之前相关笔记可以参考的。

Rk-内置应用作为系统Launcher-内置APK-拷贝文件-替换开机动画

RK3576-Android15-内置32位应用-此应用与最新版 Android 不兼容。请检查是否有更新,或与应用开发者联系 弹框问题解决

MTK-Android13-包安装器PackageInstaller 静默安装实现

RK3576-Android15-整合PackageInstaller实现静默安装功能

首先要搞清楚,RK 平台上面如何内置apk,内置应用时候有哪些基本注意点,不管 RK 哪个版本源码,思想一样的,基本技能必须掌握。

二、内置的资源-Chrome-apk

通过网盘分享的文件:Android11_com.android.chrome.apk

链接: https://pan.baidu.com/s/1G6S8sNSmRz-bQ4dsHy4RlQ?pwd=sm1v 提取码: sm1v --来自百度网盘超级会员v5的分享

三、实践方案

1、实现方案

修改文件

\device\rockchip\rk356x\rk3566_r\preinstall\comandroidchrome.apk 新增一个apk

build\make\target\product\handheld_product.mk 删除一个apk

修改方案

新增浏览器文件

删除之前内置默认的浏览器文件

2、实际遇到问题-困难

错误现象-日志说明

集成方案很简单,也是中规中矩,但是实际远远没有这么顺利,这里我把日志记录一下。

现象就是打开Chrome 就闪退,正常 adb install 安装没问题。

java 复制代码
 E  library "/odm/bundled_persist-app/com.android.chrome_138.0.7204.45/oat/arm64/com.android.chrome_138.0.7204.45.odex" ("/odm/bundled_persist-app/com.android.chrome_138.0.7204.45/oat/arm64/com.android.chrome_138.0.7204.45.odex") needed or dlopened by "/apex/com.android.art/lib64/libart.so" is not accessible for the namespace: [name="(default)", ld_library_paths="", default_library_paths="/system/lib64:/system_ext/lib64", permitted_paths="/system/lib64/drm:/system/lib64/extractors:/system/lib64/hw:/system_ext/lib64:/system/framework:/system/app:/system/priv-app:/system_ext/framework:/system_ext/app:/system_ext/priv-app:/vendor/framework:/vendor/app:/vendor/priv-app:/system/vendor/framework:/system/vendor/app:/system/vendor/priv-app:/odm/framework:/odm/app:/odm/priv-app:/oem/app:/product/framework:/product/app:/product/priv-app:/data:/mnt/expand:/apex/com.android.runtime/lib64/bionic:/system/lib64/bootstrap"]
 I  The ClassLoaderContext is a special shared library.
 D  Using Network Security Config from resource 0_resource_name_obfuscated debugBuild: false
 D  Using Network Security Config from resource 0_resource_name_obfuscated debugBuild: false
 I  version=138.0.7204.45 (720404521) minSdkVersion=26 isBundle=false processName=com.android.chrome isIsolatedProcess=false
 I  Intent routed via ChromeLauncherActivity: false
    Activity referrer: android-app://com.fise.dmseries
    Intent referrer extra: null
    Intent contains LAUNCHER category: false
    Intent contains FLAG_ACTIVITY_MULTIPLE_TASK: false
    Intent contains FLAG_ACTIVITY_NEW_TASK: true
    Intent component: com.google.android.apps.chrome.Main
    Intent hash: 196045785
 I  Window ID allocated: 0, instance-task map: {}
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  CustomTabsIntent#shouldAlwaysUseBrowserUI() = false
 I  #getApplicationRestrictionsFromUserManager() Bundle[EMPTY_PARCEL]
 W  CustomTabsIntent#shouldAlwaysUseBrowserUI() = false
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  The service for rv4 is not available: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  The service for rv4 is not available: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
 I  sIsTargetSdkEnforceEdgeToEdge false
 E  Retrieving snapshot for com.google.android.partnersetup failed
    java.util.concurrent.ExecutionException: com.google.android.gms.common.api.ApiException: 17: API: Phenotype.API is not available on this device. Connection failed with: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
    	at Kr6.e(chromium-Monochrome.aab-stable-720404521:33)
    	at Kr6.b(chromium-Monochrome.aab-stable-720404521:49)
    	at Qv4.a(chromium-Monochrome.aab-stable-720404521:65)
    	at Fv4.a(chromium-Monochrome.aab-stable-720404521:45)
    	at d31.<init>(chromium-Monochrome.aab-stable-720404521:22)
    	at Id4.b(chromium-Monochrome.aab-stable-720404521:41)
    	at ey.call(chromium-Monochrome.aab-stable-720404521:9)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    	at iy.run(chromium-Monochrome.aab-stable-720404521:26)
    	at org.chromium.base.task.TaskRunnerImpl.f(chromium-Monochrome.aab-stable-720404521:31)
    	at Dr6.run(chromium-Monochrome.aab-stable-720404521:3)
    	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)
    Caused by: com.google.android.gms.common.api.ApiException: 17: API: Phenotype.API is not available on this device. Connection failed with: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
    	at jo.a(chromium-Monochrome.aab-stable-720404521:13)
    	at bo.b(chromium-Monochrome.aab-stable-720404521:6)
    	at De2.f(chromium-Monochrome.aab-stable-720404521:41)
    	at De2.e(chromium-Monochrome.aab-stable-720404521:3)
    	at De2.k(chromium-Monochrome.aab-stable-720404521:194)
    	at De2.c(chromium-Monochrome.aab-stable-720404521:79)
    	at De2.d(chromium-Monochrome.aab-stable-720404521:47)
    	at He2.handleMessage(chromium-Monochrome.aab-stable-720404521:1019)
    	at android.os.Handler.dispatchMessage(Handler.java:102)
    	at android.os.Looper.loop(Looper.java:223)
    	at android.os.HandlerThread.run(HandlerThread.java:67)
 I  Received no configuration for com.google.android.partnersetup
 W  Couldn't get timestamp in chrome_last_modified.
    java.lang.SecurityException: Failed to find provider com.google.android.gsf.gservices for user 0; expected to find a valid ContentProvider for this authority
    	at android.os.Parcel.createExceptionOrNull(Parcel.java:2373)
    	at android.os.Parcel.createException(Parcel.java:2357)
    	at android.os.Parcel.readException(Parcel.java:2340)
    	at android.os.Parcel.readException(Parcel.java:2282)
    	at android.content.IContentService$Stub$Proxy.registerContentObserver(IContentService.java:1229)
    	at android.content.ContentResolver.registerContentObserver(ContentResolver.java:2627)
    	at android.content.ContentResolver.registerContentObserver(ContentResolver.java:2615)
    	at Mj2.c(chromium-Monochrome.aab-stable-720404521:37)
    	at Ej2.b(chromium-Monochrome.aab-stable-720404521:9)
    	at d31.<init>(chromium-Monochrome.aab-stable-720404521:69)
    	at Id4.b(chromium-Monochrome.aab-stable-720404521:41)
    	at ey.call(chromium-Monochrome.aab-stable-720404521:9)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    	at iy.run(chromium-Monochrome.aab-stable-720404521:26)
    	at org.chromium.base.task.TaskRunnerImpl.f(chromium-Monochrome.aab-stable-720404521:31)
    	at Dr6.run(chromium-Monochrome.aab-stable-720404521:3)
    	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)
    Caused by: android.os.RemoteException: Remote stack trace:
    	at com.android.server.content.ContentService.registerContentObserver(ContentService.java:355)
    	at android.content.IContentService$Stub.onTransact(IContentService.java:482)
    	at android.os.Binder.execTransactInternal(Binder.java:1154)
    	at android.os.Binder.execTransact(Binder.java:1123)
 I  Partner Customization delegate: 0.
 W  Partner homepage must be HTTP(S) or NewTabPage. Got invalid URL ""
 I  Splits: null
 I  Policy received. Runtime: [121], result: [false]
 I  onUserLeaveHint: skipping PiP during shutdown
 I  #setSupplierIfDecidable() confirmedNoAppRestriction:true policyServiceInitialized:false
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  First party Google Play services not available, Safe Browsing disabled.
 W  CustomTabsIntent#shouldAlwaysUseBrowserUI() = false
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  The service for Db5 is not available: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  Warning: "/odm/bundled_persist-app/com.android.chrome_138.0.7204.45/lib/arm64/libmonochrome.so" unused DT entry: unknown processor-specific (type 0x70000001 arg 0x0) (ignoring)
 E  GooglePlayServices not available due to error 9
 W  com.android.chrome requires the Google Play Store, but it is missing.
 W  The service for Db5 is not available: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
 E  Error fetching accounts from the delegate.
    org.chromium.components.signin.AccountManagerDelegateException: Unable to retrieve accounts using GoogleAuthUtil.
    	at H4.b(chromium-Monochrome.aab-stable-720404521:43)
    	at ey.call(chromium-Monochrome.aab-stable-720404521:9)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    	at iy.run(chromium-Monochrome.aab-stable-720404521:26)
    	at mt5.run(chromium-Monochrome.aab-stable-720404521:8)
    	at org.chromium.base.task.TaskRunnerImpl.f(chromium-Monochrome.aab-stable-720404521:31)
    	at Dr6.run(chromium-Monochrome.aab-stable-720404521:3)
    	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)
 A  [0602/100619.046533:FATAL:android_webview/lib/webview_entry_point.cc:25] WebView cannot be started with a browser process type.
 A  Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x704008e778 in tid 2536 (Thread-4), pid 2496 (.android.chrome)
 W  CustomTabsIntent#shouldAlwaysUseBrowserUI() = false
 I  [File] : hardware/rockchip/mali_so/driver/product/base/src/mali_base_kbase.c; [Line] : 1311; [Func] : base_context_deal_with_version_affairs_rk_ext;
    arm_release_ver of this mali_so is 'g2p0-01eac0', rk_so_ver is '8@0 '.
 I  [File] : hardware/rockchip/mali_so/driver/product/base/src/mali_base_kbase.c; [Line] : 1327; [Func] : base_context_deal_with_version_affairs_rk_ext;
    arm_release_vers are match. to set the full mali_ver 'g2p0-01eac0-x-8@0' as value of 'sys.gmali.version'.
 W  com.android.chrome requires the Google Play Store, but it is missing.
 I  Recorded Startup.Android.FirstDrawCompletedTime = 386 ms
 W  com.android.chrome requires the Google Play Store, but it is missing.
 E  GooglePlayServices not available due to error 9
 E  Error fetching accounts from the delegate.
    org.chromium.components.signin.AccountManagerDelegateException: Unable to retrieve accounts using GoogleAuthUtil.
    	at H4.b(chromium-Monochrome.aab-stable-720404521:43)
    	at ey.call(chromium-Monochrome.aab-stable-720404521:9)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    	at iy.run(chromium-Monochrome.aab-stable-720404521:26)
    	at mt5.run(chromium-Monochrome.aab-stable-720404521:8)
    	at org.chromium.base.task.TaskRunnerImpl.f(chromium-Monochrome.aab-stable-720404521:31)
    	at Dr6.run(chromium-Monochrome.aab-stable-720404521:3)
    	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)

错误问题初步分析

致命崩溃
java 复制代码
[FATAL:android_webview/lib/webview_entry_point.cc:25] WebView cannot be started with a browser process type.
SIGTRAP 崩溃

这是直接闪退根源: 把 Monochrome 一体包设为系统 WebView 提供者后,桌面启动浏览器 和 WebView 组件共用同一套进程入口,Chrome 原生代码触发强断言终止进程。

库加载告警
java 复制代码
odm/bundled_persist-app/xxx.odex not accessible for the namespace

/odm/bundled_persist-app 未加入 linker 白名单,ART 无法正常加载预编译 odex

GMS / 谷歌服务报错

Google Play Store missing、Phenotype API 不可用、gsf.gservices 找不到

设备无 GMS,Chrome 后台不断请求谷歌服务,仅打印日志,不导致闪退。

问题、困难思考

其实就是内置一个Chrome 浏览器,哪里这么多关联打开就闪退,用不了。 没办法,Chrome 本身就是谷歌一套 ,使用要求太高了,关联性太高了。 明明是国内版本使用有没有GMS 依赖,内置到系统里面的Chrome apk 打开就是闪退。 为了集成一个Chrome apk,不可能去大动干戈改来改去吧。 具体思路,待会介绍。

3、思考-思路

基于以上的思考,其实想着怎么绕过系统检测,我个人有两个思路:

  • 静默安装实现,既然adb install 能够实现,没有问题,那我就静默安装呗。
  • 上面问题思考中,涉及到webView 内核啥的,那我就找一个没有webView内核,纯浏览器且比较老一点版本不就可以了嘛。老版本的Chrome 少很多限制的。

所以,这里解决方案其实就是按照方案二实现的,找一个版本合适的apk 直接内置就可以了。

通过网盘分享的文件:Android11_com.android.chrome.apk

链接: https://pan.baidu.com/s/1G6S8sNSmRz-bQ4dsHy4RlQ?pwd=sm1v 提取码: sm1v --来自百度网盘超级会员v5的分享

四、知识点扩展

其实上面已经实现了需求,虽然不咋优雅。自己看到有些项目其实已经实现了内置Chrome 高版本的方案,环境都调试好了,这里分享一下,如果您的环境下直接集成没有问题那本身就可以常规方案直接集成的。

1、作为公版软件集成到系统

路径:\vendor\rockchip\common\apps

2、集成配置说明

其实这里只是作为公版软件配置到系统里面去,和单独配置到系统某个分支并没有特别的区别。 这里我们看看配置相关内容

内置 apk 软件配置结构

内置 apk 编译脚本说明

java 复制代码
LOCAL_PATH := $(my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := chrome
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

include $(BUILD_PREBUILT)

其实RK 体系里面,你只需要放置apk 到对应的文件夹下,RK 直接帮你配置编译脚本了,只是特殊情况下 出现了问题,那么手动配置编译脚本

总结

  • 以上是根据个人经验实现了Chrome apk 内置的需求,实际中常用常规的需求。
  • 遇到什么问题多思考,尝试不同解决方案来实现即可。