{"id":37026115,"url":"https://github.com/smallbuer/jsbridge-android","last_synced_at":"2026-01-14T03:01:51.887Z","repository":{"id":45554530,"uuid":"242324084","full_name":"smallbuer/JSBridge-Android","owner":"smallbuer","description":"A solution for safe and fast interaction between js and native，it's minimum support API 14;","archived":false,"fork":false,"pushed_at":"2023-05-30T15:35:13.000Z","size":1682,"stargazers_count":244,"open_issues_count":6,"forks_count":41,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-08-01T00:30:53.002Z","etag":null,"topics":["jsapi","jsbind","jsbridge"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smallbuer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-22T10:45:01.000Z","updated_at":"2025-05-16T11:33:49.000Z","dependencies_parsed_at":"2022-09-15T01:21:15.007Z","dependency_job_id":null,"html_url":"https://github.com/smallbuer/JSBridge-Android","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/smallbuer/JSBridge-Android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallbuer%2FJSBridge-Android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallbuer%2FJSBridge-Android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallbuer%2FJSBridge-Android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallbuer%2FJSBridge-Android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smallbuer","download_url":"https://codeload.github.com/smallbuer/JSBridge-Android/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallbuer%2FJSBridge-Android/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408800,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jsapi","jsbind","jsbridge"],"created_at":"2026-01-14T03:01:50.942Z","updated_at":"2026-01-14T03:01:51.867Z","avatar_url":"https://github.com/smallbuer.png","language":"Java","readme":"#### JSBridge-Android\n[![Download](https://img.shields.io/badge/Download-1.0.7-brightgreen.svg)](https://search.maven.org/artifact/com.smallbuer/jsbridge/)   [![Release Version](https://img.shields.io/badge/release-1.0.7-red.svg)](https://github.com/smallbuer/JSBridge-Android/releases)   [![Maven Central](https://img.shields.io/badge/Maven%20Central-1.0.7-brightgreen.svg)](https://search.maven.org/artifact/com.smallbuer/jsbridge/1.0.7/aar)  [![Platform](https://img.shields.io/badge/Platform-Android-brightgreen.svg)](https://github.com/smallbuer/JSBridge-Android)\n\n### 简介\n\n本项目来源于 lzyzsd的[JsBridge](https://github.com/lzyzsd/JsBridge)，由于作者长时间未修复部分代码丢失问题，所以目前存在的调用丢失问题以及效率问题无法在原项目得到回应，所以重构了目前js文件以及java类；\n\n主要修改如下：\n\n不再使用URL SHEME拦截方式，直接采用webview的addJavaScriptInterface,此方法根据Android源码跟踪，是目前采用webview方案js与原生交互效率最高的一种系统实现；\n对于API小于17的使用者，1.0.3版本将支持版本降低到14，满足一些朋友的需要;\n在1.0.6将BridgeWebViewClient设置为Public,方便业务层进行拦截URL处理；\n在1.0.7中注入的JS文件会对H5调用JS桥传递的参数进行校验，避免两层引号问题；\n\n为了安全主要实现方式利用onJsPrompt方法让H5可以和原生进行交互，并且移除了低版本的三个危险漏洞；\n```\n//4.2之前addJavascriptInterface有安全泄漏风险，进行移除\nwebView.removeJavascriptInterface(\"searchBoxJavaBridge_\");\nwebView.removeJavascriptInterface(\"accessibility\");\nwebView.removeJavascriptInterface(\"accessibilityTraversal\");\n```\n本项目保持和lzyzsd老用户的兼容性，内部也重构了BridgeWebView的实现，直接作为View使用即可；\n同时也扩展了外部webview的扩展方案,例如X5webview,UC内核(官方申请合作使用,此demo供学习使用)的示例；\n\n欢迎提供好的实现意见与PR；\n\n如果只想解决lzyzsd的[JsBridge]项目调用桥调用丢失问题，可以参考files目录下的README,将JS文件替换其项目即可；\n\njscript文件下的js文件为新版本SDK内部字符串压缩前的原文件，文件带Min的为API\u003c17的低版本使用,不带的为\u003e=17使用和之前保持一致；\nJS源文件在java代码中已经做了压缩处理，此文件只为了供大家查看使用，不需要添加到项目中；\n\n### 导入SDK\n\n1.在项目的根目录build.gradle中的repositories 添加:\n```\n\nrepositories {\n        mavenCentral()\n}\n```\n2.然后在模块的build.gradle(Module) 的 dependencies 添加:\n```\n\ndependencies {\n      implementation 'com.smallbuer:jsbridge:1.0.7'\n}\n```\n\n注：内部需要借助于GSON库，使用外部依赖；\n\n\n\n### 使用步骤\n\n1.新增原生功能module\n\u003e 继承 BridgeHandler并实现handler方法，例如：\n\n```\n\npublic class ToastBridgeHandler extends BridgeHandler {\n\n    @Override\n    public void handler(Context context,String data, CallBackFunction function) {\n\n        Toast.makeText(context,\"data:\"+data,Toast.LENGTH_SHORT).show();\n\n        function.onCallBack(\"{\\\"status\\\":\\\"0\\\",\\\"msg\\\":\\\"吐司成功\\\"}\");\n\n    }\n}\n```\n\n2.原生功能注册\n\u003e对所有的原生功能进行全局注册，分为两种方式，推荐方式二；这里注册的桥名也是H5调用时传递的方法名称；\n\n方式一：\n```\n    //style 1\n    Bridge.INSTANCE.registerHandler(HandlerName.HANDLER_NAME_TOAST, ToastBridgeHandler())        \n    Bridge.INSTANCE.registerHandler(HandlerName.HANDLER_NAME_PHOTO, PhotoBridgeHandler())\n    Bridge.INSTANCE.registerHandler(HandlerName.HANDLER_NAME_REQUEST, RequestBridgeHandler())\n```\n方式二：\n\n```\n    //style 2\n    var handlerMap = HashMap\u003cString,BridgeHandler\u003e();\n    handlerMap[HandlerName.HANDLER_NAME_TOAST] = ToastBridgeHandler()\n    handlerMap[HandlerName.HANDLER_NAME_PHOTO] = PhotoBridgeHandler()\n    handlerMap[HandlerName.HANDLER_NAME_REQUEST] = RequestBridgeHandler()\n    Bridge.INSTANCE.registerHandler(handlerMap)\n```\n\n其中HandlerName.HANDLER_NAME_TOAST等常量即为原生功能的名称标示，用于H5调用需要指定，参考4\n\n\u003e对原生功能进行局部注册，方便在Activity和Fragment中进行桥的注册；\n```java\n//local register bridge\nbridgeWebview.addHandlerLocal(HandlerName.HANDLER_NAME_TOAST,object: BridgeHandler(){\n    override fun handler(context: Context?, data: String?, function: CallBackFunction?) {\n        Toast.makeText(this@MainActivity,data,Toast.LENGTH_SHORT).show()\n    }\n})\n```\n\n拿到页面中的webview对象后，调用addHandlerLocal方法进行注册局部桥，可以用来新增桥和替换全局的桥，便于业务定制；\n\n支持版本1.0.4+；\n\n\n\n3.使用方法\n\n\u003e直接使用封装好的BridgeWebview,基于系统自带webview;\n\n（1）xml中导入\n```\n\u003ccom.smallbuer.jsbridge.core.BridgeWebView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:id=\"@+id/bridgeWebview\"\n    android:layout_weight=\"1\"\n    /\u003e\n```\n（2）代码中使用\n```\nbridgeWebview.loadUrl(url)\n\n//原生调用H5，functionInJs是H5为原生注册的桥名，参考demo.html\nbridgeWebview.callHandler(\"functionInJs\", \"我是原生传递的参数\") { data -\u003e\n                Log.i(TAG, \"reponse data from js $data\")\n            }\n```\n\n\n\u003e外部扩展其他webview,比如X5内核，uc内核等，源码请参考demo中X5WebView实现\n\n（1）新建X5WebView继承X5包内的webview并实现IWebView接口\u003cbr\u003e\n（2）在X5WebView中新建BridgeTiny并传入X5WebView对应，BridgeTiny作为一个webview的管理类；\u003cbr\u003e \n（3）在webview执行onPageFinished时，加载js脚本内容用于执行对象的注册；\u003cbr\u003e\n（4）在webview执行destroy时清空使用内存；\u003cbr\u003e\n\n使用API如下：\u003cbr\u003e\n\n（1）xml中导入\n```\n    \u003ccom.smallbuer.jsbridge.demo.view.X5WebView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:id=\"@+id/x5Webview\"\n        android:layout_weight=\"1\"\n        /\u003e\n```\n\n（2）代码中使用\n```\nx5Webview.loadUrl(url)\n\n//原生调用H5，functionInJs是H5为原生注册的桥名，参考demo.html\nx5Webview.callHandler(\"functionInJs\", \"我是原生传递的参数\") { data -\u003e\n    Log.i(TAG, \"reponse data from js $data\")\n}\n```\n\n4.H5调用\n\n\u003eH5中可以自己封装调用名称，适合Vue.js或者存js调用;\n```\nwindow.WebViewJavascriptBridge.callHandler(\n                'toast'                     //桥注册的名称ID\n                , {'msg': '中文测试'}        //传递给原生的参数\n                , function(responseData) {  //异步回调接口\n                    console.log('native return-\u003e'+responseData);\n                }\n            );\n```\n\n## 混淆\n\n```\n-keep class com.smallbuer.jsbridge.core.** { *; }\n```\n\n## License\n\nJSBridge-Android is [Apache-2.0 licensed](./LICENSE).","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmallbuer%2Fjsbridge-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmallbuer%2Fjsbridge-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmallbuer%2Fjsbridge-android/lists"}