当前位置: 首页 > 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.lqws.cn/news/454591.html

相关文章:

  • 汽车加气站操作工考试题库含答案【最新】
  • DB面试题
  • mysql查询使用`_rowid` 虚拟列
  • vtk和opencv和opengl直接的区别是什么?
  • Pinia在多步骤表单中的实践应用
  • 芯谷科技--高性能、高可靠性降压转换器D3502C
  • 泛型方法调用需要显示指定泛型类型的场景
  • 【JUC面试篇】Java并发编程高频八股——线程池
  • 5G 浪潮:发展全景、困境突围与未来航向
  • Fiddler抓包工具使用技巧:如何结合Charles和Wireshark提升开发调试效率
  • conda(Anaconda/Miniconda)常用命令
  • 头部黄金珠宝品牌扬帆狮城,百胜双中台一体化方案护航全球化运营
  • Linux下nginx访问路径页面
  • 【MySQL篇10】:四种分库分表详解
  • 云蝠智能大模型呼叫系统:为企业提供专业的智能客户联络
  • 第3讲、LangChain性能优化:上下文缓存与流式响应实战指南
  • 通过Radius认证服务器实现飞塔/华为防火墙二次认证:原理、实践与安全价值解析
  • django serializer __all__中 额外添加外键里的某一个属性
  • King’s LIMS 系统引领汽车检测实验室数字化转型
  • Unity3d中使用Mirror进行自定义消息通信
  • 解锁决策树:数据挖掘的智慧引擎
  • YOLO系列模型基础与实战(YOLO系列发展线)
  • YOLOv11改进 | RCS-OSA与C3k2融合架构技术详解
  • 容器技术技术入门与Docker环境部署
  • 在 CentOS 7.9 中 Node 18.20.2 安装指南
  • HTTP 请求方法与状态码
  • MySQL慢SQL优化全攻略:从诊断到调优
  • day30 导包
  • html和css实现文本打断换行、自动换行
  • postgresql DDL脚本