当前位置: 首页 > news >正文

Android 当apk是系统应用时,无法使用webView的解决方案

最近在做项目时,遇到了一个无法使用webView的问题,apk是系统应用,点击加载webView时应用就是崩溃,原因是系统应用时,Android会觉得webView不安全,不避让加载。

解决的思路就是使用映射,把原生的拦截设置为ture,不让系统拦截。

设置hook代码如下

public static void hookWebView() {Log.i(TAG, "==hookWebView start==");try {Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");Field field = factoryClass.getDeclaredField("sProviderInstance");field.setAccessible(true);Object sProviderInstance = field.get(null);if (sProviderInstance != null) {Log.i(TAG, "sProviderInstance isn't null");return;}Method getProviderClassMethod;getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");getProviderClassMethod.setAccessible(true);Class<?> factoryProviderClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");Constructor<?> delegateConstructor = delegateClass.getDeclaredConstructor();delegateConstructor.setAccessible(true);@SuppressLint("SoonBlockedPrivateApi") Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");chromiumMethodName.setAccessible(true);String chromiumMethodNameStr = (String) chromiumMethodName.get(null);if (chromiumMethodNameStr == null) {chromiumMethodNameStr = "create";}Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);if (staticFactory != null) {sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());}if (sProviderInstance != null) {field.set("sProviderInstance", sProviderInstance);Log.i(TAG, "Hook success!");isHookSuccess = true;} else {Log.i(TAG, "Hook failed!");isHookSuccess = false;}} catch (Throwable e) {Log.w(TAG, e);}}

此方法还需要时机,如果加载太晚或者太早也会不生效,要在Android原生设置属性前,并且isUserUnlocked后调用。

我本项目是在三个地方多次调用了

1、第一个地方是Myapplication的onCreate方法里面并判断了isUserUnlocked

        boolean isUserUnlock = getSystemService(UserManager.class).isUserUnlocked();if (isUserUnlock) {Myapplication.hookWebView();}

2、在MainActivity的onCreate方法里面

        if (!Myapplication.isHookSuccess) {Myapplication.hookWebView();}

3、在开机广播里面

public class ReceiverLocalSetting extends BroadcastReceiver {private static final String TAG = "ReceiverLocalSetting";private static final String USER_UNLOCKED_ACTION = "android.intent.action.USER_UNLOCKED";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "==onReceive==");if (!Myapplication.isHookSuccess) {Myapplication.hookWebView();}}}
}

以上就是解决的思路和方法,留着以后备用。

http://www.xdnf.cn/news/1061533.html

相关文章:

  • 京运通601908,一只值得长期跟踪操作的波段投资标的,两个指标即可做好
  • Cargo 与 Rust 项目
  • Spring Boot自动配置原理
  • 【智能安全帽新升级】搭载VTX316TTS语音合成芯片,让安全“听得见”!
  • 【国产AI服务器】全国产PCIE5.0交换板,替代博通89104/89144,支持海光、龙芯等平台
  • HTTP 请求方法与状态码
  • “地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛定义中国GI
  • 力扣-169.多数元素
  • Kafka线上集群部署方案:从环境选型到资源规划思考
  • http2与websocket关系
  • Linux——linux的基本命令
  • lingma(阿里云Ai)结合idea使用
  • day43-硬件学习之ARM基础知识
  • 从生活场景学透 JavaScript 原型与原型链
  • 棱镜观察|EMB“重构”卡钳,车企降本压力与Brembo困局
  • 力扣-62.不同路径
  • Cesium、ThreeWebGL详解(二)渲染引擎向GPU传数据、性能优化、引擎对比
  • Docker容器常用命令汇总
  • 华为云Flexus+DeepSeek征文 | 利用Dify平台构建多智能体协作系统:从单体到集群的完整方案
  • python自助棋牌室管理系统
  • 全面掌握 C++ 基础:关键特性与进化
  • Llama 4 模型卡及提示格式介绍
  • svn客户端使用教程简易入门:附外网远程访问内网SVN服务通用方法
  • 【服务器R环境架构】基于 micromamba下载 R 库包
  • React封装框架dvajs(状态管理+异步操作+数据订阅等)
  • Windsurf SWE-1模型评析:软件工程的AI革命
  • TensorFlow+CNN垃圾分类深度学习全流程实战教程
  • Python设计模式终极指南:18种模式详解+正反案例对比+框架源码剖析
  • STM32 HAL 初始化I2C启动DS1307
  • FPGA基础 -- Verilog 命名事件