Android GeckoView Web Extension开发:JS注入无效果问题求助
解决GeckoView 73.0.x Web Extension不生效的问题
看起来你在GeckoView中配置Web Extension时踩了几个版本相关的坑,结合你用的73.0.20200217142647版本,我帮你梳理下关键问题和修正方案:
1. 修正资源路径与文件结构错误
你当前使用的Web Extension路径resource://assets/extension/checkExtension/是错误的。在GeckoView中,访问Android assets目录的正确前缀是resource://android/assets/,所以你的扩展路径应该改为:
WebExtension test = new WebExtension( "resource://android/assets/checkExtension/", runtime.getWebExtensionController() );
同时要确保文件结构正确:checkExtension.js必须和manifest.json放在同一个assets子目录下,也就是:
assets/ └── checkExtension/ ├── manifest.json └── checkExtension.js
你之前描述的结构里checkExtension.js在assets根目录,这会导致manifest找不到脚本文件,直接导致扩展失效。
2. 调整Manifest配置适配版本
针对GeckoView 73版本,你的manifest需要做两个小调整:
- 移除
nativeMessaging权限(当前场景完全用不到,还可能引入不必要的权限校验问题) - 把
matches的"*"换成标准的<all_urls>(73版本对"*"的支持不稳定,<all_urls>是官方推荐的全匹配写法)
修正后的manifest.json:
{ "manifest_version": 2, "name": "checkExtension", "version": "1.0", "description": "Automatically clicks the authorise button to continue the photo upload.", "content_scripts": [ { "matches": ["<all_urls>"], "js": ["checkExtension.js"] } ], "permissions": ["geckoViewAddons"] }
3. 优化代码执行顺序
你当前的代码顺序基本没问题,但为了避免版本兼容问题,建议调整为更稳妥的执行流程:
// 1. 先创建Runtime GeckoRuntime runtime = GeckoRuntime.create(this); // 2. 注册WebExtension(必须在加载URL前完成) WebExtension test = new WebExtension( "resource://android/assets/checkExtension/", runtime.getWebExtensionController() ); runtime.registerWebExtension(test); // 3. 创建并关联Session GeckoSession session = new GeckoSession(); session.open(runtime); // 4. 绑定View并加载目标URL GeckoView view = findViewById(R.id.geckoview); view.setSession(session); session.loadUri("https://www.google.com");
4. 更换更可靠的测试方式
有些网站会默认禁用alert弹窗,或者GeckoView的安全设置会拦截弹窗,建议把checkExtension.js的测试代码换成更直观的页面修改:
// 直接修改页面内容,一眼就能看到效果 document.body.insertAdjacentHTML('afterbegin', '<h2 style="color:red;">Gecko Extension Works!</h2>');
针对GeckoView 73的参考建议
由于你使用的是较旧的稳定版本,建议直接查看对应版本的官方代码快照:
- 可以在GeckoView的GitHub仓库中切换到
v73.0.20200217142647标签,查看当时的Web Extension实现细节 - 重点关注
GeckoRuntime.registerWebExtension()的参数要求和资源路径规则,73版本的API和后续版本差异较大
按照以上步骤调整后,你的Web Extension应该就能正常生效了。
内容的提问来源于stack exchange,提问作者Ziz




