android 6.0 以后 WebView改动

从Android 6.0开始,WebView构建基于Chromium,需要按照Chromium的构建指南进行。预构建的libwebviewchromium.so来源于Chromium 44.0.2403.114。为了匹配构建设置,需设置特定的GYP_DEFINES环境变量。由于API变化,Chromium 2403分支的Java代码不兼容M版本。在调试过程中,可以通过修改SkFontMgr_android.cpp,使用Log进行底层流程测试,并通过adb logcat查看信息。当.so文件调试遇到问题,可以分析WebViewGoogle.apk,使用aapt和readelf工具深入研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 6.0

Building the Chromium-based WebView in AOSP is no longer supported. WebView can
now be built entirely from the Chromium source code.


General instructions for building WebView from Chromium:
https://www.chromium.org/developers/how-tos/build-instructions-android-webview


------


The prebuilt libwebviewchromium.so included in these APKs is built from Chromium
release tag 44.0.2403.114. To match our build settings, set:


GYP_DEFINES="OS=android release_unwind_tables=0 buildtype=Official chrome_build_id='2e7c7a0f-c733-4b9a-9c8e-d3cf0938369b'"


in your environment before running build/gyp_chromium.


------
Due to WebView API changes in the M release, the Java code in the Chromium 2403
branch is not compatible with M. We'll be working on upstreaming the M-specific
Java changes to Chromium once the final M SDK is released.

在android 6.0 以后 针对typeface部分,可以考虑修改external/skia/src/ports/SkFontMgr_android.cpp

1、首先测试底层流程,通过添加Log 信息:

通过定义宏,引入android层log

#include <android/log.h>

#define LOG_TAG "TESTFONT"

#define ALOG(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

使用上 和log.d,log.e,log.v,log.i,log.w基本一致

2、编译ROM 装机运行。。

3、通过adb logcat 查看信息

4、增加对.so文件调试的信息。

对.so文件调试:使用arm-linux-androideabi-4.9 调试log中的具体地址信息。

由于命令过长,使用alias别名方式:

alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入。如果经常与 CLI 打交道,那么使用 alias 不仅会节省时间,而且也能提高效率,真是一举两得的好事。
基本用法: alias 的基本使用方法为:alias 新的命令='原命令 -选项/参数'。举例说明,alias l=‘ls -lsh' 将重新定义 ls 命令,现在只需输入 l 就可以列目录了。
获知别名: 直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。
删除别名: 要删除一个别名,可以使用 unalias 命令,如 unalias l。
这个方法只是暂时的,如果重启一次就失效了,永久生效一个命令怎么办呢?
打开 .bashrc (应该是ubuntu发行版的,其他发行版也许可以修改.bash_profile)可以看到
……
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
……
方法1 :直接在我们的 环境变量文件中添加 alias xx='xxxxx'
方法2  : .bashrc 中有一句话
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
就是说可以另外新建一个文件用于专门存放自己的alias信息

  $ cd
  $ vi .bash_aliases
  在文件中输入自己想设置的命令  alias rm='rm -i'  然后保存推出
  $ source .bash_aliases   #让我们的环境生效

总之,要关注你所改动源码中的提示信息,一般都会很用。

5、使用.so文件调试,具体定位到代码crash的具体行数,进行下一步分析。

6    替换libskia.so以后,webview字体没有改变,方法失败。尝试分析webviewgoogle.apk。在android6.0 以后,由于都是webview发生改动,渲染工作均由google自己提供的apk提供,对vendor/google/apps/WebViewGoogle.apk进行分析,使用aapt工具,我们发现其使用了一个libwebviewchromium.so动态链接库,使用readelf对其进行解析

部分关键代码如下:

Dynamic section at offset 0x1c9ee8c contains 28 entries:
  标记        类型                         名称/值
 0x00000003 (PLTGOT)                     0x1ca6ab8
 0x00000002 (PLTRELSZ)                   2680 (bytes)
 0x00000017 (JMPREL)                     0x1f4180
 0x00000014 (PLTREL)                     REL
 0x00000011 (REL)                        0x1eb90
 0x00000012 (RELSZ)                      1922544 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffa (RELCOUNT)                   240244
 0x00000006 (SYMTAB)                     0x18c
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000005 (STRTAB)                     0x59dc
 0x0000000a (STRSZ)                      93051 (bytes)
 0x00000004 (HASH)                       0x1c558
 0x00000001 (NEEDED)                     共享库:[liblog.so]
 0x00000001 (NEEDED)                     共享库:[libandroid.so]
 0x00000001 (NEEDED)                     共享库:[libjnigraphics.so]
 0x00000001 (NEEDED)                     共享库:[libm.so]
 0x00000001 (NEEDED)                     共享库:[libc.so]
 0x00000001 (NEEDED)                     共享库:[libdl.so]
 0x0000000e (SONAME)                     Library soname: [libwebviewchromium.so]
 0x0000001a (FINI_ARRAY)                 0x1bdd8d8
 0x0000001c (FINI_ARRAYSZ)               8 (bytes)
 0x00000019 (INIT_ARRAY)                 0x1c9fe68
 0x0000001b (INIT_ARRAYSZ)               36 (bytes)
 0x00000010 (SYMBOLIC)                   0x0
 0x0000001e (FLAGS)                      SYMBOLIC BIND_NOW
 0x6ffffffb (FLAGS_1)                    标志: NOW
 0x00000000 (NULL)                       0x0


重定位节 '.rel.dyn' 位于偏移量 0x1eb90 含有 240318 个条目:
 Offset     Info    Type            Sym.Value  Sym. Name
01b61cc8  00000017 R_ARM_RELATIVE
这其中只有一部分共享库,其他的渲染部分由其自己提供,所以基本上没有办法在android 6.0 以后对webview做出更多改动。




### Android 6.0 中升级 WebView 版本的方法指南 #### 背景说明 Android 6.0WebView 的支持进行了多项改进和调整。为了提升安全性、性能以及兼容性,开发者需要关注 WebView 的配置方式及其依赖环境的变化。 --- #### 使用最新系统 WebView 更新机制 自 Android 4.4 开始,Google 将 WebView 抽离为独立组件并通过 Google Play Services 提供更新服务[^1]。这意味着即使设备的操作系统未升级,也可以通过 Google Play Store 获取最新的 WebView 组件。因此,在 Android 6.0 上运行的应用程序会自动受益于这种更新机制,前提是用户的设备已启用 Google Play 并允许安装更新。 如果目标用户群可能不包含 Google Play 支持的设备,则需考虑其他替代方案来确保 WebView 功能正常运作。 --- #### 配置 build.gradle 文件以适配旧版功能需求 对于某些特定场景下仍需使用已被废弃的功能(如 Apache HTTP 客户端),可以在 `build.gradle` 文件中显式声明对其的支持: ```gradle android { useLibrary 'org.apache.http.legacy' } ``` 此设置仅适用于那些确实需要遗留库的情况,并不会直接影响到 WebView 自身的行为或版本管理。 --- #### 处理 WebView 加载逻辑中的常见问题 当遇到因重定向而导致页面无法正确加载的问题时,应重新定义 `shouldOverrideUrlLoading()` 方法的行为模式。以下是推荐的做法之一: ```java webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); // 判断 URL 是否属于标准协议头 if (url.startsWith("http://") || url.startsWith("https://")) { view.loadUrl(url); return false; } // 如果不是 http/https 请求则交由默认行为处理 return true; } }); ``` 上述代码片段能够有效解决由于未能妥善拦截请求所引发的一系列异常状况[^2]。 --- #### 前端 JavaScript 接口调用优化 借助 Android 提供的 `addJavascriptInterface()` 函数可轻松实现 Java 层面与 HTML 页面间的双向通信能力。例如下面展示了一个简单的例子用于向客户端传递消息通知: ```javascript window.Android.showToast("Hello from JS!"); ``` 值得注意的是,在实际项目开发过程中应当格外小心防止潜在的安全隐患暴露出来,比如跨域攻击等问题[^3]。 --- #### 替代全局书签存储策略 鉴于官方已经停止维护针对历史记录及收藏夹的相关 API ,建议应用程序自行设计一套完整的数据管理模式用来取代原有的解决方案。具体而言就是不再依赖如下几个已经被标记过期甚至完全移除掉的方法: - `Browser.getAllBookmarks()` - `Browser.saveBookmark()` 同时也要注意关联权限项同样遭到废止的事实——即不能再申请以下两项许可权限了: - `READ_HISTORY_BOOKMARKS` - `WRITE_HISTORY_BOOKMARKS` 取而代之的办法是创建专属数据库表单或者利用 SharedPreferences 来持久化保存所需的信息条目[^4]。 --- ### 总结 综上所述,要在 Android 6.0 及其后续发行版里成功完成 WebView 的升级改造工作,主要涉及以下几个方面的工作要点:确认当前系统的 WebView 是处于最新状态;合理修改构建脚本来满足特殊业务诉求;修正不当使用的跳转控制流程;加强前后两端协同工作的稳定性保障措施;最后还要记得及时迁移至新的资料管理体系架构上去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值