Windows+Android开发环境搭建:绕过权限陷阱的站点配置实战
|
上线那晚,我蹲在机房门口啃冷掉的葱油饼,后端小张叼着半截烟站我旁边,火光一明一暗,照见他手机屏幕——测试群弹出第十七条“登录页白屏”,他手指悬在键盘上,没敲,就盯着看。白板上还留着上午需求评审写的“Android WebView 本地调试需支持 HTTPS 本地域名”,字迹歪斜,底下被谁用荧光笔粗暴圈了三遍,墨水洇开了。 说白了,这事儿根本不是搭环境,是拿 Windows 的 UAC 当筛子,一遍遍过 Android 的证书校验、WebView 的 StrictMode、Chrome DevTools 的 remote debugging 权限链——仨东西摞一起,像往生锈的锁芯里灌胶水,越使劲越卡死。我原以为搞个自签名证书+ hosts 绑定+信任根证书就能完事,结果 Android Studio 吐了句“ERR_CERT_AUTHORITY_INVALID”之后,连 console.log 都不肯吐给你看。老板推门出来递了瓶冰水,说:“就差这一步,明早演示。”我没接,瓶身冷凝水顺着指缝滴到鞋面上,洇开一小片深色。 你猜怎么着?最后绕过去的方法,是把 localhost 改成 dev.yourcompany.internal——不是因为这域名多高大上,是因为 Chrome 在 Android 上对 localhost 硬编码了更严格的证书策略,而对任何带点的域名,默认降级走系统信任链;Windows 侧又得手动导出 cert 并 import 到“受信任的根证书颁发机构”,但导进“当前用户”不管用,必须导进“本地计算机”,而点那个导入按钮之前,得先右键“以管理员身份运行 mmc.exe”,否则弹窗里连“受信任的根证书”这个文件夹都不显示。整套流程里最要命的,是那个弹窗标题写着“证书导入向导”,可它压根不告诉你:你刚点的那个“下一步”,其实是触发了 Windows 要求提升权限的无声静默拦截,而 Android 端还在等你配好证书后重启 WebView 进程……两头卡着,像两个人隔着一堵没门的墙互相喊“你先开门”。 设计昨天来问能不能让 H5 页面在安卓手机上直接调用相机——我说能,她眼睛一亮;我说得装个本地 HTTPS 域名证书,她说“哦那算了”。我就笑。她转身前还补了句:“上次iOS那边说加个WKWebView配置就十分钟。”我没吭声。其实 iOS 那边上周也崩过,不过是崩在 info.plist 的 NSAppTransportSecurity 配置上,崩溃逻辑不一样,但崩溃时那种绝望是一样的:全是文档里没写的默认行为,全靠翻 Chromium 源码 commit 记录和某年 StackOverflow 的一个带图回答续命。测试群一直在响,叮咚叮咚,像催命。 外卖到了没人拿,纸袋在消防通道口堆了俩小时,塑料袋被空调风吹得哗啦响。我顺手扯开看了眼——是宫保鸡丁,花生都浸在酱汁里浮着,没动筷子,先去看了眼 Jenkins 构建日志。最后通不过的原因,真不是代码,是 gradle.properties 里那行 systemProp.http.proxyHost=127.0.0.1 ——Android 构建时会把它继承给 ADB 的 HTTPS 请求代理链,然后整个调试桥接就卡在证书验证环节死循环。删掉这行,重装一次模拟器,好了。就这行,改了四版,前三版我都改在 build.gradle 里,错方向了。板是我自己拍的,这点认。 优胜劣汰?我说站得住,不是因为这方案多优雅,是它活下来了。那些试图硬扛权限链、非要写个 Windows 服务去劫持证书注册表的方案,死在第二周;那个想用 mkcert 生成通配符证书然后塞进 Android/system/etc/security/cacerts 的,烧了台测试机;还有个兄弟试了三年前的老法子——在 Windows 开个 nginx 反代,再让 Android 访问 192.168.x.x 加端口……结果新版本 WebView 默认禁了非 TLS 1.2 的连接,连握手都拒。它们都被干掉了。活下来的,就是那个最糙的:dev.yourcompany.internal + 本地计算机证书导入 + 禁用 WebView 的混合内容限制(仅 debug 包)。不美,但能测、能调、能打包、能演示。窗外天黑了,路灯一盏接一盏亮起来,光晕糊在玻璃上,像未渲染完的 canvas。 前天离职的那个运维老刘,走之前给我留了张便签,贴在显示器边框上:“别信文档,信 adb logcat -v threadtime | grep WebView”。我没扔,现在还贴着。今天早上他又微信发来一条,没寒暄,就一张截图:Android 14 的 WebView 日志里一行红字——“Ignoring insecure http://localhost in non-DEBUG build.”。下面写了个小字:“你们还在 debug 包里苟?”我回了个“嗯”。没聊别的。他午饭常去楼下沙县,点蒸饺和紫菜蛋花汤,汤总要多放醋。我后来也去了,醋倒多了,酸得皱眉。
文章配图,仅供参考 下一步?我把 dev.yourcompany.internal 重新指向一台 Docker 里的 Nginx 容器,把证书生成脚本加进 CI 流水线,让它每次构建自动 dump 证书到 assets 目录——不是为了省事,是怕下个接手的人,在某个周一早晨,面对同样白屏页面,又去翻三年前的 GitHub Gist,然后误信了某条 star 两千的“终极解决方案”,把自己钉死在 Windows 的 Trusted Root Certification Authorities 控制台里反复点“导入”。至于我自己?待会儿得去找老板,承认两点:一是最初评估说“两天搞定”纯属嘴快,二是那台跑 CI 的 Win Server,我忘了关它默认开启的 Windows Defender Exploit Guard——它上周静默拦截了三个关键端口的调试监听。这锅,我背一半。(编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


云端卡顿、网络延迟高?Android性能优化实战
Android存储优化实战:17年电商老兵的秒开秘籍
Windows嵌入式开发环境搭建:站点配置与权限设置指南
Windows站点权限整合:一次配置,全域生效
Windows站点权限配置:16年日志工程师实战避坑指南
Linux与Windows服务器选型的5大性能陷阱
一招破解iOS与Android H5渲染差异

