{"id":93696,"date":"2026-08-13T04:40:42","date_gmt":"2026-08-12T20:40:42","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/93696.html"},"modified":"2026-08-13T04:40:42","modified_gmt":"2026-08-12T20:40:42","slug":"zorv-ai-%c2%b7-aci-%e5%bc%80%e5%8f%91%e8%80%85%e6%89%8b%e5%86%8c%ef%bc%88agent-capability-interface%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/93696.html","title":{"rendered":"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09"},"content":{"rendered":"<p>\u7248\u672c&#xff1a;v1.0.14&#xff08;\u80fd\u529b\u6e05\u5355\u540c\u6b65 ZorvAI \u6d4f\u89c8\u5668 v1.0.14&#xff1b;\u65b0\u589e \u00a715 HTTP \u4f20\u8f93 \/ http_request \u00b7 \u5c40\u57df\u7f51\u660e\u6587&#xff09; \u9002\u7528 SDK&#xff1a;aci-core \u6700\u540e\u66f4\u65b0&#xff1a;2026-08-10&#xff08;v1.0.25 \u65b0\u589e\u8bed\u4e49\u70b9\u51fb\u95ed\u73af ui_snapshot \/ tap&#xff09;<\/p>\n<p>\u672c\u6587\u6863\u9762\u5411\u5e0c\u671b\u8ba9\u81ea\u5df1\u7684 Android App \u88ab Zorv AI&#xff08;\u6216\u5176\u4ed6 ACI \u63a7\u5236\u7aef&#xff09;\u8c03\u7528\u7684\u7b2c\u4e09\u65b9\u5f00\u53d1\u8005&#xff0c;\u4e5f\u9002\u7528\u4e8e\u60f3\u57fa\u4e8e aci-core \u81ea\u5efa\u63a7\u5236\u7aef\u7684\u5f00\u53d1\u8005\u3002<\/p>\n<hr \/>\n<h3>1. \u4ec0\u4e48\u662f ACI<\/h3>\n<p>ACI&#xff08;Agent Capability Interface&#xff0c;\u667a\u80fd\u4f53\u80fd\u529b\u63a5\u53e3&#xff09; \u662f\u4e00\u5957\u8fd0\u884c\u5728\u540c\u4e00\u53f0 Android \u8bbe\u5907\u5185\u3001\u65e0\u9700 Root\u3001\u57fa\u4e8e AIDL Binder \u7684\u672c\u5730\u8de8\u5e94\u7528\u8c03\u7528\u6846\u67b6\u3002<\/p>\n<ul>\n<li>\u63a7\u5236\u7aef&#xff08;\u5982 Zorv AI&#xff09;\u53d1\u73b0\u5e76\u7ed1\u5b9a\u53d7\u63a7\u7aef Service&#xff1b;<\/li>\n<li>\u53d7\u63a7\u7aef&#xff08;\u4f60\u7684 App&#xff09;\u901a\u8fc7 BaseACIService \u58f0\u660e\u300c\u80fd\u529b&#xff08;Capability&#xff09;\u300d&#xff1b;<\/li>\n<li>\u63a7\u5236\u7aef\u628a\u80fd\u529b\u6e05\u5355\u5582\u7ed9 LLM&#xff0c;\u7531 LLM \u51b3\u7b56\u8c03\u7528\u54ea\u4e2a\u80fd\u529b\u3001\u4f20\u4ec0\u4e48\u53c2\u6570&#xff1b;<\/li>\n<li>\u8c03\u7528\u901a\u8fc7 Binder \u540c\u6b65\/\u5f02\u6b65\u5b8c\u6210&#xff0c;\u7ed3\u679c\u56de\u4f20\u3002<\/li>\n<\/ul>\n<p>ACI \u7684\u8bbe\u8ba1\u76ee\u6807\u662f\u8ba9\u300c\u624b\u673a\u4e0a\u7684\u4efb\u610f App \u80fd\u529b\u300d\u6210\u4e3a AI Agent \u53ef\u7f16\u6392\u7684\u5de5\u5177&#xff0c;\u65e0\u9700\u516c\u7f51\u3001\u65e0\u9700\u4e91\u7aef\u4e2d\u8f6c\u3002<\/p>\n<hr \/>\n<h3>2. \u67b6\u6784\u4e0e\u89d2\u8272<\/h3>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         AIDL Binder           \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502   \u63a7\u5236\u7aef&#xff08;Zorv AI&#xff09;        \u2502  \u2500\u2500\u2500 call \/ callAsync \u2500\u2500\u2500\u25b6   \u2502   \u53d7\u63a7\u7aef&#xff08;\u4f60\u7684 App&#xff09;       \u2502<br \/>\n\u2502  QuroAidlAciManager       \u2502  \u25c0\u2500\u2500 ACIResponse \u2500\u2500\u2500\u2500\u2500\u2500\u2500     \u2502  BaseACIService \u5b50\u7c7b      \u2502<br \/>\n\u2502  &#8211; discover() \u53d1\u73b0        \u2502                              \u2502  &#8211; onCreateCapabilities   \u2502<br \/>\n\u2502  &#8211; bind() \u7ed1\u5b9a            \u2502  \u2500\u2500\u2500 ACTION_WAKE \u5e7f\u64ad \u2500\u2500\u25b6    \u2502  &#8211; onCall() \u5904\u7406          \u2502<br \/>\n\u2502  &#8211; getCapabilities() \u53d6\u6e05\u5355\u2502  (\u5524\u9192 stopped \u8fdb\u7a0b)         \u2502  &#8211; onCheckPermission()    \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                              \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<table>\n<tr>\u89d2\u8272\u804c\u8d23\u5173\u952e\u7c7b<\/tr>\n<tbody>\n<tr>\n<td>\u63a7\u5236\u7aef<\/td>\n<td>\u626b\u63cf\u3001\u7ed1\u5b9a\u3001\u53d6\u80fd\u529b\u6e05\u5355\u3001\u53d1\u8d77\u8c03\u7528\u3001\u628a\u7ed3\u679c\u5582\u7ed9 LLM<\/td>\n<td>QuroAidlAciManager &#043; aci-core \u7684 IACIService \u6869<\/td>\n<\/tr>\n<tr>\n<td>\u53d7\u63a7\u7aef<\/td>\n<td>\u7ee7\u627f BaseACIService&#xff0c;\u58f0\u660e\u80fd\u529b&#xff0c;\u5b9e\u73b0\u5904\u7406\u903b\u8f91<\/td>\n<td>BaseACIService \/ Capability \/ ACIRequest \/ ACIResponse<\/td>\n<\/tr>\n<tr>\n<td>Binder \u5951\u7ea6<\/td>\n<td>\u5b9a\u4e49\u8de8\u8fdb\u7a0b\u65b9\u6cd5<\/td>\n<td>IACIService.aidl \/ IACICallback.aidl<\/td>\n<\/tr>\n<tr>\n<td>\u6743\u9650<\/td>\n<td>5 \u5c42\u9274\u6743<\/td>\n<td>aci_permissions.xml &#043; onCheckPermission<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>3. \u63a5\u5165\u51c6\u5907&#xff1a;\u83b7\u53d6 aci-core<\/h3>\n<p>aci-core \u662f\u7eaf\u672c\u5730\u5e93&#xff08;\u4ec5\u4f9d\u8d56 androidx.annotation:annotation:1.7.1&#xff09;&#xff0c;\u4ee5 AAR \u5f62\u5f0f\u5206\u53d1\u3002<\/p>\n<h4>\u65b9\u5f0f A&#xff1a;\u4ece\u672c\u4ed3\u5e93 Release \u76f4\u63a5\u4e0b\u8f7d<\/h4>\n<p>\u5728 ZorvAI Releases \u7684 v1.0.6&#xff08;\u542b AAR&#xff09; \u4e2d\u4e0b\u8f7d aci-core-release.aar&#xff0c;\u653e\u5165\u4f60\u6a21\u5757\u7684 libs\/ \u76ee\u5f55\u3002<\/p>\n<p>\u5f00\u6e90\u72ec\u7acb\u5206\u652f&#xff1a;aci-core \u5206\u652f&#xff08;\u4ed3\u5e93\u6839\u5373\u4e00\u4e2a\u53ef\u72ec\u7acb .\/gradlew assembleRelease \u7684 Android \u5e93\u5de5\u7a0b&#xff09;&#xff0c;\u4f60\u53ef git checkout aci-core \u540e\u81ea\u884c\u6784\u5efa\u6216\u6539\u6e90\u7801\u3002<\/p>\n<h4>\u65b9\u5f0f B&#xff1a;Gradle \u4f9d\u8d56&#xff08;\u79c1\u6709\/\u672c\u5730\u4ed3\u5e93&#xff09;<\/h4>\n<p><span class=\"token comment\">\/\/ app\/build.gradle.kts&#xff08;\u6216\u4f60\u7684\u5e93\u6a21\u5757&#xff09;<\/span><br \/>\ndependencies <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">implementation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">files<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;libs\/aci-core-release.aar&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u26a0\ufe0f aci-core \u5f53\u524d\u4ee5 AAR \u4e8c\u8fdb\u5236\u5206\u53d1&#xff08;\u975e Maven Central \u5750\u6807&#xff09;\u3002\u5f00\u6e90\u5206\u652f\u63d0\u4f9b\u5b8c\u6574\u6e90\u7801&#xff0c;\u53ef\u63a5\u5165\u4f60\u81ea\u5df1\u7684 Maven \u4ed3\u5e93\u540e\u6539\u7528\u5750\u6807\u4f9d\u8d56\u3002<\/p>\n<hr \/>\n<h3>4. \u53d7\u63a7\u7aef\u63a5\u5165&#xff08;5 \u6b65&#xff09;<\/h3>\n<h4>4.1 \u6dfb\u52a0\u4f9d\u8d56<\/h4>\n<p>\u628a aci-core-release.aar \u653e\u5230\u53d7\u63a7\u7aef\u6a21\u5757\u7684 libs\/&#xff0c;\u5e76\u5728\u8be5\u6a21\u5757 build.gradle.kts \u52a0&#xff1a;<\/p>\n<p>dependencies <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">implementation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">files<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;libs\/aci-core-release.aar&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>4.2 \u58f0\u660e\u6743\u9650\u4e0e\u6e05\u5355&#xff08;\u53d7\u63a7\u7aef AndroidManifest.xml&#xff09;<\/h4>\n<p>\u26a0\ufe0f \u6743\u9650\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef&#xff08;Zorv AI&#xff09;\u3002\u53d7\u63a7\u7aef\u7edd\u4e0d\u80fd\u7528 &lt;permission&gt; \u5b9a\u4e49 ai.aci.permission.*\u2014\u2014\u63a7\u5236\u7aef ZorvAI \u5df2\u5b9a\u4e49\u8fd9\u4e9b\u6743\u9650&#xff0c;\u53d7\u63a7\u7aef\u53ea\u9700\u5f15\u7528&#xff08;uses-permission&#xff09;\u3002\u53d7\u63a7\u7aef\u82e5\u4e5f\u5b9a\u4e49\u540c\u540d\u6743\u9650&#xff0c;\u4f1a\u56e0\u300c\u540c\u540d &#043; \u5f02\u7b7e\u540d &#043; \u53cc\u65b9\u90fd\u5b9a\u4e49\u300d\u89e6\u53d1 INSTALL_FAILED_CONFLICTING_PERMISSION \u51b2\u7a81&#xff08;\u8be6\u89c1 \u00a716&#xff09;\u3002<\/p>\n<p>\u53d7\u63a7\u7aef\u53ea\u9700\u58f0\u660e &lt;uses-permission&gt; \u5f15\u7528 &#043; \u5728 service \u4e0a\u7528 android:permission \u505a\u7b2c\u4e00\u5c42 Manifest \u9274\u6743&#xff0c;\u5e76\u58f0\u660e &lt;queries&gt; \u8ba9\u7cfb\u7edf\u80fd\u53d1\u73b0\u81ea\u8eab&#xff08;Android 11&#043; \u5305\u53ef\u89c1\u6027&#xff09;&#xff1a;<\/p>\n<p><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>manifest<\/span> <span class=\"token attr-name\">&#8230;<\/span><br \/>\n    <span class=\"token attr-name\"><span class=\"token namespace\">xmlns:<\/span>tools<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>http:\/\/schemas.android.com\/tools<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>    <span class=\"token comment\">&lt;!&#8211; \u274c \u7981\u6b62&#xff1a;\u53d7\u63a7\u7aef\u4e0d\u8981 &lt;permission&gt; \u5b9a\u4e49 ai.aci.permission.*&#xff08;\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef ZorvAI&#xff09; &#8211;&gt;<\/span><br \/>\n    <span class=\"token comment\">&lt;!&#8211; \u2705 \u4ec5\u5f15\u7528&#xff1a;\u7528 uses-permission \u5f15\u7528\u63a7\u5236\u7aef\u5df2\u5b9a\u4e49\u7684\u6743\u9650 &#8211;&gt;<\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>uses-permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.CALL<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>uses-permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.DISCOVER<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>uses-permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.CALL_DANGEROUS<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>uses-permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>android.permission.INTERNET<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><\/p>\n<p>    <span class=\"token comment\">&lt;!&#8211; \u82e5 aci-core \u5e93\u6a21\u5757\u5e26\u5165\u4e86 &lt;permission&gt; \u5b9a\u4e49&#xff0c;\u7528 tools:node&#061;&#034;remove&#034; \u5728\u6d88\u8d39\u7aef\u5265\u9664&#xff0c;<br \/>\n         \u5426\u5219\u5408\u5e76\u540e\u4f1a\u91cd\u590d\u5b9a\u4e49&#xff08;\u540c\u540d\u5f02\u7b7e\u540d\u51b2\u7a81&#xff09;\u3002\u4e0b\u9762\u4e09\u6761\u53ea\u4e3a\u300c\u5220\u9664\u300d&#xff0c;\u4e0d\u662f\u5b9a\u4e49\u3002 &#8211;&gt;<\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.CALL<span class=\"token punctuation\">&#034;<\/span><\/span>           <span class=\"token attr-name\"><span class=\"token namespace\">tools:<\/span>node<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>remove<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.CALL_DANGEROUS<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token attr-name\"><span class=\"token namespace\">tools:<\/span>node<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>remove<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>permission<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.DISCOVER<span class=\"token punctuation\">&#034;<\/span><\/span>      <span class=\"token attr-name\"><span class=\"token namespace\">tools:<\/span>node<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>remove<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><\/p>\n<p>    <span class=\"token comment\">&lt;!&#8211; \u5305\u53ef\u89c1\u6027&#xff1a;\u58f0\u660e\u672c App \u63d0\u4f9b\/\u54cd\u5e94\u7684 ACI \u610f\u56fe &#8211;&gt;<\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>queries<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>intent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>action<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.core.ACTION_BIND<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>intent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>intent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>action<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.core.ACTION_WAKE<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>intent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>queries<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>application<\/span> <span class=\"token attr-name\">&#8230;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>service<\/span><br \/>\n            <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>.QuroControlledAciService<span class=\"token punctuation\">&#034;<\/span><\/span><br \/>\n            <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>exported<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>true<span class=\"token punctuation\">&#034;<\/span><\/span><br \/>\n            <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>permission<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.permission.CALL<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>   <span class=\"token comment\">&lt;!&#8211; \u7b2c\u4e00\u5c42 Manifest \u9274\u6743&#xff1a;\u5f15\u7528\u63a7\u5236\u7aef\u5b9a\u4e49\u7684\u6743\u9650 &#8211;&gt;<\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>intent-filter<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>action<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.core.ACTION_BIND<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>intent-filter<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>service<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>        <span class=\"token comment\">&lt;!&#8211; stopped-state \u5524\u9192\u63a5\u6536\u5668&#xff08;\u5173\u952e&#xff0c;\u89c1 4.6&#xff09; &#8211;&gt;<\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>receiver<\/span><br \/>\n            <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>.QuroAidlAciWakeReceiver<span class=\"token punctuation\">&#034;<\/span><\/span><br \/>\n            <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>exported<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>true<span class=\"token punctuation\">&#034;<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>intent-filter<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>action<\/span> <span class=\"token attr-name\"><span class=\"token namespace\">android:<\/span>name<\/span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">&#061;<\/span><span class=\"token punctuation\">&#034;<\/span>ai.aci.core.ACTION_WAKE<span class=\"token punctuation\">&#034;<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span><br \/>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>intent-filter<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>receiver<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>application<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>manifest<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>&#x1f511; &lt;queries&gt; \u5fc5\u987b\u5199\u5728\u53d7\u63a7\u7aef\u3002\u5f88\u591a\u300c\u627e\u4e0d\u5230\u670d\u52a1 \/ \u7ed1\u5b9a\u5931\u8d25\u300d\u7684\u6839\u56e0\u662f\u53d7\u63a7\u7aef\u6f0f\u5199 &lt;queries&gt;&#xff0c;\u5bfc\u81f4\u63a7\u5236\u7aef queryIntentServices(ACTION_BIND) \u5728 Android 11&#043; \u4e0a\u8fd4\u56de\u7a7a\u3002<\/p>\n<h4>4.3 \u5b9e\u73b0 Service&#xff08;\u7ee7\u627f BaseACIService&#xff09;<\/h4>\n<p><span class=\"token keyword\">class<\/span> QuroControlledAciService <span class=\"token operator\">:<\/span> <span class=\"token function\">BaseACIService<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token keyword\">override<\/span> <span class=\"token keyword\">fun<\/span> <span class=\"token function\">onCreate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7528 try-catch \u5305 super.onCreate()&#xff0c;\u907f\u514d onCreateCapabilities \u4e2d\u629b\u5f02\u5e38\u76f4\u63a5\u70b8\u6389 Service<\/span><br \/>\n        <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">super<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">onCreate<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span>e<span class=\"token operator\">:<\/span> Throwable<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            Log<span class=\"token punctuation\">.<\/span><span class=\"token function\">e<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;ACI&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;onCreateCapabilities failed&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">override<\/span> <span class=\"token keyword\">fun<\/span> <span class=\"token function\">onCreateCapabilities<\/span><span class=\"token punctuation\">(<\/span>capabilities<span class=\"token operator\">:<\/span> MutableList<span class=\"token operator\">&lt;<\/span>Capability<span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        capabilities<span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            Capability<span class=\"token punctuation\">.<\/span><span class=\"token function\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;browser_open&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u6253\u5f00\u5e76\u5bfc\u822a\u6d4f\u89c8\u5668\u5230\u6307\u5b9a\u7f51\u5740&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">addParam<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;url&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;string&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u8981\u6253\u5f00\u7684\u7f51\u5740&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">addResult<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;opened&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;boolean&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u662f\u5426\u6210\u529f\u6253\u5f00&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">addFlag<\/span><span class=\"token punctuation\">(<\/span>Capability<span class=\"token punctuation\">.<\/span>FLAG_BACKGROUND<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">addFlag<\/span><span class=\"token punctuation\">(<\/span>Capability<span class=\"token punctuation\">.<\/span>FLAG_NO_UI<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\">\/\/ &#8230; \u66f4\u591a\u80fd\u529b<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">override<\/span> <span class=\"token keyword\">fun<\/span> <span class=\"token function\">onCheckPermission<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token operator\">:<\/span> ACIRequest<span class=\"token punctuation\">,<\/span> callerPkg<span class=\"token operator\">:<\/span> String<span class=\"token punctuation\">)<\/span><span class=\"token operator\">:<\/span> Boolean <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4ec5\u653e\u884c\u767d\u540d\u5355\u8c03\u7528\u65b9&#xff08;\u5982 Zorv AI \u4e3b\u5305\u540d\u4e0e\u81ea\u8eab&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> callerPkg <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;com.ai.assistance.quro&#034;<\/span><\/span> <span class=\"token operator\">||<\/span> callerPkg <span class=\"token operator\">&#061;&#061;<\/span> packageName<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">override<\/span> <span class=\"token keyword\">fun<\/span> <span class=\"token function\">onCall<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token operator\">:<\/span> ACIRequest<span class=\"token punctuation\">)<\/span><span class=\"token operator\">:<\/span> ACIResponse <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">when<\/span> <span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">.<\/span>capability<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;browser_open&#034;<\/span><\/span> <span class=\"token operator\">-&gt;<\/span> <span class=\"token function\">handleOpen<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token operator\">-&gt;<\/span> ACIResponse<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span>ACIError<span class=\"token punctuation\">.<\/span>CAPABILITY_NOT_FOUND<span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;unknown capability&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>BaseACIService \u63d0\u4f9b\u7684\u65b9\u6cd5&#xff1a;<\/p>\n<table>\n<tr>\u65b9\u6cd5\u662f\u5426\u5fc5\u91cd\u5199\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>onCreateCapabilities(List&lt;Capability&gt;)<\/td>\n<td>\u2705 \u5fc5\u91cd\u5199<\/td>\n<td>\u6ce8\u518c\u4f60\u7684\u80fd\u529b\u6e05\u5355<\/td>\n<\/tr>\n<tr>\n<td>onCall(ACIRequest): ACIResponse<\/td>\n<td>\u2705 \u5fc5\u91cd\u5199<\/td>\n<td>\u540c\u6b65\u5904\u7406\u5355\u6b21\u8c03\u7528<\/td>\n<\/tr>\n<tr>\n<td>onCallAsync(ACIRequest, IACICallback)<\/td>\n<td>\u53ef\u9009<\/td>\n<td>\u5f02\u6b65\u5904\u7406&#xff1b;\u9ed8\u8ba4\u5b9e\u73b0\u4f1a\u5207\u7ebf\u7a0b\u540e\u8c03 onCall<\/td>\n<\/tr>\n<tr>\n<td>onCheckPermission(ACIRequest, callerPkg): Boolean<\/td>\n<td>\u53ef\u9009<\/td>\n<td>\u81ea\u5b9a\u4e49\u8c03\u7528\u65b9\u6821\u9a8c&#xff0c;\u9ed8\u8ba4\u8fd4\u56de true<\/td>\n<\/tr>\n<tr>\n<td>onBeforeCall(ACIRequest) \/ onAfterCall(ACIRequest, ACIResponse)<\/td>\n<td>\u53ef\u9009<\/td>\n<td>\u94a9\u5b50&#xff0c;\u9ed8\u8ba4\u4ec5\u6253\u65e5\u5fd7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>BaseACIService \u5185\u90e8\u5df2\u5b9e\u73b0 IACIService.Stub&#xff08;call \/ callAsync \/ getCapabilities \/ ping&#xff09;&#xff0c;\u5e76\u5728 onBind() \u8fd4\u56de\u8be5 Binder\u3002<\/p>\n<h4>4.4 \u5b9a\u4e49\u80fd\u529b&#xff1a;Capability.create \u7684\u6b63\u786e\u7b7e\u540d<\/h4>\n<p><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token class-name\">Capability<\/span> <span class=\"token function\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">String<\/span> id<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">String<\/span> description<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u26a0\ufe0f \u7b2c 2 \u4e2a\u53c2\u6570\u662f description&#xff08;\u7ed9 LLM \u7684\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0&#xff09;&#xff0c;\u4e0d\u662f version&#xff01; \u65b9\u6cd5\u5185\u90e8\u56fa\u5b9a version &#061; &#034;1.0&#034;\u3002\u5386\u53f2\u7248\u672c\u66fe\u8bef\u628a &#034;1.0&#034; \u5f53\u4f5c description \u4f20\u5165&#xff0c;\u5bfc\u81f4 LLM \u770b\u4e0d\u5230\u80fd\u529b\u8bf4\u660e\u3001\u63a7\u5236\u7aef\u300c\u80fd\u529b(0)\u300d\u3002 \u6b63\u786e\u5199\u6cd5&#xff1a;Capability.create(&#034;browser_open&#034;, &#034;\u6253\u5f00\u6d4f\u89c8\u5668\u5230\u6307\u5b9a\u7f51\u5740&#034;)\u3002<\/p>\n<p>Capability \u94fe\u5f0f\u6784\u5efa\u65b9\u6cd5&#xff1a;<\/p>\n<table>\n<tr>\u65b9\u6cd5\u4f5c\u7528<\/tr>\n<tbody>\n<tr>\n<td>create(id, description)<\/td>\n<td>\u521b\u5efa\u80fd\u529b&#xff1b;version \u56fa\u5b9a &#034;1.0&#034;<\/td>\n<\/tr>\n<tr>\n<td>addParam(name, type, required, desc)<\/td>\n<td>\u58f0\u660e\u5165\u53c2&#xff08;type: string\/int\/boolean\/double\/byte[]&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>addResult(name, type, desc)<\/td>\n<td>\u58f0\u660e\u51fa\u53c2<\/td>\n<\/tr>\n<tr>\n<td>addFlag(flag)<\/td>\n<td>\u6dfb\u52a0\u884c\u4e3a\u6807\u5fd7&#xff08;\u89c1\u4e0b&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>setPermission(perm)<\/td>\n<td>\u8be5\u80fd\u529b\u989d\u5916\u8981\u6c42\u7684\u6743\u9650\u5b57\u7b26\u4e32<\/td>\n<\/tr>\n<tr>\n<td>setUserConfirm(bool)<\/td>\n<td>\u662f\u5426\u8981\u6c42\u7528\u6237\u786e\u8ba4\u540e\u518d\u6267\u884c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u884c\u4e3a\u6807\u5fd7\u5e38\u91cf&#xff1a;<\/p>\n<table>\n<tr>\u5e38\u91cf\u503c\u542b\u4e49<\/tr>\n<tbody>\n<tr>\n<td>FLAG_BACKGROUND<\/td>\n<td>&#034;BACKGROUND_EXECUTABLE&#034;<\/td>\n<td>\u53ef\u5728\u540e\u53f0\u6267\u884c<\/td>\n<\/tr>\n<tr>\n<td>FLAG_NO_UI<\/td>\n<td>&#034;NO_UI_REQUIRED&#034;<\/td>\n<td>\u6267\u884c\u4e0d\u9700\u8981 UI<\/td>\n<\/tr>\n<tr>\n<td>FLAG_DANGEROUS<\/td>\n<td>&#034;DANGEROUS_ACTION&#034;<\/td>\n<td>\u5371\u9669\u64cd\u4f5c&#xff0c;\u9700\u7528\u6237\u786e\u8ba4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>4.5 \u5904\u7406\u8c03\u7528&#xff1a;ACIRequest \/ ACIResponse<\/h4>\n<p>\u8bf7\u6c42&#xff08;\u63a7\u5236\u7aef\u4f20\u6765\u7684&#xff09;&#xff1a;<\/p>\n<p><span class=\"token keyword\">val<\/span> cap <span class=\"token operator\">&#061;<\/span> request<span class=\"token punctuation\">.<\/span>capability          <span class=\"token comment\">\/\/ \u80fd\u529b id&#xff0c;\u5982 &#034;browser_open&#034;<\/span><br \/>\n<span class=\"token keyword\">val<\/span> caller <span class=\"token operator\">&#061;<\/span> request<span class=\"token punctuation\">.<\/span>callerPkg        <span class=\"token comment\">\/\/ \u8c03\u7528\u65b9\u5305\u540d<\/span><br \/>\n<span class=\"token keyword\">val<\/span> url <span class=\"token operator\">&#061;<\/span> request<span class=\"token punctuation\">.<\/span>params<span class=\"token punctuation\">.<\/span><span class=\"token function\">getString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;url&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span>   <span class=\"token comment\">\/\/ \u5165\u53c2&#xff08;Bundle&#xff09;<\/span><br \/>\n<span class=\"token keyword\">val<\/span> callId <span class=\"token operator\">&#061;<\/span> request<span class=\"token punctuation\">.<\/span>callId           <span class=\"token comment\">\/\/ UUID&#xff0c;\u7528\u4e8e\u5f02\u6b65\u56de\u8c03\u5bf9\u5e94<\/span><\/p>\n<p>\u54cd\u5e94&#xff08;\u4f60\u8fd4\u56de\u7684&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ \u6210\u529f&#xff08;\u65e0\u6570\u636e&#xff09;<\/span><br \/>\nACIResponse<span class=\"token punctuation\">.<\/span><span class=\"token function\">success<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6210\u529f&#xff08;\u5e26\u7ed3\u679c&#xff09;<\/span><br \/>\nACIResponse<span class=\"token punctuation\">.<\/span><span class=\"token function\">success<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">putResult<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;opened&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5931\u8d25<\/span><br \/>\nACIResponse<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span>ACIError<span class=\"token punctuation\">.<\/span>PERMISSION_DENIED<span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;caller not allowed&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\nACIResponse<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span>ACIError<span class=\"token punctuation\">.<\/span>BAD_REQUEST<span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;missing param: url&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>ACIResponse \u5b57\u6bb5&#xff1a;success(Boolean) \/ result(Bundle) \/ errorCode(Int) \/ errorMessage(String) \/ callId(String)\u3002<\/p>\n<h4>4.6 stopped-state \u5524\u9192&#xff08;\u5173\u952e&#xff01;&#xff09;<\/h4>\n<p>\u5728 ColorOS \/ Android 11&#043; \u4e0a&#xff0c;\u53d7\u63a7\u7aef\u82e5\u5904\u4e8e stopped \u72b6\u6001&#xff0c;\u63a7\u5236\u7aef\u88f8 bindService \u62c9\u4e0d\u8d77\u8fdb\u7a0b&#xff0c;\u8868\u73b0\u4e3a\u300c\u53d1\u73b0\/\u7ed1\u5b9a\u6210\u529f\u4f46 getCapabilities \u8fd4\u56de\u7a7a\u6216\u8c03\u7528\u65e0\u54cd\u5e94\u300d\u3002<\/p>\n<p>\u4fee\u590d\u65b9\u5f0f&#xff1a;\u53d7\u63a7\u7aef\u63d0\u4f9b WakeReceiver&#xff0c;\u63a7\u5236\u7aef\u5728 bindService \u524d\u5148\u53d1 ACTION_WAKE \u5e7f\u64ad&#xff08;\u5e26 FLAG_INCLUDE_STOPPED_PACKAGES&#xff09;\u628a\u8fdb\u7a0b\u62c9\u8d77\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> QuroAidlAciWakeReceiver <span class=\"token operator\">:<\/span> <span class=\"token function\">BroadcastReceiver<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">override<\/span> <span class=\"token keyword\">fun<\/span> <span class=\"token function\">onReceive<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token operator\">:<\/span> Context<span class=\"token punctuation\">,<\/span> intent<span class=\"token operator\">:<\/span> Intent<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>intent<span class=\"token punctuation\">.<\/span>action <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;ai.aci.core.ACTION_WAKE&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">val<\/span> launch <span class=\"token operator\">&#061;<\/span> context<span class=\"token punctuation\">.<\/span>packageManager<br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">getLaunchIntentForPackage<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">.<\/span>packageName<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token operator\">?<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">addFlags<\/span><span class=\"token punctuation\">(<\/span>Intent<span class=\"token punctuation\">.<\/span>FLAG_ACTIVITY_NEW_TASK<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>launch <span class=\"token operator\">!&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span> context<span class=\"token punctuation\">.<\/span><span class=\"token function\">startActivity<\/span><span class=\"token punctuation\">(<\/span>launch<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u63a7\u5236\u7aef&#xff08;QuroAidlAciManager.bindWithWake()&#xff09;\u5df2\u5185\u7f6e\u8be5\u903b\u8f91&#xff1a;\u5148\u53d1\u5524\u9192\u5e7f\u64ad&#xff0c;\u518d bindService(BIND_AUTO_CREATE)\u3002<\/p>\n<p>&#x1f511; \u8fd9\u662f\u300cZorv AI \u4e4b\u524d\u80fd\u7ed1\u5b9a\u3001\u67d0\u6b21\u66f4\u65b0\u540e\u4e0d\u884c\u300d\u7684\u771f\u5b9e\u6839\u56e0\u2014\u2014\u4fee\u590d\u70b9\u5728\u63a7\u5236\u7aef\u7684\u7ed1\u5b9a\u903b\u8f91&#xff0c;\u800c\u975e\u53d7\u63a7\u7aef\u80fd\u529b\u6ce8\u518c\u3002<\/p>\n<hr \/>\n<h3>5. \u8bf7\u6c42\u4e0e\u54cd\u5e94\u6a21\u578b<\/h3>\n<p>ACIRequest&#xff08;Parcelable&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u5b57\u6bb5\u7c7b\u578b\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>capability<\/td>\n<td>String<\/td>\n<td>\u80fd\u529b id<\/td>\n<\/tr>\n<tr>\n<td>version<\/td>\n<td>Bundle<\/td>\n<td>\u7ea6\u5b9a\u7248\u672c&#xff08;\u9ed8\u8ba4 1.0&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>params<\/td>\n<td>Bundle<\/td>\n<td>\u8c03\u7528\u5165\u53c2<\/td>\n<\/tr>\n<tr>\n<td>callId<\/td>\n<td>UUID<\/td>\n<td>\u8c03\u7528\u552f\u4e00\u6807\u8bc6<\/td>\n<\/tr>\n<tr>\n<td>callerPkg<\/td>\n<td>String<\/td>\n<td>\u8c03\u7528\u65b9\u5305\u540d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>ACIRequest.Builder \u652f\u6301 param(String\/int\/boolean\/double\/byte[])\u3001version(&#8230;)\u3001build()\u3002<\/p>\n<p>ACIResponse&#xff08;\u89c1 4.5&#xff09;\u3002<\/p>\n<hr \/>\n<h3>6. \u6743\u9650\u6a21\u578b&#xff08;5 \u5c42&#xff09;<\/h3>\n<p>ACI \u91c7\u7528\u7eb5\u6df1\u9632\u5fa1&#xff0c;\u8c03\u7528\u9700\u4f9d\u6b21\u901a\u8fc7&#xff1a;<\/p>\n<li>Android Manifest \u6743\u9650&#xff08;\u7b2c\u4e00\u5c42&#xff09;&#xff1a;\u53d7\u63a7\u7aef Service \u4e0a\u7684 android:permission&#061;&#034;ai.aci.permission.CALL&#034; \u662f\u5f15\u7528\u63a7\u5236\u7aef ZorvAI \u5df2\u5b9a\u4e49\u7684\u6743\u9650&#xff0c;\u4f5c\u4e3a\u7b2c\u4e00\u5c42 Manifest \u9274\u6743&#xff1b;\u6743\u9650\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef&#xff0c;\u53d7\u63a7\u7aef\u53ea\u7528 &lt;uses-permission&gt; \u5f15\u7528&#xff0c;\u7edd\u4e0d\u81ea\u884c &lt;permission&gt; \u5b9a\u4e49&#xff08;\u5426\u5219\u540c\u540d\u5f02\u7b7e\u540d\u51b2\u7a81&#xff0c;\u89c1 \u00a716&#xff09;\u3002\u8c03\u7528\u65b9&#xff08;\u63a7\u5236\u7aef&#xff09;\u987b\u58f0\u660e &lt;uses-permission android:name&#061;&#034;ai.aci.permission.CALL&#034; \/&gt;\u3002<\/li>\n<li>Binder UID \u6821\u9a8c&#xff1a;\u53d7\u63a7\u7aef\u53ef\u901a\u8fc7 Binder.getCallingUid() \u6821\u9a8c\u8c03\u7528\u65b9\u8eab\u4efd\u3002<\/li>\n<li>onCheckPermission(request, callerPkg)&#xff1a;\u53d7\u63a7\u7aef\u81ea\u5b9a\u4e49\u4e1a\u52a1\u7ea7\u767d\u540d\u5355\u3002<\/li>\n<li>\u80fd\u529b\u7ea7 requirePermission&#xff1a;\u5355\u4e2a\u80fd\u529b\u53ef\u8981\u6c42\u989d\u5916\u6743\u9650&#xff08;setPermission&#xff09;\u3002<\/li>\n<li>\u7528\u6237\u786e\u8ba4&#xff1a;\u5371\u9669\u80fd\u529b&#xff08;setUserConfirm(true) \/ FLAG_DANGEROUS&#xff09;\u9700\u7528\u6237\u663e\u5f0f\u786e\u8ba4\u3002<\/li>\n<p>\u9884\u5b9a\u4e49\u6743\u9650&#xff08;aci_permissions.xml&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u6743\u9650\u7ea7\u522b\u7528\u9014<\/tr>\n<tbody>\n<tr>\n<td>ai.aci.permission.CALL<\/td>\n<td>normal<\/td>\n<td>\u5e38\u89c4\u8c03\u7528<\/td>\n<\/tr>\n<tr>\n<td>ai.aci.permission.CALL_DANGEROUS<\/td>\n<td>dangerous<\/td>\n<td>\u5371\u9669\u64cd\u4f5c\u8c03\u7528<\/td>\n<\/tr>\n<tr>\n<td>ai.aci.permission.DISCOVER<\/td>\n<td>normal<\/td>\n<td>\u670d\u52a1\u53d1\u73b0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>7. \u63a7\u5236\u7aef\u8c03\u7528&#xff08;\u53d1\u73b0\u4e0e\u7ed1\u5b9a&#xff09;<\/h3>\n<p>\u63a7\u5236\u7aef\u6d41\u7a0b&#xff08;\u4ee5 QuroAidlAciManager \u4e3a\u53c2\u8003&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ 1. \u53d1\u73b0&#xff1a;\u626b\u63cf\u58f0\u660e\u4e86 ACTION_BIND \u7684\u53d7\u63a7\u7aef<\/span><br \/>\n<span class=\"token keyword\">val<\/span> q <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Intent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;ai.aci.core.ACTION_BIND&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">val<\/span> resolved <span class=\"token operator\">&#061;<\/span> context<span class=\"token punctuation\">.<\/span>packageManager<span class=\"token punctuation\">.<\/span><span class=\"token function\">queryIntentServices<\/span><span class=\"token punctuation\">(<\/span>q<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ 2. \u7ed1\u5b9a&#xff08;\u542b\u5524\u9192 stopped \u8fdb\u7a0b&#xff09;<\/span><br \/>\n<span class=\"token keyword\">val<\/span> intent <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">Intent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;ai.aci.core.ACTION_BIND&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">setClassName<\/span><span class=\"token punctuation\">(<\/span>pkg<span class=\"token punctuation\">,<\/span> svcClass<span class=\"token punctuation\">)<\/span><br \/>\ncontext<span class=\"token punctuation\">.<\/span><span class=\"token function\">bindService<\/span><span class=\"token punctuation\">(<\/span>intent<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">,<\/span> Context<span class=\"token punctuation\">.<\/span>BIND_AUTO_CREATE<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ 3. \u53d6\u80fd\u529b\u6e05\u5355<\/span><br \/>\n<span class=\"token keyword\">val<\/span> caps<span class=\"token operator\">:<\/span> Array<span class=\"token operator\">&lt;<\/span>String<span class=\"token operator\">&gt;<\/span> <span class=\"token operator\">&#061;<\/span> stub<span class=\"token punctuation\">.<\/span><span class=\"token function\">getCapabilities<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ 4. \u53d1\u8d77\u540c\u6b65\u8c03\u7528<\/span><br \/>\n<span class=\"token keyword\">val<\/span> req <span class=\"token operator\">&#061;<\/span> ACIRequest<span class=\"token punctuation\">.<\/span><span class=\"token function\">Builder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">capability<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;browser_open&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">param<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;url&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;https:\/\/example.com&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">val<\/span> resp<span class=\"token operator\">:<\/span> ACIResponse <span class=\"token operator\">&#061;<\/span> stub<span class=\"token punctuation\">.<\/span><span class=\"token function\">call<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">)<\/span><\/p>\n<hr \/>\n<h3>8. \u5f02\u6b65\u8c03\u7528<\/h3>\n<p>\u53d7\u63a7\u7aef\u91cd\u5199 onCallAsync(request, callback) \u65f6&#xff0c;\u901a\u8fc7 IACICallback \u56de\u4f20\u8fdb\u5ea6\u4e0e\u7ed3\u679c&#xff1a;<\/p>\n<p><span class=\"token keyword\">override<\/span> <span class=\"token keyword\">fun<\/span> <span class=\"token function\">onCallAsync<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token operator\">:<\/span> ACIRequest<span class=\"token punctuation\">,<\/span> callback<span class=\"token operator\">:<\/span> IACICallback<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    thread <span class=\"token punctuation\">{<\/span><br \/>\n        callback<span class=\"token punctuation\">.<\/span><span class=\"token function\">onProgress<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;processing&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">val<\/span> resp <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">doWork<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><br \/>\n        callback<span class=\"token punctuation\">.<\/span><span class=\"token function\">onResult<\/span><span class=\"token punctuation\">(<\/span>resp<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>IACICallback.aidl&#xff1a;onResult(ACIResponse) \/ onProgress(int, String)\u3002<\/p>\n<hr \/>\n<h3>9. \u9519\u8bef\u7801&#xff08;ACIError&#xff09;<\/h3>\n<table>\n<tr>\u5e38\u91cf\u503c\u542b\u4e49<\/tr>\n<tbody>\n<tr>\n<td>SUCCESS<\/td>\n<td>0<\/td>\n<td>\u6210\u529f<\/td>\n<\/tr>\n<tr>\n<td>REQUEST_NULL<\/td>\n<td>-1<\/td>\n<td>\u8bf7\u6c42\u4e3a\u7a7a<\/td>\n<\/tr>\n<tr>\n<td>BAD_REQUEST<\/td>\n<td>400<\/td>\n<td>\u53c2\u6570\u9519\u8bef<\/td>\n<\/tr>\n<tr>\n<td>PERMISSION_DENIED<\/td>\n<td>403<\/td>\n<td>\u6743\u9650\u4e0d\u8db3<\/td>\n<\/tr>\n<tr>\n<td>CAPABILITY_NOT_FOUND<\/td>\n<td>404<\/td>\n<td>\u80fd\u529b\u4e0d\u5b58\u5728<\/td>\n<\/tr>\n<tr>\n<td>INTERNAL_ERROR<\/td>\n<td>500<\/td>\n<td>\u5185\u90e8\u9519\u8bef<\/td>\n<\/tr>\n<tr>\n<td>SERVICE_UNAVAILABLE<\/td>\n<td>503<\/td>\n<td>\u670d\u52a1\u4e0d\u53ef\u7528<\/td>\n<\/tr>\n<tr>\n<td>TIMEOUT<\/td>\n<td>504<\/td>\n<td>\u8d85\u65f6<\/td>\n<\/tr>\n<tr>\n<td>BINDER_DIED<\/td>\n<td>505<\/td>\n<td>Binder \u8fde\u63a5\u65ad\u5f00<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>getCapabilities() \u8fd4\u56de\u7a7a\u6570\u7ec4 \u4e0d\u7b49\u4e8e \u8c03\u7528\u5931\u8d25\u2014\u2014\u5e38\u89c1\u539f\u56e0\u662f\u53d7\u63a7\u7aef\u6f0f\u5199 &lt;queries&gt; \u6216 onCreateCapabilities \u629b\u5f02\u5e38&#xff08;\u52a1\u5fc5\u7528 try-catch \u5305\u88f9 super.onCreate()&#xff0c;\u89c1 4.3&#xff09;\u3002<\/p>\n<hr \/>\n<h3>10. \u53d1\u5e03\u6e05\u5355\u914d\u7f6e\u8981\u70b9&#xff08;\u5305\u53ef\u89c1\u6027&#xff09;<\/h3>\n<ul>\n<li>\u53d7\u63a7\u7aef&#xff1a;\u5fc5\u987b\u5199 &lt;queries&gt;&#xff08;ACTION_BIND &#043; ACTION_WAKE&#xff09;&#xff0c;\u5426\u5219 Android 11&#043; \u63a7\u5236\u7aef\u53d1\u73b0\u4e0d\u5230\u3002<\/li>\n<li>\u63a7\u5236\u7aef&#xff1a;\u82e5\u9700\u53d1\u73b0\u4efb\u610f\u53d7\u63a7\u7aef&#xff0c;\u4e5f\u8981\u5728\u81ea\u8eab &lt;queries&gt; \u58f0\u660e ACTION_BIND&#xff08;\u672c\u9879\u76ee QuroAidlAciManager \u5df2\u5904\u7406&#xff09;\u3002<\/li>\n<li>\u6743\u9650&#xff1a;\u53d7\u63a7\u7aef\u4e0d\u8981\u5b9a\u4e49 ai.aci.permission.*&#xff0c;\u53ea\u58f0\u660e &lt;uses-permission&gt; \u5f15\u7528\u63a7\u5236\u7aef\u5df2\u5b9a\u4e49\u7684\u6743\u9650&#xff08;\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef ZorvAI&#xff09;&#xff1b;\u82e5 aci-core \u5e93\u5e26\u5165 &lt;permission&gt;&#xff0c;\u7528 tools:node&#061;&#034;remove&#034; \u5265\u9664\u3002\u4e8c\u8005\u6743\u9650\u540d\u5fc5\u987b\u4e00\u81f4&#xff08;\u53d7\u63a7\u7aef\u5f15\u7528\u7684\u662f\u63a7\u5236\u7aef\u5b9a\u4e49\u7684\u540c\u540d\u6743\u9650&#xff09;\u3002\u8be6\u89c1 \u00a716\u3002<\/li>\n<\/ul>\n<hr \/>\n<h3>11. \u771f\u5b9e\u8e29\u5751\u4e0e\u6700\u4f73\u5b9e\u8df5<\/h3>\n<table>\n<tr>\u5751\u73b0\u8c61\u4fee\u590d<\/tr>\n<tbody>\n<tr>\n<td>Capability.create(id, &#034;1.0&#034;)<\/td>\n<td>LLM \u770b\u4e0d\u5230\u80fd\u529b\u63cf\u8ff0&#xff0c;\u63a7\u5236\u7aef\u300c\u80fd\u529b(0)\u300d<\/td>\n<td>\u7b2c 2 \u53c2\u4f20\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0&#xff0c;\u4e0d\u662f\u7248\u672c\u53f7<\/td>\n<\/tr>\n<tr>\n<td>\u6f0f\u5199 &lt;queries&gt;<\/td>\n<td>\u53d1\u73b0\u4e3a\u7a7a \/ \u7ed1\u5b9a\u5931\u8d25&#xff08;Android 11&#043;&#xff09;<\/td>\n<td>\u53d7\u63a7\u7aef Manifest \u8865 &lt;queries&gt;<\/td>\n<\/tr>\n<tr>\n<td>onCreateCapabilities \u629b\u5f02\u5e38<\/td>\n<td>Service \u542f\u52a8\u5373\u5d29\u6e83\u3001\u65e0\u80fd\u529b<\/td>\n<td>onCreate() \u7528 try-catch \u5305 super.onCreate()<\/td>\n<\/tr>\n<tr>\n<td>stopped-state \u4e0d\u5524\u9192<\/td>\n<td>\u4e4b\u524d\u80fd\u7ed1\u3001\u66f4\u65b0\u540e\u4e0d\u80fd<\/td>\n<td>\u63a7\u5236\u7aef bindWithWake&#xff08;\u5148\u53d1 ACTION_WAKE \u5e7f\u64ad&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u53d7\u63a7\u7aef\u5b9a\u4e49 ai.aci.permission.*<\/td>\n<td>INSTALL_FAILED_CONFLICTING_PERMISSION \/ \u540c\u540d\u5f02\u7b7e\u540d\u51b2\u7a81<\/td>\n<td>\u53d7\u63a7\u7aef\u4e0d\u8981\u5b9a\u4e49&#xff0c;\u53ea uses-permission \u5f15\u7528&#xff1b;\u5e93\u5e26\u5165\u7684\u7528 tools:node&#061;&#034;remove&#034; \u5265\u9664&#xff08;\u89c1 \u00a716&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_read \u76f4\u63a5\u4f20\u5b8c\u6574\u5927 HTML<\/td>\n<td>TransactionTooLargeException&#xff0c;\u8c03\u7528\u5931\u8d25<\/td>\n<td>\u622a\u65ad \u226415 \u4e07\u5b57\u7b26 &#043; \u5927\u9875\u9762 gzip(byte[]) \u7ecf html_gz \u56de\u4f20&#xff0c;\u63a7\u5236\u7aef\u89e3\u538b\u8fd8\u539f&#xff08;\u89c1 \u00a713.3&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>12. \u534f\u8bae\u7248\u672c\u4e0e\u517c\u5bb9<\/h3>\n<table>\n<tr>\u534f\u8bae\u7248\u672cminSdk\u5173\u952e\u80fd\u529b<\/tr>\n<tbody>\n<tr>\n<td>1.0<\/td>\n<td>API 24<\/td>\n<td>\u540c\u6b65 call \/ getCapabilities \/ ping<\/td>\n<\/tr>\n<tr>\n<td>1.1<\/td>\n<td>API 26<\/td>\n<td>\u5f02\u6b65 callAsync &#043; IACICallback<\/td>\n<\/tr>\n<tr>\n<td>2.0&#xff08;\u89c4\u5212&#xff09;<\/td>\n<td>\u2014<\/td>\n<td>LocalSocket \u9ad8\u901f\u901a\u9053<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>aci-core v1.0.x \u540c\u65f6\u5b9e\u73b0 1.0 &#043; 1.1&#xff08;call \u4e0e callAsync \u5747\u53ef\u7528&#xff09;&#xff0c;Capability.version \u56fa\u5b9a\u4e3a &#034;1.0&#034;\u3002<\/p>\n<hr \/>\n<h3>13. \u5b98\u65b9\u53d7\u63a7\u7aef\u80fd\u529b\u6e05\u5355&#xff08;ZorvAI \u6d4f\u89c8\u5668&#xff09;<\/h3>\n<p>ZorvAI \u6d4f\u89c8\u5668&#xff08;\u53d7\u63a7\u7aef&#xff0c;\u4e0e\u4e3b\u7a0b\u5e8f\u540c\u6e90&#xff09;\u4f5c\u4e3a\u5b98\u65b9\u53c2\u8003\u5b9e\u73b0&#xff0c;\u5df2\u5411\u63a7\u5236\u7aef\u66b4\u9732\u4ee5\u4e0b 32 \u4e2a\u80fd\u529b&#xff08;13 \u57fa\u7840 &#043; 7 agentic &#043; 2 \u8d44\u6e90\/\u5206\u4eab &#043; 6 \u5b8c\u6574\u65b9\u6848 &#043; 1 \u865a\u62df\u9f20\u6807 &#043; 1 HTTP \u4f20\u8f93 &#043; 2 \u8bed\u4e49\u70b9\u51fb&#xff09;\u3002<\/p>\n<p>\u63a7\u5236\u7aef QuroAidlAciManager \u4f1a\u628a\u5b83\u4eec\u5582\u7ed9 LLM&#xff0c;\u7531 LLM \u81ea\u52a8\u51b3\u5b9a\u8c03\u7528\u54ea\u4e2a\u3001\u4f20\u4ec0\u4e48\u53c2\u6570\u2014\u2014\u63a7\u5236\u7aef\u534f\u8bae\u96f6\u6539\u52a8&#xff0c;\u65b0\u589e\u80fd\u529b\u5bf9 LLM \u5b8c\u5168\u900f\u660e\u3002<\/p>\n<h4>13.1 \u80fd\u529b\u603b\u89c8&#xff08;\u5171 32 \u9879&#xff09;<\/h4>\n<p>\u57fa\u7840\u80fd\u529b&#xff08;13&#xff09;<\/p>\n<table>\n<tr>\u80fd\u529b id\u5165\u53c2\u51fa\u53c2\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>browser_open<\/td>\n<td>url(string, \u5fc5\u586b) \/ title(string, \u53ef\u9009)<\/td>\n<td>launched(boolean) &#043; ready(boolean) &#043; url(string)<\/td>\n<td>\u6253\u5f00\u5e76\u5bfc\u822a\u5230\u6307\u5b9a\u7f51\u5740&#xff1b;v1.0.12 \u56de\u5f52\u4fee\u590d&#xff1a;\u5148\u767b\u8bb0\u591a\u6807\u7b7e\u3001\u518d\u542f\u52a8 Activity\u3001\u7b49\u5f85 WebView \u6ce8\u518c\u4e0e\u9875\u9762 onPageFinished \u5b8c\u6210\u624d\u8fd4\u56de ready&#xff08;\u7ea6 15s \u4e0a\u9650&#xff0c;\u4e0d\u5361\u6b7b binder&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_read<\/td>\n<td>mode(string, \u53ef\u9009&#xff1a;full \u9ed8\u8ba4 \/ clean)<\/td>\n<td>url \/ title \/ html(string) &#043; truncated(boolean)&#xff1b;\u5927\u9875\u9762\u989d\u5916 html_gz(byte[]) &#043; html_len(int)&#xff1b;mode&#061;clean \u989d\u5916\u8fd4\u56de cleaned_html(\u7cbe\u7b80 DOM&#xff1a;\u53bb\u811a\u672c\u6837\u5f0f\u3001\u53ef\u4ea4\u4e92\u5143\u7d20\u6253 data-ai-id\u3001\u6807\u89c6\u53e3)<\/td>\n<td>\u8bfb\u53d6\u5f53\u524d\u9875 HTML\u3002v1.0.8 \u4fee\u590d Binder ~1MB \u6ea2\u51fa&#xff08;\u89c1 13.3&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_crawl<\/td>\n<td>\u2014<\/td>\n<td>url \/ title \/ text \/ links(string) &#043; link_count(string) &#043; truncated(boolean)<\/td>\n<td>\u6293\u53d6\u7ed3\u6784\u5316\u6b63\u6587&#xff08;\u53d6 article\/main\/body \u7684 innerText&#xff09;&#043; \u51fa\u7ad9\u94fe\u63a5 [{text,href}]<\/td>\n<\/tr>\n<tr>\n<td>browser_search<\/td>\n<td>query(string, \u5fc5\u586b) \/ engine(string, \u53ef\u9009&#xff1a;bing\/google\/baidu\/ddg&#xff0c;\u9ed8\u8ba4 bing)<\/td>\n<td>query \/ engine \/ url \/ title \/ text \/ links(string) &#043; truncated(boolean)<\/td>\n<td>\u7528\u641c\u7d22\u5f15\u64ce\u68c0\u7d22\u5173\u952e\u8bcd&#xff0c;\u8fd4\u56de\u7ed3\u679c\u9875\u7ed3\u6784\u5316\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>browser_script<\/td>\n<td>code(string, \u5fc5\u586b)<\/td>\n<td>result(string) &#043; truncated(boolean)<\/td>\n<td>\u5728\u5f53\u524d\u9875\u9762\u6267\u884c\u4efb\u610f JavaScript \u5e76\u8fd4\u56de\u7ed3\u679c&#xff08;\u6838\u5fc3\u80fd\u529b&#xff0c;\u7b49\u4ef7\u4e8e\u7ed9 AI \u4e00\u4e2a\u5b8c\u6574\u6d4f\u89c8\u5668\u63a7\u5236\u53f0&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_list<\/td>\n<td>\u2014<\/td>\n<td>tabs(string)<\/td>\n<td>\u5217\u51fa\u5f53\u524d\u6253\u5f00\u7684\u6d4f\u89c8\u5668\u6807\u7b7e\u9875<\/td>\n<\/tr>\n<tr>\n<td>browser_info<\/td>\n<td>\u2014<\/td>\n<td>package \/ versionName \/ versionCode(string)<\/td>\n<td>\u67e5\u8be2\u53d7\u63a7\u7aef\u5305\u540d\u4e0e\u7248\u672c\u4fe1\u606f<\/td>\n<\/tr>\n<tr>\n<td>browser_find<\/td>\n<td>text(string, \u5fc5\u586b)<\/td>\n<td>count(int)<\/td>\n<td>\u9875\u9762\u5185\u67e5\u627e\u6587\u672c\u5e76\u9ad8\u4eae&#xff0c;\u8fd4\u56de\u547d\u4e2d\u6570<\/td>\n<\/tr>\n<tr>\n<td>browser_nav<\/td>\n<td>action(string, \u5fc5\u586b&#xff1a;back \/ forward \/ reload)<\/td>\n<td>ok(boolean)<\/td>\n<td>\u5bfc\u822a\u63a7\u5236&#xff08;WebView \u64cd\u4f5c\u5df2\u4e3b\u7ebf\u7a0b\u5b89\u5168\u5c01\u88c5&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_screenshot<\/td>\n<td>\u2014<\/td>\n<td>path(string)<\/td>\n<td>\u622a\u5f53\u524d\u53ef\u89c6\u533a\u57df\u5b58 PNG&#xff0c;\u8fd4\u56de\u6587\u4ef6\u8def\u5f84&#xff08;\u65e0\u9700\u5b58\u50a8\u6743\u9650&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_capture<\/td>\n<td>action(string, \u5fc5\u586b&#xff1a;list \/ clear \/ enable \/ disable)<\/td>\n<td>requests(string)<\/td>\n<td>\u6293\u5305&#xff1a;\u8bf7\u6c42\u4fa7\u62e6\u622a&#xff0c;\u8fd4\u56de\u8bf7\u6c42 URL\/\u65b9\u6cd5\/\u8bf7\u6c42\u5934\/\u662f\u5426\u4e3b\u6846\u67b6<\/td>\n<\/tr>\n<tr>\n<td>console_ui<\/td>\n<td>\u2014<\/td>\n<td>snapshot(string, JSON)<\/td>\n<td>\u8fd4\u56de\u63a7\u5236\u53f0 SDUI \u5feb\u7167&#xff08;\u7ec4\u4ef6 JSON&#xff09;&#xff0c;\u4f9b\u63a7\u5236\u7aef\u901a\u7528\u6e32\u67d3&#xff0c;\u4e0e\u624b\u52a8\u63a7\u5236\u53f0\u5171\u7528\u540c\u4e00 ConsoleBackend<\/td>\n<\/tr>\n<tr>\n<td>console_action<\/td>\n<td>action(string, \u5fc5\u586b) \/ payload(string, \u53ef\u9009 JSON)<\/td>\n<td>ok(boolean) &#043; action(string)<\/td>\n<td>\u6267\u884c\u63a7\u5236\u53f0\u52a8\u4f5c&#xff08;\u70b9\u51fb \/ JS \/ \u5bfc\u822a\u7b49&#xff09;&#xff0c;\u4e0e\u624b\u52a8\u63a7\u5236\u53f0\u5355\u4e00\u4e8b\u5b9e\u6e90<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>agentic \u589e\u5f3a&#xff08;7 \u00b7 \u5143\u7d20\u7ea7\u64cd\u63a7 &#043; \u72b6\u6001\/\u4e8b\u4ef6\/\u5ba1\u8ba1&#xff09;<\/p>\n<table>\n<tr>\u80fd\u529b id\u5165\u53c2\u51fa\u53c2\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>browser_elements<\/td>\n<td>\u2014<\/td>\n<td>count(int) &#043; elements(string JSON)<\/td>\n<td>\u626b\u63cf\u53ef\u4ea4\u4e92\u5143\u7d20&#xff0c;\u81ea\u52a8\u6807\u6ce8\u7a33\u5b9a ID&#xff08;data-aci-eid&#xff09;&#xff0c;\u8fd4\u56de\u5143\u7d20\u6811&#xff1a;id\/\u6807\u7b7e\/\u7c7b\u578b\/\u6587\u672c\/\u503c\/\u94fe\u63a5\/\u4f4d\u7f6e(x,y,w,h)\/\u53ef\u89c1\u6027<\/td>\n<\/tr>\n<tr>\n<td>browser_action<\/td>\n<td>id(string, \u5fc5\u586b) \/ op(string, \u5fc5\u586b&#xff1a;click\/type\/scroll_to\/select) \/ arg(string, \u53ef\u9009)<\/td>\n<td>ok(boolean) &#043; op<\/td>\n<td>\u6309\u5143\u7d20\u7a33\u5b9a ID \u6267\u884c\u64cd\u4f5c&#xff08;type \u517c\u5bb9 React\/Vue \u53d7\u63a7\u8f93\u5165&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_wait<\/td>\n<td>cond(string, \u5fc5\u586b&#xff1a;visible\/hidden\/text_contains\/network_idle) \/ id(string, \u53ef\u9009) \/ arg(string, \u53ef\u9009) \/ timeout_ms(int, \u53ef\u9009)<\/td>\n<td>ok(boolean) &#043; cond &#043; waited_ms<\/td>\n<td>\u6761\u4ef6\u7b49\u5f85\u5f15\u64ce&#xff08;network_idle \u81ea\u52a8\u6253\u6869 XHR\/fetch \u8ba1\u6570\u5224\u5b9a SPA \u52a0\u8f7d\u5b8c\u6210&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_snapshot<\/td>\n<td>action(string, \u5fc5\u586b&#xff1a;save\/list) \/ label(string, \u53ef\u9009)<\/td>\n<td>id(string) \u6216 list(string)<\/td>\n<td>\u9875\u9762\u72b6\u6001\u5feb\u7167&#xff08;save \u6309 label \u8986\u76d6 \/ list \u5217\u51fa&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_restore<\/td>\n<td>id(string, \u5fc5\u586b)<\/td>\n<td>ok(boolean)<\/td>\n<td>\u9875\u9762\u72b6\u6001\u56de\u6eda&#xff1a;\u5bfc\u822a\u56de\u6307\u5b9a\u5feb\u7167\u8bb0\u5f55\u7684 URL<\/td>\n<\/tr>\n<tr>\n<td>browser_events<\/td>\n<td>limit(int, \u53ef\u9009)<\/td>\n<td>events(string JSON)<\/td>\n<td>\u9875\u9762\u4e8b\u4ef6\u603b\u7ebf&#xff1a;page_started \/ page_finished \/ request \/ load_resource<\/td>\n<\/tr>\n<tr>\n<td>browser_audit<\/td>\n<td>limit(int, \u53ef\u9009)<\/td>\n<td>audit(string JSON)<\/td>\n<td>ACI \u8c03\u7528\u5ba1\u8ba1&#xff1a;\u6bcf\u6b21\u5916\u90e8\u8c03\u7528&#xff08;\u80fd\u529b\/\u53c2\u6570\/\u6210\u8d25&#xff09;\u4e00\u6761\u8bb0\u5f55<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7b2c\u4e8c\u6ce2\u589e\u5f3a&#xff08;2 \u00b7 \u8d44\u6e90\u56de\u4f20 &#043; \u5206\u4eab&#xff09;<\/p>\n<table>\n<tr>\u80fd\u529b id\u5165\u53c2\u51fa\u53c2\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>browser_media<\/td>\n<td>\u2014<\/td>\n<td>count(int) &#043; resources(string JSON)<\/td>\n<td>\u626b\u63cf\u5f53\u524d\u9875 video\/audio\/source\/a[download]\/img&#xff0c;\u8fd4\u56de\u7edd\u5bf9\u76f4\u94fe &#043; \u7c7b\u578b &#043; \u6587\u672c&#xff1b;video\/audio \u989d\u5916\u542b current_time\/duration\/paused\/poster&#xff1b;a[download] \u542b download\u3002\u63a7\u5236\u65b9\u53ef\u76f4\u63a5\u62ff\u76f4\u94fe\u64ad\u653e\u6216\u4e0b\u8f7d<\/td>\n<\/tr>\n<tr>\n<td>browser_share<\/td>\n<td>type(string, \u5fc5\u586b&#xff1a;page\/text) \/ text(string, \u53ef\u9009)<\/td>\n<td>launched(boolean) &#043; type<\/td>\n<td>\u8c03\u8d77\u7cfb\u7edf\u5206\u4eab\u9762\u677f&#xff1a;page \u5206\u4eab\u5f53\u524d\u9875 URL \/ text \u5206\u4eab\u81ea\u5b9a\u4e49\u6587\u672c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7b2c\u4e09\u6ce2\u589e\u5f3a&#xff08;6 \u00b7 \u5b8c\u6574\u65b9\u6848&#xff1a;\u63a7\u5236\u53f0\u6355\u83b7 &#043; \u9009\u62e9\u5668\u64cd\u63a7 &#043; \u8f7b\u91cf\u591a\u6807\u7b7e&#xff09;<\/p>\n<table>\n<tr>\u80fd\u529b id\u5165\u53c2\u51fa\u53c2\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>browser_console<\/td>\n<td>action(string, \u53ef\u9009&#xff1a;list \u9ed8\u8ba4\/clear\/enable\/disable) \/ limit(int, \u53ef\u9009) \/ filter(string, \u53ef\u9009)<\/td>\n<td>entries(string JSON) &#043; count(int) &#043; enabled(boolean)<\/td>\n<td>\u6293\u53d6\u5f53\u524d\u9875 console.* \u8f93\u51fa&#xff08;log\/warn\/error\/info&#xff09;&#xff1b;\u539f\u751f WebChromeClient.onConsoleMessage \u94a9\u53d6&#xff0c;\u9ed8\u8ba4\u5f00\u542f<\/td>\n<\/tr>\n<tr>\n<td>browser_query<\/td>\n<td>selector(string, \u5fc5\u586b CSS \u9009\u62e9\u5668)<\/td>\n<td>count(int) &#043; matches(string JSON)<\/td>\n<td>\u6309 CSS \u9009\u62e9\u5668\u67e5\u8be2 DOM&#xff0c;\u8fd4\u56de\u5339\u914d\u5143\u7d20&#xff1a;index\/\u6807\u7b7e\/\u6587\u672c\/\u503c\/\u94fe\u63a5\/id\/class\/\u4f4d\u7f6e\/\u53ef\u89c1\u6027<\/td>\n<\/tr>\n<tr>\n<td>browser_tabnew<\/td>\n<td>url(string, \u5fc5\u586b) \/ title(string, \u53ef\u9009)<\/td>\n<td>tab_id(string) &#043; url &#043; active(boolean)<\/td>\n<td>\u8f7b\u91cf\u591a\u6807\u7b7e\u00b7\u65b0\u5efa\u5e76\u6253\u5f00&#xff08;\u5355\u5f15\u64ce&#xff0c;\u6807\u7b7e\u8bb0\u5f55 URL &#043; \u5207\u6362\u91cd\u8f7d&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_tabs<\/td>\n<td>\u2014<\/td>\n<td>count(int) &#043; tabs(string JSON) &#043; active_id(string)<\/td>\n<td>\u8f7b\u91cf\u591a\u6807\u7b7e\u00b7\u5217\u51fa&#xff08;\u542b active \u6807\u8bb0&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_tab<\/td>\n<td>id(string, \u5fc5\u586b)<\/td>\n<td>ok(boolean) &#043; url &#043; id<\/td>\n<td>\u8f7b\u91cf\u591a\u6807\u7b7e\u00b7\u5207\u6362\u5230\u6307\u5b9a\u6807\u7b7e&#xff08;\u91cd\u8f7d\u5176 URL&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>browser_tabclose<\/td>\n<td>id(string, \u5fc5\u586b)<\/td>\n<td>ok(boolean) &#043; remaining(int)<\/td>\n<td>\u8f7b\u91cf\u591a\u6807\u7b7e\u00b7\u5173\u95ed&#xff08;\u6fc0\u6d3b\u6807\u7b7e\u5173\u95ed\u540e\u81ea\u52a8\u56de\u9000\u6700\u8fd1\u4e00\u4e2a&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7b2c\u56db\u6ce2\u589e\u5f3a&#xff08;1 \u00b7 \u865a\u62df\u9f20\u6807&#xff09;<\/p>\n<table>\n<tr>\u80fd\u529b id\u5165\u53c2\u51fa\u53c2\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>browser_mouse<\/td>\n<td>action(string, \u5fc5\u586b&#xff1a;move\/click\/dblclick\/right\/down\/up\/drag\/scroll) \/ x(int, \u5fc5\u586b \u5c4f\u5e55\u7edd\u5bf9\u50cf\u7d20 X) \/ y(int, \u5fc5\u586b \u5c4f\u5e55\u7edd\u5bf9\u50cf\u7d20 Y) \/ dx(int, \u53ef\u9009) \/ dy(int, \u53ef\u9009) \/ button(string, \u53ef\u9009&#xff1a;left \u9ed8\u8ba4\/right\/middle)<\/td>\n<td>ok(boolean) &#043; action &#043; x &#043; y<\/td>\n<td>\u5728\u9875\u9762\u5c4f\u5e55\u5750\u6807\u6a21\u62df\u9f20\u6807\u52a8\u4f5c&#xff1b;\u540e\u7aef\u6309 WebView \u5728\u5c4f\u4f4d\u7f6e\u81ea\u52a8\u6362\u7b97\u89c6\u56fe\u5750\u6807\u540e\u6d3e\u53d1 MotionEvent&#xff08;\u4e3b\u7ebf\u7a0b dispatchTouchEvent \/ dispatchGenericMotionEvent&#xff09;\u3002\u8986\u76d6\u65e0\u7a33\u5b9aID\u3001\u65e0 CSS \u9009\u62e9\u5668\u7684\u5143\u7d20\u4e0e\u753b\u5e03\u4ea4\u4e92&#xff0c;\u4e0e browser_action(id\/selector) \u6784\u6210\u300c\u5750\u6807 &#043; \u8bed\u4e49\u300d\u53cc\u901a\u9053\u3002\u6ce8&#xff1a;\u7cfb\u7edf WebView \u5c06\u89e6\u6478\u4e8b\u4ef6\u6309\u89e6\u6478\u5904\u7406&#xff0c;\u53f3\u952e\u4e3a\u5c3d\u529b\u800c\u4e3a<\/td>\n<\/tr>\n<tr>\n<td>http_request<\/td>\n<td>url(string, \u5fc5\u586b) \/ method(string, \u53ef\u9009&#xff1a;GET\/POST\/PUT\/DELETE\/PATCH\/HEAD&#xff0c;\u9ed8\u8ba4 GET) \/ headers(string, \u53ef\u9009 JSON) \/ body(string, \u53ef\u9009 \u539f\u6837\u53d1\u9001)<\/td>\n<td>status_code(int) &#043; response_headers(string JSON) &#043; response_body(string) &#043; truncated(boolean)&#xff1b;\u5927\u54cd\u5e94\u4f53\u9644 response_body_gz(byte[])<\/td>\n<td>HTTP \u4f20\u8f93&#xff1a;\u7ecf ACI \u8ba9\u53d7\u63a7\u6d4f\u89c8\u5668\u4ee3\u4e3a\u53d1\u8d77\u4efb\u610f HTTP \u8bf7\u6c42\u3002\u91cd\u70b9\u652f\u6301\u540c\u7f51\u6bb5 LAN \u660e\u6587&#xff08;http:\/\/192.168.x.x\u3001http:\/\/10.x\u3001*.local mDNS&#xff09;&#xff0c;\u8bbf\u95ee\u8def\u7531\u5668\/NAS\/\u667a\u80fd\u5bb6\u5c45\/\u79c1\u6709 API \u7b49\u5c40\u57df\u7f51\u8bbe\u5907&#xff1b;\u53d7\u63a7\u6d4f\u89c8\u5668\u5df2\u653e\u5f00\u5c40\u57df\u7f51\u660e\u6587&#xff08;networkSecurityConfig base-config \u6574\u4f53\u5141\u8bb8\u660e\u6587&#xff09;&#xff0c;\u65e0\u9700\u56e0\u516c\u7f51\u660e\u6587\u9650\u5236\u800c\u72b9\u8c6b&#xff0c;\u516c\u7f51\u8bf7\u6c42\u4ecd\u8d70 HTTPS\u3002\u54cd\u5e94\u4f53 &gt;15 \u4e07\u5b57\u7b26\u81ea\u52a8 gzip&#xff08;response_body_gz&#xff09;&#xff0c;\u63a7\u5236\u7aef\u89e3\u538b\u8fd8\u539f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7b2c\u4e94\u6ce2\u589e\u5f3a&#xff08;2 \u00b7 \u8bed\u4e49\u70b9\u51fb\u95ed\u73af&#xff09;<\/p>\n<table>\n<tr>\u80fd\u529b id\u5165\u53c2\u51fa\u53c2\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>ui_snapshot<\/td>\n<td>\u2014<\/td>\n<td>nodes(string_array&#xff0c;\u6bcf\u9879 text|resId|left,top,right,bottom \u5c4f\u5e55\u50cf\u7d20\u6574\u6570)<\/td>\n<td>\u5f53\u524d\u53ef\u89c6\u533a\u57df\u5143\u7d20\u5feb\u7167&#xff08;\u5c4f\u5e55\u5750\u6807&#xff09;&#xff1a;\u904d\u5386\u9875\u9762\u53ef\u4ea4\u4e92\/\u53ef\u89c1\u5143\u7d20&#xff0c;\u6309 WebView \u5728\u5c4f\u4f4d\u7f6e &#043; CSS\u2192\u5c4f\u5e55\u7f29\u653e\u6362\u7b97\u6210\u5c4f\u5e55\u7edd\u5bf9\u50cf\u7d20\u8fd4\u56de&#xff1b;\u89c6\u53e3\u5916\u5143\u7d20\u81ea\u52a8\u8df3\u8fc7\u3002\u4f9b\u63a7\u5236\u7aef clickText\/clickResourceId \u89e3\u6790\u951a\u70b9\u5750\u6807&#xff1b;\u4e0e tap \u540c\u4e00\u5750\u6807\u7a7a\u95f4&#xff08;\u5c4f\u5e55\u7edd\u5bf9\u50cf\u7d20&#xff09;&#xff0c;\u65e0\u9700 AccessibilityService<\/td>\n<\/tr>\n<tr>\n<td>tap<\/td>\n<td>x(int, \u5fc5\u586b \u5c4f\u5e55\u7edd\u5bf9\u50cf\u7d20 X) \/ y(int, \u5fc5\u586b \u5c4f\u5e55\u7edd\u5bf9\u50cf\u7d20 Y)<\/td>\n<td>x(int) &#043; y(int)<\/td>\n<td>\u5728\u5c4f\u5e55\u5750\u6807\u6a21\u62df\u5355\u51fb&#xff1a;\u590d\u7528 browser_mouse \u7684\u5750\u6807\u6362\u7b97\u4e0e\u89c6\u56fe\u7ea7 dispatchTouchEvent \u6d3e\u53d1&#xff08;\u53d7\u63a7\u7aef\u65e0\u7cfb\u7edf\u7279\u6743\u4e5f\u80fd\u7528&#xff09;&#xff0c;\u4e0e ui_snapshot \u5f62\u6210\u300c\u50cf\u4eba\u4e00\u6837\u70b9\u9875\u9762\u300d\u7684\u611f\u77e5-\u6267\u884c\u95ed\u73af\u3002\u63a7\u5236\u7aef\u8bed\u4e49\u70b9\u51fb clickText\/clickResourceId \u4f1a\u81ea\u52a8\u5148 ui_snapshot \u53d6\u8282\u70b9\u3001\u89e3\u6790\u951a\u70b9\u3001\u518d tap<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6ce8&#xff1a;browser_action \u5728\u7b2c\u4e09\u6ce2\u65b0\u589e selector(CSS \u9009\u62e9\u5668) \u53c2\u6570&#xff08;\u4e0e id \u4e8c\u9009\u4e00&#xff0c;\u4f18\u5148\u7ea7\u4f4e\u4e8e id&#xff09;&#xff0c;\u53ef\u76f4\u63a5\u7528\u9009\u62e9\u5668\u5b9a\u4f4d\u64cd\u4f5c&#xff0c;\u514d\u53bb\u5148 browser_elements \u6ce8\u5165\u7a33\u5b9a ID\u3002<\/p>\n<p>\u6240\u6709\u80fd\u529b\u5747\u5e26 FLAG_BACKGROUND &#043; FLAG_NO_UI&#xff0c;\u53ef\u5728\u540e\u53f0\u3001\u65e0\u9700 UI \u6267\u884c\u3002browser_crawl \/ browser_search \/ browser_script \u7684\u6b63\u6587\u4e0e\u7ed3\u679c\u5747\u622a\u65ad\u5230\u7ea6 15 \u4e07\u5b57\u7b26&#xff08;\u8fd4\u56de truncated&#061;true \u8868\u793a\u88ab\u622a\u65ad&#xff09;\u3002browser_read \u5927\u9875\u9762\u989d\u5916 gzip \u7ecf html_gz \u56de\u4f20&#xff08;\u89c1 13.3&#xff09;\u3002<\/p>\n<p>\u26a0\ufe0f \u6240\u6709 WebView \u64cd\u4f5c\u987b\u5728\u4e3b\u7ebf\u7a0b\u6267\u884c&#xff08;\u89c1 \u00a711 \u5751\u8868&#xff09;&#xff0c;\u53d7\u63a7\u7aef\u5df2\u5c01\u88c5 mainHandler.post &#043; CountDownLatch&#xff0c;\u7981\u6b62\u5728 ACI Binder \u7ebf\u7a0b\u76f4\u63a5\u8c03\u7528 WebView\u3002<\/p>\n<h4>13.2 \u8c03\u7528\u793a\u4f8b&#xff08;\u63a7\u5236\u7aef\u89c6\u89d2&#xff09;<\/h4>\n<p><span class=\"token comment\">\/\/ \u68c0\u7d22\u300c\u5982\u4f55\u90e8\u7f72 ACI \u53d7\u63a7\u7aef\u300d<\/span><br \/>\n<span class=\"token keyword\">val<\/span> resp <span class=\"token operator\">&#061;<\/span> stub<span class=\"token punctuation\">.<\/span><span class=\"token function\">call<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    ACIRequest<span class=\"token punctuation\">.<\/span><span class=\"token function\">Builder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">capability<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;browser_search&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">param<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;query&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u5982\u4f55\u90e8\u7f72 ACI \u53d7\u63a7\u7aef&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">param<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;engine&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;bing&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">val<\/span> text  <span class=\"token operator\">&#061;<\/span> resp<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">getString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;text&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span>   <span class=\"token comment\">\/\/ \u7ed3\u679c\u9875\u6b63\u6587&#xff08;\u5df2\u622a\u65ad\u5230 ~15 \u4e07\u5b57\u7b26&#xff09;<\/span><br \/>\n<span class=\"token keyword\">val<\/span> links <span class=\"token operator\">&#061;<\/span> resp<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">getString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;links&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ JSON \u6570\u7ec4&#xff1a;[{text,href}]<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5728\u5df2\u6253\u5f00\u7684\u9875\u9762\u6267\u884c JS&#xff0c;\u62bd\u53d6\u6240\u6709\u56fe\u7247 src<\/span><br \/>\n<span class=\"token keyword\">val<\/span> js <span class=\"token operator\">&#061;<\/span> <span class=\"token string-literal multiline\"><span class=\"token string\">&#034;&#034;&#034;JSON.stringify(<br \/>\n    Array.from(document.images).map { i -&gt; i.src })&#034;&#034;&#034;<\/span><\/span><br \/>\n<span class=\"token keyword\">val<\/span> r2 <span class=\"token operator\">&#061;<\/span> stub<span class=\"token punctuation\">.<\/span><span class=\"token function\">call<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    ACIRequest<span class=\"token punctuation\">.<\/span><span class=\"token function\">Builder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">capability<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;browser_script&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">param<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;code&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> js<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">val<\/span> imgs <span class=\"token operator\">&#061;<\/span> r2<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">.<\/span><span class=\"token function\">getString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;result&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>13.3 \u5173\u4e8e browser_read \u7684 Binder 1MB \u6ea2\u51fa\u4fee\u590d&#xff08;v1.0.8&#xff09;<\/h4>\n<p>AIDL Binder \u5355\u6b21\u4e8b\u52a1\u4e0a\u9650\u7ea6 1MB\u3002\u65e9\u671f\u5b9e\u73b0\u76f4\u63a5 putResult(&#034;html&#034;, fullHtml) \u4f20\u5b8c\u6574\u5927\u9875\u9762 HTML&#xff0c;\u4f1a\u5728 transact \u65f6\u629b TransactionTooLargeException \u5bfc\u81f4\u8c03\u7528\u5931\u8d25\u3002<\/p>\n<p>\u4fee\u590d\u65b9\u6848&#xff08;\u6df7\u5408\u7ed5\u8fc7&#xff0c;\u5411\u540e\u517c\u5bb9&#xff09;&#xff1a;<\/p>\n<ul>\n<li>\u53d7\u63a7\u7aef handleRead \u59cb\u7ec8\u8fd4\u56de\u300c\u5b89\u5168\u622a\u65ad\u7684 html \u5b57\u7b26\u4e32\u300d&#xff08;\u2264150,000 \u5b57\u7b26&#xff09;&#xff0c;\u6c38\u4e0d\u8fc7 Binder&#xff1b;<\/li>\n<li>\u5f53\u539f\u59cb HTML \u8d85\u8fc7\u9608\u503c\u65f6&#xff0c;\u989d\u5916\u7528 GZIPOutputStream \u538b\u6210 byte[]&#xff0c;\u7ecf html_gz \u56de\u4f20&#xff1b;\u63a7\u5236\u7aef QuroAidlAciCallTool \u68c0\u6d4b\u5230 html_gz \u5373 GZIPInputStream \u89e3\u538b&#xff0c;\u8fd8\u539f\u5b8c\u6574 HTML \u4ea4\u7ed9 LLM&#xff1b;<\/li>\n<li>gzip \u540e\u82e5\u4ecd &gt;900KB&#xff0c;\u653e\u5f03 html_gz&#xff0c;\u4ec5\u8fd4\u56de\u622a\u65ad\u9884\u89c8&#xff08;\u6781\u7aef\u5927\u9875\u9762\u515c\u5e95&#xff09;\u3002<\/li>\n<\/ul>\n<p>\u8fd9\u662f\u53d7\u63a7\u7aef &#043; \u63a7\u5236\u7aef\u53cc\u4fa7\u6539\u52a8&#xff1a;\u53d7\u63a7\u7aef\u8d1f\u8d23\u622a\u65ad\/\u538b\u7f29&#xff0c;\u63a7\u5236\u7aef\u8d1f\u8d23\u89e3\u538b\u8fd8\u539f\u3002\u7b2c\u4e09\u65b9\u53d7\u63a7\u7aef\u82e5\u4e5f\u8981\u56de\u4f20\u5927\u7ed3\u679c&#xff0c;\u5efa\u8bae\u590d\u7528\u540c\u4e00\u6a21\u5f0f\u3002<\/p>\n<hr \/>\n<h3>14. LAN \u63a7\u5236\u53f0 \/ \u63a7\u5236\u53f0\u540e\u53f0\u63a5\u5165 ZorvAI<\/h3>\n<p>\u672c\u8282\u5bf9\u5e94\u4e3b\u7a0b\u5e8f\u300c\u8bbe\u7f6e \u2192 ACI \u7ba1\u7406\u4e2d\u5fc3 \u2192 ACI \u88ab\u63a7\u65b9\u63a5\u5165\u624b\u518c\u300d\u4e2d\u7684\u300c\u63a7\u5236\u53f0\u540e\u53f0&#xff08;ConsoleBackend&#xff09;\u5f00\u53d1\u63a5\u5165 ZorvAI\u300d\u4e00\u8282&#xff0c;\u9762\u5411\u60f3\u8ba9\u81ea\u5df1\u7684\u53d7\u63a7\u7aef\u5728 Zorv AI \u91cc\u663e\u793a\u4e00\u4e2a\u53ef\u4ea4\u4e92\u63a7\u5236\u53f0\u7684\u5f00\u53d1\u8005\u3002<\/p>\n<p>Zorv AI \u7684\u63a7\u5236\u53f0 UI \u91c7\u7528 SDUI&#xff08;Server-Driven UI&#xff09; \u6a21\u5f0f&#xff1a;\u53d7\u63a7\u7aef\u53ea\u66b4\u9732\u4e24\u4e2a\u80fd\u529b\u2014\u2014console_ui&#xff08;\u8fd4\u56de\u754c\u9762\u5feb\u7167 JSON&#xff09;\u4e0e console_action&#xff08;\u5904\u7406\u7528\u6237\u64cd\u4f5c&#xff09;&#xff0c;\u63a7\u5236\u7aef\u8d1f\u8d23\u7eaf\u672c\u5730\u6e32\u67d3&#xff0c;\u4e0d\u7ecf\u8fc7\u4efb\u4f55\u7f51\u7edc&#xff08;\u540c\u8bbe\u5907 Binder \u8c03\u7528&#xff0c;WiFi \/ \u79fb\u52a8\u7f51\u7edc\u5747\u4e0d\u5f71\u54cd&#xff09;\u3002<\/p>\n<p>\u65e9\u671f\u7248\u672c\u66fe\u8bef\u5efa\u300capp \u81ea\u8fde 127.0.0.1 \u73af\u56de HTTP \u63a7\u5236\u53f0\u300d&#xff08;lanui \u6a21\u5757&#xff09;&#xff0c;\u5df2\u4e8e 2026-07-31 \u5f7b\u5e95\u79fb\u9664&#xff1b;\u73b0\u884c\u65b9\u6848\u5373\u672c\u8282\u6240\u8ff0\u3002<\/p>\n<h4>14.1 \u63a5\u5165\u65b9\u5f0f<\/h4>\n<p>\u53d7\u63a7\u7aef\u4e8c\u9009\u4e00&#xff1a;<\/p>\n<ul>\n<li>\u65b9\u5f0f A&#xff08;\u63a8\u8350&#xff09;&#xff1a;\u5b9e\u73b0 AciConsoleContract \u63a5\u53e3&#xff08;buildUiSnapshot(): JSONObject &#043; applyAction(action, payload): JSONObject&#xff09;&#xff0c;\u5e76\u6ce8\u518c console_ui \/ console_action \u4e24\u4e2a ACI \u80fd\u529b&#xff0c;\u5728 onCall \u4e2d\u8f6c\u53d1\u5230\u4f60\u7684 ConsoleBackend \u5b9e\u73b0\u3002<\/li>\n<li>\u65b9\u5f0f B&#xff08;\u6781\u7b80&#xff09;&#xff1a;\u4e0d\u5b9e\u73b0\u63a5\u53e3&#xff0c;\u76f4\u63a5\u5728 onCall \u91cc\u5904\u7406 console_ui \/ console_action \u4e24\u4e2a capability&#xff0c;\u8fd4\u56de\u7ea6\u5b9a\u7684 JSON\u3002<\/li>\n<\/ul>\n<h4>14.2 \u5feb\u7167 JSON Schema&#xff08;console_ui \u8fd4\u56de&#xff09;<\/h4>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;title&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u53d7\u63a7\u7aef\u63a7\u5236\u53f0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;subtitle&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u53ef\u9009\u526f\u6807\u9898&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;updatedAt&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;2026-07-31T12:00:00&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;components&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;heading&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;text&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u6807\u9898&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;text&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u4e00\u6bb5\u8bf4\u660e\u6587\u5b57&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;card&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;title&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u5361\u7247&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;body&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u5361\u7247\u5185\u5bb9&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;button&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;key&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;reset&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;text&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u91cd\u7f6e&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;divider&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;spacer&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;height&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">8<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;input&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;key&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;note&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;hint&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u8bf7\u8f93\u5165\u5907\u6ce8&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;value&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;listitem&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;title&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u9879&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;subtitle&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u5b50\u9879&#034;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7ec4\u4ef6\u7c7b\u578b&#xff1a;heading \/ text \/ card \/ button \/ divider \/ spacer \/ input \/ listitem\u3002<\/p>\n<h4>14.3 \u52a8\u4f5c\u5951\u7ea6&#xff08;console_action \u5165\u53c2&#xff09;<\/h4>\n<ul>\n<li>\u6309\u94ae\u70b9\u51fb&#xff1a;payload \u4e3a\u7a7a {}&#xff08;\u6216\u4ec5\u542b action&#061;\u6309\u94ae key&#xff09;&#xff1b;\u53d7\u63a7\u7aef\u6309 key \u6267\u884c\u5bf9\u5e94\u903b\u8f91\u3002<\/li>\n<li>\u8f93\u5165\u6846\u63d0\u4ea4&#xff1a;payload \u4e3a { &#034;&lt;input \u7684 key&gt;&#034;: &#034;&lt;\u7528\u6237\u8f93\u5165\u503c&gt;&#034; }&#xff0c;\u4f8b\u5982 { &#034;note&#034;: &#034;hello&#034; }\u3002<\/li>\n<\/ul>\n<p>\u26a0\ufe0f \u517c\u5bb9\u6027\u94c1\u5f8b&#xff1a;\u63a7\u5236\u7aef&#xff08;Zorv AI \u4e3b\u7a0b\u5e8f&#xff09;\u7684 Compose \u63a7\u5236\u53f0\u5728\u8f93\u5165\u6846\u63d0\u4ea4\u65f6\u56de\u4f20 { &#034;value&#034;: &#034;&#8230;&#034;, &#034;key&#034;: &#034;&#8230;&#034; }&#xff0c;\u800c\u53d7\u63a7\u7aef ConsoleBackend.applyAction \u662f\u6309\u8f93\u5165\u6846 key \u8bfb\u53d6\u53c2\u6570\u7684&#xff08;p.optString(key)&#xff09;\u3002\u53d7\u63a7\u7aef\u52a1\u5fc5\u4ee5 key \u4e3a\u51c6\u8bfb\u53d6\u5165\u53c2&#xff0c;\u4e0d\u8981\u4f9d\u8d56 value \u5b57\u6bb5&#xff0c;\u5426\u5219\u4f1a\u6536\u4e0d\u5230\u8f93\u5165\u3002<\/p>\n<h4>14.4 \u6700\u5c0f Kotlin \u793a\u4f8b<\/h4>\n<p><span class=\"token comment\">\/\/ ConsoleBackend.kt&#xff08;\u53d7\u63a7\u7aef\u5185\u90e8&#xff09;<\/span><br \/>\n<span class=\"token keyword\">object<\/span> ConsoleBackend <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">var<\/span> count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    <span class=\"token keyword\">var<\/span> lastNote <span class=\"token operator\">&#061;<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;&#034;<\/span><\/span><\/p>\n<p>    <span class=\"token keyword\">fun<\/span> <span class=\"token function\">buildUiSnapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">:<\/span> JSONObject <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">JSONObject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">apply<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;title&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u6211\u7684\u63a7\u5236\u53f0&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;components&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">JSONArray<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">apply<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">JSONObject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;type&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;heading&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;text&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u8ba1\u6570\u5668&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">JSONObject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;type&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;text&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;text&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u5f53\u524d&#xff1a;<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">$<\/span><span class=\"token expression\">count<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">JSONObject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;type&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;button&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;key&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;inc&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;text&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u52a0\u4e00&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">JSONObject<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;type&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;input&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;key&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;note&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;hint&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;\u5907\u6ce8&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">fun<\/span> <span class=\"token function\">applyAction<\/span><span class=\"token punctuation\">(<\/span>action<span class=\"token operator\">:<\/span> String<span class=\"token punctuation\">,<\/span> payload<span class=\"token operator\">:<\/span> JSONObject<span class=\"token punctuation\">)<\/span><span class=\"token operator\">:<\/span> JSONObject <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">when<\/span> <span class=\"token punctuation\">(<\/span>action<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;inc&#034;<\/span><\/span> <span class=\"token operator\">-&gt;<\/span> count<span class=\"token operator\">&#043;&#043;<\/span><br \/>\n            <span class=\"token string-literal singleline\"><span class=\"token string\">&#034;note&#034;<\/span><\/span> <span class=\"token operator\">-&gt;<\/span> lastNote <span class=\"token operator\">&#061;<\/span> payload<span class=\"token punctuation\">.<\/span><span class=\"token function\">optString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-literal singleline\"><span class=\"token string\">&#034;note&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">buildUiSnapshot<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>14.5 \u590d\u7528 consolekit&#xff08;\u53ef\u9009&#xff09;<\/h4>\n<p>Zorv AI \u4e3b\u7a0b\u5e8f\u5185\u7f6e consolekit \u5305&#xff0c;\u53d7\u63a7\u7aef\u6216\u63a7\u5236\u7aef\u90fd\u53ef\u590d\u7528&#xff1a;<\/p>\n<ul>\n<li>LocalConsoleEndpoint&#xff1a;\u540c\u8fdb\u7a0b\u76f4\u8fde ConsoleBackend&#xff1b;<\/li>\n<li>RemoteConsoleEndpoint&#xff1a;\u8de8\u8fdb\u7a0b bindService \u5230\u76ee\u6807\u5305\u540d&#xff08;\u53ef\u66ff\u6362 targetPackage&#xff09;&#xff1b;<\/li>\n<li>AciConsoleRenderer&#xff1a;\u7eaf View \u5b9e\u73b0\u7684 SDUI \u6e32\u67d3\u5668&#xff08;\u4e0d\u4f9d\u8d56 Compose&#xff09;&#xff1b;<\/li>\n<li>ManualConsolePanel&#xff1a;\u5355\u7ebf\u7a0b worker&#xff0c;\u907f\u514d WebView \u4e3b\u7ebf\u7a0b evaluateJavascript \u6b7b\u9501\u3002<\/li>\n<\/ul>\n<h4>14.6 \u63a7\u5236\u7aef\u5982\u4f55\u9a71\u52a8<\/h4>\n<p>\u63a7\u5236\u7aef QuroAidlAciCenterScreen \u6309 capability id console_ui \u53d1\u73b0\u300c\u6253\u5f00\u63a7\u5236\u53f0\u300d\u5165\u53e3&#xff1b;\u70b9\u51fb\u540e\u901a\u8fc7 Binder \u62c9\u53d6 console_ui \u5feb\u7167&#xff0c;\u7528\u672c\u5730 AciConsoleScreen&#xff08;core\/aci \u5305&#xff09;\u6e32\u67d3&#xff1b;\u6309\u94ae \/ \u8f93\u5165\u7ecf console_action \u56de\u4f20\u5e76\u5237\u65b0\u5feb\u7167\u3002<\/p>\n<p>\u5168\u7a0b\u7eaf\u63a5\u7ebf\u3001\u96f6\u4fb5\u5165\u3001\u96f6\u7f51\u7edc\u3002<\/p>\n<hr \/>\n<h3>15. HTTP \u4f20\u8f93\u80fd\u529b&#xff08;http_request \u00b7 \u5c40\u57df\u7f51\/\u672c\u5730\u7ec4\u7f51&#xff09;<\/h3>\n<p>\u5bf9\u5e94\u4e3b\u7a0b\u5e8f\u300c\u8bbe\u7f6e \u2192 ACI \u7ba1\u7406\u4e2d\u5fc3 \u2192 ACI \u88ab\u63a7\u65b9\u63a5\u5165\u624b\u518c\u300d\u4e2d\u7684\u300cHTTP \u4f20\u8f93&#xff08;http_request \u00b7 \u5c40\u57df\u7f51\/\u672c\u5730\u7ec4\u7f51&#xff09;\u300d\u4e00\u8282&#xff0c;\u4ee5\u53ca\u4e3b\u7a0b\u5e8f\u7cfb\u7edf\u63d0\u793a\u8bcd\u5bf9 ACI \u7684 HTTP\/LAN \u8bf4\u660e\u3002\u9762\u5411\u60f3\u8ba9\u81ea\u5df1\u7684\u53d7\u63a7\u7aef\u4e5f\u63d0\u4f9b HTTP \u4f20\u8f93\u80fd\u529b\u7684\u5f00\u53d1\u8005\u3002<\/p>\n<p>\u53d7\u63a7\u6d4f\u89c8\u5668\u65b0\u589e http_request \u80fd\u529b&#xff0c;\u8ba9 AI \u80fd\u7ecf ACI \u8ba9\u6d4f\u89c8\u5668\u53d1\u8d77\u4efb\u610f HTTP \u8bf7\u6c42&#xff0c;\u91cd\u70b9\u662f\u300c\u672c\u5730\u7ec4\u7f51&#xff08;\u76f8\u540c\u7f51\u7edc\u4e0b&#xff09;\u300d&#xff1a;<\/p>\n<h4>15.1 LAN \u660e\u6587\u652f\u6301&#xff08;\u6838\u5fc3&#xff09;<\/h4>\n<p>Android 9&#xff08;API 28&#xff09;&#043; \u9ed8\u8ba4\u7981\u6b62\u660e\u6587 HTTP&#xff08;cleartextTrafficPermitted&#061;false&#xff09;&#xff0c;targetSdk\u226528 \u7684 App \u76f4\u63a5\u8bbf\u95ee http:\/\/ \u4f1a\u88ab\u7cfb\u7edf\u62e6\u622a&#xff08;ERR_CLEARTEXT_NOT_PERMITTED&#xff09;\u3002<\/p>\n<p>\u53d7\u63a7\u6d4f\u89c8\u5668\u901a\u8fc7 res\/xml\/network_security_config.xml \u89e3\u9664\u8be5\u9650\u5236&#xff1a;<\/p>\n<ul>\n<li>base-config \u7684 cleartextTrafficPermitted&#061;&#034;true&#034;&#xff1a;\u6574\u4f53\u653e\u5f00\u660e\u6587&#xff08;\u542b\u79c1\u6709\u7f51\u6bb5 192.168.0.0\/16\u300110.0.0.0\/8&#xff09;&#xff1b;<\/li>\n<li>domain-config \u5bf9 localhost \/ 127.0.0.1 \/ 10.0.2.2&#xff08;\u6a21\u62df\u5668\u56de\u73af&#xff09;\/ local&#xff08;mDNS&#xff09;\u5355\u72ec\u653e\u5f00&#xff0c;\u4fbf\u4e8e\u672c\u673a\u4e0e\u5c40\u57df\u7f51\u8bbe\u5907\u4e92\u8bbf\u3002<\/li>\n<\/ul>\n<h4>15.2 \u5e73\u53f0\u9650\u5236&#xff08;\u91cd\u8981&#xff09;<\/h4>\n<p>Android NSC \u53ea\u80fd\u6309\u57df\u540d\u6216\u6574\u4f53 base-config \u653e\u5f00\u660e\u6587&#xff0c;\u65e0\u6cd5\u6309\u300c\u79c1\u6709\u7f51\u6bb5\u300d\u5199\u767d\u540d\u5355&#xff08;\u5982\u4e0d\u80fd\u5199 192.168.0.0\/16 \u4e00\u6761\u89c4\u5219&#xff09;\u3002\u8981\u652f\u6301 LAN \u660e\u6587&#xff0c;\u53ea\u80fd\u628a base-config \u6574\u4f53\u653e\u5f00\u2014\u2014\u8fd9\u662f\u5e73\u53f0\u9650\u5236&#xff0c;\u4e0d\u662f\u4ee3\u7801\u7f3a\u9677\u3002<\/p>\n<p>\u53d7\u63a7\u6d4f\u89c8\u5668\u5b9a\u4f4d\u4e3a\u672c\u5730\u8c03\u8bd5\/\u81ea\u52a8\u5316\u5de5\u5177&#xff0c;\u660e\u6587\u98ce\u9669\u7531\u4f7f\u7528\u8005\u5728\u53ef\u4fe1 LAN \u5185\u81ea\u884c\u628a\u63a7\u3002<\/p>\n<h4>15.3 \u5951\u7ea6&#xff08;\u53c2\u6570 \/ \u8fd4\u56de&#xff09;<\/h4>\n<p>\u53d7\u63a7\u7aef onCall(&#034;http_request&#034;) \u900f\u4f20 URL \u7ed9 OkHttp&#xff08;\u65e0 scheme \u6821\u9a8c&#xff0c;\u660e\u6587\u662f\u5426\u901a\u5b8c\u5168\u7531 NSC \u51b3\u5b9a&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u9879\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>\u5165\u53c2 url<\/td>\n<td>\u76ee\u6807 URL&#xff08;\u5fc5\u586b&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u5165\u53c2 method<\/td>\n<td>HTTP \u65b9\u6cd5&#xff0c;\u9ed8\u8ba4 GET&#xff1b;\u652f\u6301 GET\/POST\/PUT\/DELETE\/PATCH\/HEAD \u53ca\u4efb\u610f\u81ea\u5b9a\u4e49<\/td>\n<\/tr>\n<tr>\n<td>\u5165\u53c2 headers<\/td>\n<td>\u8bf7\u6c42\u5934 JSON \u5bf9\u8c61\u5b57\u7b26\u4e32&#xff0c;\u5982 {&#034;Authorization&#034;:&#034;Bearer x&#034;}<\/td>\n<\/tr>\n<tr>\n<td>\u5165\u53c2 body<\/td>\n<td>\u8bf7\u6c42\u4f53&#xff08;\u539f\u6837\u53d1\u9001&#xff0c;\u5b57\u7b26\u4e32&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u8fd4\u56de status_code<\/td>\n<td>HTTP \u54cd\u5e94\u72b6\u6001\u7801&#xff08;int&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u8fd4\u56de response_headers<\/td>\n<td>\u54cd\u5e94\u5934 JSON \u5bf9\u8c61<\/td>\n<\/tr>\n<tr>\n<td>\u8fd4\u56de response_body<\/td>\n<td>\u54cd\u5e94\u4f53&#xff08;\u5b57\u7b26\u4e32&#xff1b;&gt;15 \u4e07\u5b57\u7b26\u622a\u65ad&#xff0c;\u9644 response_body_gz&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u8fd4\u56de truncated<\/td>\n<td>\u54cd\u5e94\u4f53\u662f\u5426\u88ab\u622a\u65ad&#xff08;boolean&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u8fd4\u56de response_body_gz<\/td>\n<td>\u5927\u54cd\u5e94\u4f53 gzip(byte[])&#xff0c;\u63a7\u5236\u7aef\u89e3\u538b\u8fd8\u539f&#xff08;Binder \u2264900KB \u624d\u56de\u4f20&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>15.4 \u63a7\u5236\u7aef\u5982\u4f55\u6e32\u67d3<\/h4>\n<p>\u4e3b\u7a0b\u5e8f QuroAidlAciTools.renderHttpResult \u68c0\u6d4b\u5230 response_body_gz \u5373 GZIPInputStream \u89e3\u538b&#xff0c;\u628a\u300c\u72b6\u6001\u7801 \/ \u54cd\u5e94\u5934 \/ \u54cd\u5e94\u4f53\u300d\u6574\u7406\u6210\u5e72\u51c0\u6587\u672c\u5582\u7ed9 LLM&#xff1b;\u65e0 gzip \u65f6\u76f4\u63a5\u7528\u622a\u65ad\u9884\u89c8\u3002<\/p>\n<h4>15.5 \u5b89\u5168\u6743\u8861<\/h4>\n<p>\u660e\u6587\u653e\u5f00\u540e&#xff0c;\u516c\u7f51\u660e\u6587 HTTP&#xff08;http:\/\/ \u516c\u7f51\u57df\u540d&#xff09;\u4e5f\u4f1a\u4e00\u5e76\u653e\u884c\u3002\u8bf7\u4ec5\u5728\u53ef\u4fe1\u5c40\u57df\u7f51\u5185\u7528 http_request \u8bbf\u95ee\u5185\u7f51\u5730\u5740&#xff0c;\u4e0d\u8981\u7ecf\u5b83\u8bf7\u6c42\u516c\u7f51\u660e\u6587\u7ad9\u70b9&#xff1b;\u8fdc\u7a0b\u751f\u4ea7\u901a\u4fe1&#xff08;HTTPS&#xff09;\u4e0d\u53d7\u5f71\u54cd\u3002<\/p>\n<hr \/>\n<h3>16. \u53d7\u63a7\u7aef\u81ea\u5b9a\u4e49\u6743\u9650\u300c\u7b7e\u540d\u51b2\u7a81\u300d\u771f\u5b9e\u6848\u4f8b&#xff08;\u5fc5\u8bfb&#xff09;<\/h3>\n<p>\u672c\u8282\u6765\u81ea\u4e00\u4e2a\u7b2c\u4e09\u65b9\u53d7\u63a7\u7aef&#xff08;WorkflowACI&#xff0c;com.workflowaci&#xff09;\u63a5\u5165 Zorv AI \u65f6\u8e29\u5230\u7684\u771f\u5b9e\u751f\u4ea7 bug&#xff0c;\u5df2\u4fee\u590d\u5e76\u9a8c\u8bc1\u3002\u51e1\u662f\u81ea\u5df1\u5199\u53d7\u63a7\u7aef\u7684\u4eba&#xff0c;\u52a1\u5fc5\u5148\u8bfb\u672c\u8282\u518d\u5199 Manifest\u3002<\/p>\n<h4>16.1 \u73b0\u8c61<\/h4>\n<ul>\n<li>\u5b89\u88c5 \/ \u8986\u76d6\u5b89\u88c5\u53d7\u63a7\u7aef\u65f6&#xff0c;\u56e0\u81ea\u5b9a\u4e49\u6743\u9650 ai.aci.permission.* \u7684\u300c\u540c\u540d &#043; \u5f02\u7b7e\u540d &#043; \u53cc\u65b9\u90fd\u5b9a\u4e49\u300d\u51b2\u7a81&#xff0c;\u89e6\u53d1 INSTALL_FAILED_CONFLICTING_PERMISSION&#xff1b;\u6216\u65e7\u7248&#xff08;Debug \u7b7e\u540d&#xff09;\u4e0e\u65b0\u7248&#xff08;Release \u7b7e\u540d&#xff09;\u4e92\u66f4\u65f6\u89e6\u53d1 INSTALL_FAILED_UPDATE_INCOMPATIBLE\u3002<\/li>\n<li>\u6839\u56e0\u4e00\u53e5\u8bdd&#xff1a;\u53d7\u63a7\u7aef\u4e0d\u8be5\u5b9a\u4e49 ai.aci.permission.*&#xff0c;\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef ZorvAI&#xff1b;\u53d7\u63a7\u7aef\u5374\u7528 &lt;permission&gt; \u5b9a\u4e49\u4e86\u540c\u540d\u6743\u9650&#xff0c;\u4e14\u4e0e\u63a7\u5236\u7aef\u7b7e\u540d\u4e0d\u540c\u3002<\/li>\n<\/ul>\n<h4>16.2 \u6839\u56e0<\/h4>\n<p>Android \u7684\u81ea\u5b9a\u4e49\u6743\u9650\u7531\u300c\u6743\u9650\u540d &#043; \u5b9a\u4e49\u8005\u7b7e\u540d\u300d\u552f\u4e00\u786e\u5b9a\u3002\u5f53\u4e24\u4e2a App \u90fd &lt;permission&gt; \u5b9a\u4e49\u540c\u540d\u81ea\u5b9a\u4e49\u6743\u9650\u3001\u4e14\u7b7e\u540d\u4e0d\u540c\u65f6&#xff0c;\u540e\u5b89\u88c5\u7684\u90a3\u4e2a\u4f1a\u56e0\u6743\u9650\u5f52\u5c5e\u51b2\u7a81\u800c\u5b89\u88c5\u5931\u8d25\u2014\u2014\u4e0e protectionLevel&#xff08;normal \/ dangerous&#xff09;\u65e0\u5173\u3002<\/p>\n<p>\u66f4\u9690\u853d\u7684\u53d8\u79cd&#xff1a;\u53d7\u63a7\u7aef\u5f15\u5165\u7684 aci-core \u5e93\u6a21\u5757&#xff08;aci-core\/src\/main\/AndroidManifest.xml&#xff09;\u672c\u8eab\u5c31\u5e26\u5165\u4e86 &lt;permission&gt; \u5b9a\u4e49&#xff1b;\u82e5\u6d88\u8d39\u7aef Manifest \u4e0d\u505a tools:node&#061;&#034;remove&#034; \u5265\u9664&#xff0c;\u5408\u5e76\u540e\u53d7\u63a7\u7aef APK \u91cc\u5c31\u91cd\u590d\u5b9a\u4e49\u4e86\u8fd9\u4e9b\u6743\u9650&#xff0c;\u540c\u6837\u4f1a\u548c\u63a7\u5236\u7aef\u51b2\u7a81\u3002<\/p>\n<h4>16.3 \u6b63\u786e\u505a\u6cd5&#xff08;\u4e09\u53e5\u8bdd&#xff09;<\/h4>\n<li>\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef&#xff1a;ai.aci.permission.* \u53ea\u7531 ZorvAI&#xff08;\u63a7\u5236\u7aef&#xff09;\u5b9a\u4e49&#xff0c;\u53d7\u63a7\u7aef\u6c38\u4e0d &lt;permission&gt; \u5b9a\u4e49\u3002<\/li>\n<li>\u53d7\u63a7\u7aef\u53ea\u5f15\u7528&#xff1a;\u7528 &lt;uses-permission android:name&#061;&#034;ai.aci.permission.*&#034; \/&gt; \u5f15\u7528\u63a7\u5236\u7aef\u5df2\u5b9a\u4e49\u7684\u6743\u9650&#xff1b;\u53d7\u63a7\u7aef Service \u4e0a\u7684 android:permission&#061;&#034;ai.aci.permission.CALL&#034; \u4fdd\u7559\u2014\u2014\u5b83\u662f\u7b2c\u4e00\u5c42 Manifest \u9274\u6743&#xff0c;\u5f15\u7528\u7684\u662f\u63a7\u5236\u7aef\u5b9a\u4e49\u7684\u6743\u9650&#xff0c;\u903b\u8f91\u6709\u6548\u3002<\/li>\n<li>\u5265\u9664\u5e93\u5e26\u5165\u7684\u5b9a\u4e49&#xff1a;\u82e5 aci-core \u5e93\u5e26\u5165\u4e86 &lt;permission&gt;&#xff0c;\u5728\u53d7\u63a7\u7aef Manifest \u7528 &lt;permission android:name&#061;&#034;ai.aci.permission.*&#034; tools:node&#061;&#034;remove&#034; \/&gt; \u4e09\u6761\u6307\u4ee4\u5265\u9664&#xff08;\u9700\u5728 &lt;manifest&gt; \u58f0\u660e xmlns:tools&#061;&#034;http:\/\/schemas.android.com\/tools&#034;&#xff09;\u3002<\/li>\n<p>\u4fee\u590d\u540e&#xff0c;\u5408\u5e76 Manifest \u91cc\u53ea\u5269 AGP \u81ea\u52a8\u751f\u6210\u7684 com.workflowaci.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION&#xff08;\u5e26\u672c\u5e94\u7528\u5305\u540d\u524d\u7f00&#xff0c;\u4e0e ZorvAI \u4e0d\u540c\u540d&#xff0c;\u4e0d\u51b2\u7a81&#xff09;&#xff0c;ai.aci.permission.* \u5168\u90e8\u9000\u5316\u4e3a\u7eaf uses-permission \u5f15\u7528\u3002<\/p>\n<h4>16.4 \u53d1\u5e03\u524d\u7528 aapt2 \u6821\u9a8c&#xff08;\u5fc5\u505a&#xff09;<\/h4>\n<p><span class=\"token comment\"># \u9884\u671f&#xff1a;\u53ea\u51fa\u73b0\u672c\u5e94\u7528\u547d\u540d\u7a7a\u95f4\u7684 DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION&#xff0c;<\/span><br \/>\n<span class=\"token comment\">#       \u4e0d\u5f97\u51fa\u73b0\u4efb\u4f55 ai.aci.permission.* \u7684 &lt;permission&gt; \u5b9a\u4e49\u8282\u70b9<\/span><br \/>\naapt2 dump xmltree <span class=\"token parameter variable\">&#8211;file<\/span> AndroidManifest.xml <span class=\"token punctuation\">\\\\<\/span><br \/>\n  app\/build\/outputs\/apk\/release\/app-release.apk <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#034;E: permission&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u9884\u671f&#xff1a;\u4ec5 uses-permission \u884c&#xff0c;\u65e0 E: permission \u884c<\/span><br \/>\naapt2 dump xmltree <span class=\"token parameter variable\">&#8211;file<\/span> AndroidManifest.xml <span class=\"token punctuation\">\\\\<\/span><br \/>\n  app\/build\/outputs\/apk\/release\/app-release.apk <span class=\"token operator\">|<\/span> <span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-i<\/span> <span class=\"token string\">&#034;ai.aci&#034;<\/span><\/p>\n<p>\u82e5 grep -E &#034;E: permission&#034; \u4ecd\u6253\u51fa ai.aci.permission.*&#xff0c;\u8bf4\u660e\u5e93\u5e26\u5165\u7684\u5b9a\u4e49\u6ca1\u5265\u5e72\u51c0&#xff0c;\u56de\u53bb\u8865 tools:node&#061;&#034;remove&#034;\u3002<\/p>\n<h4>16.5 \u5b89\u88c5 \/ \u53d1\u5e03\u6ce8\u610f\u4e8b\u9879<\/h4>\n<ul>\n<li>\u5347\u7ea7\u524d\u5148\u5378\u8f7d\u65e7\u7248\u53d7\u63a7\u7aef&#xff1a;\u65e7\u7248\u5b9a\u4e49\u4e86\u51b2\u7a81\u6743\u9650&#xff1b;\u4e14\u82e5\u65e7\u7248\u662f Debug \u7b7e\u540d\u3001\u65b0\u7248\u662f Release \u7b7e\u540d&#xff0c;\u5f02\u7b7e\u540d\u8986\u76d6\u5b89\u88c5\u4f1a INSTALL_FAILED_UPDATE_INCOMPATIBLE\u3002\u5f7b\u5e95\u5378\u8f7d\u6700\u7a33\u59a5\u3002<\/li>\n<li>\u540c\u7b7e\u540d\u53ef\u8986\u76d6&#xff1a;Release\u2192Release&#xff08;\u540c\u4e00 release-key.jks&#xff09;\u53ef\u6b63\u5e38\u8986\u76d6\u66f4\u65b0&#xff1b;Debug\u2192Release \u5f02\u7b7e\u540d\u5fc5\u987b\u5378\u8f7d\u540e\u91cd\u88c5\u3002<\/li>\n<li>ACI \u751f\u6548\u524d\u63d0&#xff1a;\u63a7\u5236\u7aef ZorvAI \u5df2\u5b89\u88c5\u5e76\u6388\u6743&#xff1b;\u53d7\u63a7\u7aef\u901a\u8fc7 uses-permission \u5f15\u7528\u5176\u6743\u9650&#xff0c;\u7ed1\u5b9a service \u65f6\u7531\u7cfb\u7edf\u6821\u9a8c\u8c03\u7528\u65b9\u662f\u5426\u6301\u6709\u8be5\u6743\u9650\u3002<\/li>\n<\/ul>\n<h4>16.6 \u7ed9\u5f00\u53d1\u8005\u6587\u6863\u7684\u66f4\u65b0\u8981\u70b9&#xff08;\u6458\u8981&#xff09;<\/h4>\n<li>\u81ea\u5b9a\u4e49\u6743\u9650\u300c\u540c\u540d &#043; \u5f02\u7b7e\u540d &#043; \u53cc\u65b9\u90fd\u5b9a\u4e49\u300d\u5fc5\u51b2\u7a81&#xff0c;\u4e0e protectionLevel \u65e0\u5173\u3002<\/li>\n<li>ACI \u53d7\u63a7\u7aef\u4e0d\u5e94\u5b9a\u4e49 ai.aci.permission.*&#xff0c;\u5b9a\u4e49\u6743\u5f52\u63a7\u5236\u7aef&#xff1b;\u53d7\u63a7\u7aef\u4ec5 uses-permission \u5f15\u7528 &#043; service \u4e0a android:permission \u6821\u9a8c\u3002<\/li>\n<li>\u5e93\u6a21\u5757\u5e26\u5165\u7684 &lt;permission&gt; \u5fc5\u987b\u7528 tools:node&#061;&#034;remove&#034; \u5728\u6d88\u8d39\u7aef Manifest \u5265\u9664&#xff0c;\u5426\u5219\u5408\u5e76\u540e\u91cd\u590d\u5b9a\u4e49\u3002<\/li>\n<li>\u53d1\u5e03\u524d\u7528 aapt2 \u6821\u9a8c\u5408\u5e76 Manifest&#xff0c;\u786e\u8ba4\u65e0 ai.aci.permission.* \u5b9a\u4e49\u8282\u70b9\u3002<\/li>\n<li>\u7248\u672c\u5347\u7ea7\u6ce8\u610f Debug\/Release \u7b7e\u540d\u5dee\u5f02&#xff0c;\u8de8\u7b7e\u540d\u5b89\u88c5\u9700\u5148\u5378\u8f7d\u3002<\/li>\n<hr \/>\n<p>\u672c\u624b\u518c\u7531\u8f6f\u4ef6\u5de5\u574a\u57fa\u4e8e aci-core \u6e90\u7801\u4e0e Zorv AI \u771f\u5b9e\u63a5\u5165\u7ecf\u9a8c\u6574\u7406\u3002\u534f\u8bae\u7ec6\u8282\u4ee5 ACI_PROTOCOL.md&#xff08;\u5f00\u6e90\u5206\u652f&#xff09;\u4e3a\u51c6\u3002 \u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7248\u672c&#xff1a;v1.0.14&#xff08;\u80fd\u529b\u6e05\u5355\u540c\u6b65 ZorvAI \u6d4f\u89c8\u5668 v1.0.14&#xff1b;\u65b0\u589e \u00a715 HTTP \u4f20\u8f93 \/ http_request \u00b7 \u5c40\u57df\u7f51\u660e\u6587&#xff09; \u9002\u7528 SDK&#xff1a;aci-core \u6700\u540e\u66f4\u65b0&#xff1a;2026-08-10&#xff08;v1.0.25 \u65b0\u589e\u8bed\u4e49\u70b9\u51fb\u95ed\u73af ui_snapshot \/ tap&#xff09; \u672c\u6587\u6863\u9762\u5411\u5e0c\u671b\u8ba9\u81ea\u5df1\u7684 Android App \u88ab Zorv AI&amp;#xff08<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[50],"topic":[],"class_list":["post-93696","post","type-post","status-publish","format-standard","hentry","category-server","tag-50"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/93696.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u7248\u672c&#xff1a;v1.0.14&#xff08;\u80fd\u529b\u6e05\u5355\u540c\u6b65 ZorvAI \u6d4f\u89c8\u5668 v1.0.14&#xff1b;\u65b0\u589e \u00a715 HTTP \u4f20\u8f93 \/ http_request \u00b7 \u5c40\u57df\u7f51\u660e\u6587&#xff09; \u9002\u7528 SDK&#xff1a;aci-core \u6700\u540e\u66f4\u65b0&#xff1a;2026-08-10&#xff08;v1.0.25 \u65b0\u589e\u8bed\u4e49\u70b9\u51fb\u95ed\u73af ui_snapshot \/ tap&#xff09; \u672c\u6587\u6863\u9762\u5411\u5e0c\u671b\u8ba9\u81ea\u5df1\u7684 Android App \u88ab Zorv AI&amp;#xff08\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/93696.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-12T20:40:42+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/93696.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/93696.html\",\"name\":\"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-12T20:40:42+00:00\",\"dateModified\":\"2026-08-12T20:40:42+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/93696.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/93696.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/93696.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/93696.html","og_locale":"zh_CN","og_type":"article","og_title":"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u7248\u672c&#xff1a;v1.0.14&#xff08;\u80fd\u529b\u6e05\u5355\u540c\u6b65 ZorvAI \u6d4f\u89c8\u5668 v1.0.14&#xff1b;\u65b0\u589e \u00a715 HTTP \u4f20\u8f93 \/ http_request \u00b7 \u5c40\u57df\u7f51\u660e\u6587&#xff09; \u9002\u7528 SDK&#xff1a;aci-core \u6700\u540e\u66f4\u65b0&#xff1a;2026-08-10&#xff08;v1.0.25 \u65b0\u589e\u8bed\u4e49\u70b9\u51fb\u95ed\u73af ui_snapshot \/ tap&#xff09; \u672c\u6587\u6863\u9762\u5411\u5e0c\u671b\u8ba9\u81ea\u5df1\u7684 Android App \u88ab Zorv AI&amp;#xff08","og_url":"https:\/\/www.wsisp.com\/helps\/93696.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-12T20:40:42+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"16 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/93696.html","url":"https:\/\/www.wsisp.com\/helps\/93696.html","name":"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-12T20:40:42+00:00","dateModified":"2026-08-12T20:40:42+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/93696.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/93696.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/93696.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"Zorv AI \u00b7 ACI \u5f00\u53d1\u8005\u624b\u518c\uff08Agent Capability Interface\uff09"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/93696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=93696"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/93696\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=93696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=93696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=93696"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=93696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}