<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>H5开发工具 - 网页打包, 全景VR,  AI助手,  APK加固混淆, JS加密混淆保护技术分享</title><link>https://www.h5pack.com/</link><description></description><item><title>安卓开发者模式和无线调试详解 - 附各厂商手机打开教程</title><link>https://www.h5pack.com/post/android-developer-mode-wireless-debugging-zblog.html</link><description>&lt;h1&gt;安卓开发者模式和无线调试详解&lt;/h1&gt;&lt;p&gt;开发者模式是安卓系统隐藏的高级设置集合，不是 Root。它适合应用安装验证、日志采集、投屏控制和自动化测试。无线调试则让 ADB 在同一 Wi-Fi 局域网中工作。&lt;/p&gt;&lt;h2&gt;使用场景&lt;/h2&gt;&lt;p&gt;安装未上架 APK：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;adb&amp;nbsp;install&amp;nbsp;app-release.apk&lt;/pre&gt;&lt;p&gt;应用闪退时使用 &lt;code&gt;adb logcat&lt;/code&gt; 抓日志；scrcpy 需要调试权限进行投屏和反向控制。批量测试、多设备操作，以及 &lt;code&gt;adb screencap&lt;/code&gt;、&lt;code&gt;adb screenrecord&lt;/code&gt; 的自动截图录屏也属于常见用途。&lt;/p&gt;&lt;p&gt;还可以调整窗口动画缩放、过渡动画缩放、动画程序时长缩放、最小宽度、USB 调试（安全设置）、显示触摸操作和强制 GPU 渲染。停用预装应用可用 &lt;code&gt;pm disable-user&lt;/code&gt;，但只处理明确知道用途的应用。&lt;/p&gt;&lt;p&gt;USB 调试稳定、速度快但需要数据线；无线调试不占接口，可边充电边调试并连接多台设备，代价是首次配对且受 Wi-Fi 质量影响。&lt;/p&gt;&lt;h2&gt;入口开启&lt;/h2&gt;&lt;p&gt;设置 → 关于手机/关于本机/我的设备 → 版本号、软件版本、编译编号、OS 版本或 MIUI 版本 → 快速连续点击 7 次 → 输入锁屏密码。成功提示出现后，开发者选项会常驻。点击无反应时重新快速点击。&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;系统&lt;/th&gt;&lt;th&gt;版本号&lt;/th&gt;&lt;th&gt;开发者选项&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;小米/Redmi（MIUI、澎湃OS）&lt;/td&gt;&lt;td&gt;我的设备 → 全部参数 → OS 版本；旧版 MIUI 版本&lt;/td&gt;&lt;td&gt;更多设置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;华为/荣耀（EMUI、HarmonyOS、MagicOS）&lt;/td&gt;&lt;td&gt;关于手机 → 版本号&lt;/td&gt;&lt;td&gt;系统和更新&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OPPO/一加（ColorOS、OxygenOS）&lt;/td&gt;&lt;td&gt;关于本机 → 版本信息 → 版本号&lt;/td&gt;&lt;td&gt;其他设置或系统设置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;realme（realme UI）&lt;/td&gt;&lt;td&gt;关于手机 → 版本信息 → 版本号&lt;/td&gt;&lt;td&gt;系统设置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;vivo/iQOO（FuntouchOS、OriginOS）&lt;/td&gt;&lt;td&gt;系统管理 → 关于手机 → 软件版本号&lt;/td&gt;&lt;td&gt;系统管理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;三星（One UI）&lt;/td&gt;&lt;td&gt;关于手机 → 软件信息 → 编译编号&lt;/td&gt;&lt;td&gt;设置最底部&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pixel/原生 Android&lt;/td&gt;&lt;td&gt;关于手机 → 版本号&lt;/td&gt;&lt;td&gt;系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;摩托罗拉/诺基亚/索尼&lt;/td&gt;&lt;td&gt;关于手机 → 版本号或编译编号&lt;/td&gt;&lt;td&gt;系统 → 高级&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;各版本菜单可能不同，设置搜索“开发者”或“版本号”更可靠。小米需要点 OS 版本 7 次，再从“设置 → 更多设置”进入开发者选项。&lt;/p&gt;&lt;h2&gt;USB 调试&lt;/h2&gt;&lt;p&gt;开发者选项中打开 USB 调试，数据线连接电脑后确认授权，勾选“一律允许”并点击允许。执行 &lt;code&gt;adb devices&lt;/code&gt;，看到序列号表示成功。若 &lt;code&gt;adb devices&lt;/code&gt; 为 &lt;code&gt;unauthorized&lt;/code&gt;，重新授权；必要时选择“传输文件（MTP）”。&lt;/p&gt;&lt;h2&gt;Android 11+ 无线连接&lt;/h2&gt;&lt;p&gt;Android 11（API 30）起支持原生无线调试。手机和电脑接入同一 Wi-Fi，打开“无线调试”或“通过 Wi-Fi 调试”。开关灰色时先连接 Wi-Fi。&lt;/p&gt;&lt;p&gt;进入“使用配对码配对设备”，记录 IP 地址、配对端口和 6 位配对码（如 &lt;code&gt;192.168.1.20:37265&lt;/code&gt;），在 platform-tools 目录执行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;adb&amp;nbsp;pair&amp;nbsp;192.168.1.20:37265&lt;/pre&gt;&lt;p&gt;输入配对码并确认出现 &lt;code&gt;Successfully paired to ...&lt;/code&gt;。随后使用无线调试主页面的连接端口执行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;adb&amp;nbsp;connect&amp;nbsp;192.168.1.20:5555&lt;/pre&gt;&lt;p&gt;验证：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;adb&amp;nbsp;devices&lt;/pre&gt;&lt;p&gt;看到 &lt;code&gt;192.168.1.20:5555 &amp;nbsp; &amp;nbsp;device&lt;/code&gt; 即成功，&lt;code&gt;adb install&lt;/code&gt;、&lt;code&gt;adb logcat&lt;/code&gt; 和 scrcpy 可直接使用。配对码一次性生成；下次通常只需 &lt;code&gt;adb connect&lt;/code&gt;。&lt;/p&gt;&lt;h2&gt;旧系统方案&lt;/h2&gt;&lt;p&gt;Android 10 及以下或没有入口的 ROM，需要先插线。开启 USB 调试并确认 &lt;code&gt;adb devices&lt;/code&gt; 识别设备，在 Wi-Fi 状态信息中查 IP，执行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;adb&amp;nbsp;tcpip&amp;nbsp;5555&lt;/pre&gt;&lt;p&gt;拔线后执行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;adb&amp;nbsp;connect&amp;nbsp;192.168.1.20:5555
adb&amp;nbsp;devices&lt;/pre&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;这是 USB 到 TCP 的切换。手机重启后重新插线执行 &lt;code&gt;adb tcpip 5555&lt;/code&gt;。关闭连接执行&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-。&quot;&gt;bash&amp;nbsp;adb&amp;nbsp;disconnect&amp;nbsp;192.168.1.20:5555&lt;/pre&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;故障排查&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;无线调试灰色时先连接 Wi-Fi；老版 MIUI、EMUI 没有入口时使用 `adb tcpip`。adb 失败或 offline 时，检查同一局域网、AP 隔离、防火墙、端口、adb 版本及是否使用主页面连接端口。切换 Wi-Fi、休眠或离开网络后重新 `adb connect`。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;配对失败时使用最新 platform-tools，Android 11 建议 adb 30.0.0 以上；配对码过期就重新生成，电脑上多个 adb 版本要统一。找不到开发者选项可搜索设置；企业或 MDM 管理设备可能禁用它。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;开发者模式本身几乎不耗电，但无线调试会监听端口。完成后关闭 USB 调试和无线调试，不在公共 Wi-Fi 开启，不熟悉的实验选项保持默认。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;小结&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Android 11+ 用 `adb pair`、`adb connect` 连接；老机型用 `adb tcpip 5555`，重启后需重新插线。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;相关阅读：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;a href=&quot;https://leapever.com/tutorial/apk-obfuscator-settings-guide&quot; target=&quot;_blank&quot;&gt;APK混淆加密配置教程&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;a href=&quot;https://leapever.com/tutorial/apk-obfuscator-android-apk-protection&quot; target=&quot;_blank&quot;&gt;APK为什么需要加密混淆&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 29 Sep 2026 20:55:09 +0800</pubDate></item><item><title>APK混淆重命名模式的选择指南</title><link>https://www.h5pack.com/post/apk-obfuscation-rename-modes.html</link><description>&lt;p&gt;在APK加固保护APK的各项选项中，重命名是最基础也是最直接打击可读性的一环：把类名、方法名、成员变量名全部替换成无意义的随机名称，让反编译出来的人再也无法「见名知义」。但很多人没有意识到，&lt;strong&gt;随机名称用什么风格的字符，防护效果和兼容性会差很多&lt;/strong&gt;——同样是重命名，&lt;code&gt;k3f8xq&lt;/code&gt; 和一串肉眼看不见的零宽字符，给逆向者的阅读体验完全不是一个量级。&lt;/p&gt;&lt;!-- truncate --&gt;&lt;p&gt;本文围绕&lt;a href=&quot;https://apkobf.leapever.com&quot;&gt;安卓APK资源混淆加密重签名工具&lt;/a&gt;提供的 6 种重命名模式，逐一讲清每种模式的名称效果、防护特点、兼容性风险，以及什么场景该选什么，帮助你把这个看似不起眼的选项的价值充分发挥出来。&lt;/p&gt;&lt;h2&gt;一、重命名模式决定什么&lt;/h2&gt;&lt;p&gt;软件中的「重命名模式」位于通用设置分组，它决定的是&lt;strong&gt;混淆器生成随机名称时使用什么风格的字符集&lt;/strong&gt;。所有依赖随机命名的功能都会受它影响，包括：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;类重命名&lt;/strong&gt;：把类名替换为随机名称，隐藏类的原始用途；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;方法重命名&lt;/strong&gt;：把方法名替换为随机名称，让调用逻辑失去语义；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;域重命名&lt;/strong&gt;：把成员变量（字段）名替换为随机名称，隐藏变量含义；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;内部包名混淆&lt;/strong&gt;：修改代码内部包结构时，同样使用该字符风格命名。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;换句话说，重命名模式本身不决定「改不改名」，而是决定「改成什么样」。它配合 DEX 代码混淆中的重命名三件套一起工作：不开启重命名功能时模式无效果；开启了重命名，模式就决定了反编译者看到的名字有多「难受」。&lt;/p&gt;&lt;p&gt;与大家熟悉的 ProGuard / R8 对比一下更容易理解：ProGuard 默认把名字改成 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt;、&lt;code&gt;c&lt;/code&gt; 这类极短的小写字母，而本工具的「字母数字」模式生成的是更长的随机组合，其余模式则更进一步，直接跳出常规字符的范畴。&lt;/p&gt;&lt;h2&gt;二、六种模式总览&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;名称效果&lt;/th&gt;&lt;th&gt;防护特点&lt;/th&gt;&lt;th&gt;兼容性&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;字母数字&lt;/td&gt;&lt;td&gt;小写字母和数字组成的随机串&lt;/td&gt;&lt;td&gt;常规乱码，失去语义&lt;/td&gt;&lt;td&gt;最好（默认）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不可见字符&lt;/td&gt;&lt;td&gt;肉眼看不到的零宽字符&lt;/td&gt;&lt;td&gt;名字在反编译工具中近乎消失&lt;/td&gt;&lt;td&gt;有一定风险&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;特殊符号&lt;/td&gt;&lt;td&gt;箭头、数学与几何等符号&lt;/td&gt;&lt;td&gt;显示混乱，难以复制与搜索&lt;/td&gt;&lt;td&gt;有一定风险&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;英文单词&lt;/td&gt;&lt;td&gt;完整英文单词组合的名称&lt;/td&gt;&lt;td&gt;伪装成正常业务代码，隐蔽性强&lt;/td&gt;&lt;td&gt;好&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unicode&lt;/td&gt;&lt;td&gt;中文等CJK字符&lt;/td&gt;&lt;td&gt;满屏生僻字，可读性极差&lt;/td&gt;&lt;td&gt;有一定风险&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;混合模式&lt;/td&gt;&lt;td&gt;每个名称随机选用上述几种风格之一&lt;/td&gt;&lt;td&gt;风格杂乱，无规律可循&lt;/td&gt;&lt;td&gt;视组合而定&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;下面逐一展开。&lt;/p&gt;&lt;h2&gt;三、字母数字：默认选项，兼容性之王&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;名称效果&lt;/strong&gt;：由小写字母和数字组成的随机字符串，首字符为字母，例如 &lt;code&gt;k3f8xq&lt;/code&gt;、&lt;code&gt;b7m2r9&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;这是软件的默认模式，所有关键位置的命名也一律使用它。它的特点是：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;兼容性最好&lt;/strong&gt;：ASCII 字符在任何反编译工具、任何机型、任何应用市场审核流程中都不会出问题；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;防护水平常规&lt;/strong&gt;：名字确实失去了语义，但逆向者早已习惯这类乱码，凭借调用关系和字符串线索依然可以慢慢梳理逻辑；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;适合所有人&lt;/strong&gt;：如果你不确定选什么，或者目标是覆盖大量低端机型、海外市场，选它准没错。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;可以把「字母数字」理解为重命名模式的及格线：它完成了「见名不知义」这个基本任务，但还没有在字符层面为逆向者制造额外的障碍。&lt;/p&gt;&lt;h2&gt;四、不可见字符：让名字「消失」&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;名称效果&lt;/strong&gt;：使用 Unicode 中的零宽字符（如零宽连接符 U+2060、变体选择符 U+FE00~U+FE0F 等）拼成名称。这类字符宽度为零、肉眼完全不可见。&lt;/p&gt;&lt;p&gt;反编译工具中打开处理后的 APK，类名和方法名的位置几乎是&lt;strong&gt;一片空白&lt;/strong&gt;：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;名字看起来不存在，但实际存在，代码完全正常运行；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;想把名字复制出来搜索？复制到剪贴板的就是一串看不见的字符，很难肉眼校对；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;想通过名字定位某个类？列表里全是空白，滚动寻找的体验堪称灾难。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;它是所有模式中&lt;strong&gt;对人工阅读打击最大&lt;/strong&gt;的一种——字母数字好歹还能读，零宽字符是直接剥夺了「看」的可能。需要注意的是，个别终端、编辑器或工具对零宽字符的渲染处理不一致，复制粘贴时可能出现异常，所以使用该模式后&lt;strong&gt;务必真机安装验证&lt;/strong&gt;。&lt;/p&gt;&lt;h2&gt;五、特殊符号：视觉混乱，难以检索&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;名称效果&lt;/strong&gt;：使用箭头、数学符号、几何图形等字符拼成名称，例如 &lt;code&gt;→√★≠&lt;/code&gt;、&lt;code&gt;∏≤◆∑&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;它的杀伤力体现在两个层面：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;视觉混乱&lt;/strong&gt;：满屏的 &lt;code&gt;← ↑ ∑ √ ■ ◆&lt;/code&gt; 混在代码里，一眼望去全是符号，大脑处理代码的负担显著加重；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;检索困难&lt;/strong&gt;：这类符号的输入本身就不方便，想在反编译结果中搜索某个符号名称，操作成本远高于普通字母。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;相比零宽字符，特殊符号是「看得见但看着难受」的路线，对反编译工具的兼容性风险也类似——大多数主流工具可以正常显示，但个别环境可能出现乱码或复制异常，同样建议发布前真机验证。&lt;/p&gt;&lt;h2&gt;六、英文单词：伪装成正常代码的「反直觉」模式&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;名称效果&lt;/strong&gt;：由真实英文单词（动词 + 名词）组合拼接而成，例如 &lt;code&gt;validateLicenseFetchToken&lt;/code&gt;、&lt;code&gt;loadBitmapRenderCanvas&lt;/code&gt;、&lt;code&gt;connectEndpointRetryRequest&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;这是最特别的一种模式，思路与其他模式完全相反——&lt;strong&gt;不把名字变乱，而是把名字变「正常」&lt;/strong&gt;：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;反编译者看到 &lt;code&gt;refreshSubscription&lt;/code&gt;、&lt;code&gt;parseExpression&lt;/code&gt; 这样的名字，会下意识认为这是真实的业务代码；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;真正的业务类被淹没在大量「看起来很合理」的假名字中，&lt;strong&gt;无法通过名字的可疑程度（太乱、太短）快速圈定真正的混淆区域&lt;/strong&gt;；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;配合「注入垃圾代码」使用效果加倍：垃圾代码本身就模仿正常业务逻辑的写法，再加上语义自然的随机命名，真假难辨。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;字母数字模式最大的破绽是「乱码一眼就能识别出混淆边界」，逆向者可以直接跳过乱码区域，集中分析仍保留原名的那部分代码。英文单词模式堵死了这条捷径——&lt;strong&gt;它混淆的不是名字本身，而是「这个名字是不是混淆出来的」这个判断&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;对兼容性要求也不高（毕竟都是常规 ASCII 字符），非常适合对隐蔽性有要求、不想让人一眼看出「这个包被加固过」的场景。&lt;/p&gt;&lt;h2&gt;七、Unicode：满屏生僻字&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;名称效果&lt;/strong&gt;：从 CJK 统一汉字字符集中随机取字拼成名称，反编译后看到的是类似 &lt;code&gt;湥硺匢&lt;/code&gt; 这样没有任何语义关联的汉字组合。&lt;/p&gt;&lt;p&gt;它的特点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;可读性极差&lt;/strong&gt;：每个字都认识，但组合起来毫无意义，而且大量生僻字会显著拖慢阅读速度；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;搜索定位困难&lt;/strong&gt;：需要在反编译工具中输入这些字符才能检索，操作繁琐；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;与中文语境冲突&lt;/strong&gt;：如果逆向者用关键词（如 &lt;code&gt;pay&lt;/code&gt;、&lt;code&gt;login&lt;/code&gt;）检索代码，这类名字天然免疫。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;中文开发者看到满屏的随机汉字，往往比看到乱码更烦躁——因为汉字自带语义预期，而随机组合彻底打破了这个预期。兼容性方面的注意事项与特殊符号类似，个别环境可能出现显示或复制问题，发布前请验证。&lt;/p&gt;&lt;h2&gt;八、混合模式：不按套路出牌&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;名称效果&lt;/strong&gt;：每生成一个名称，都从前面的五种模式中随机选用一种。最终反编译出来的代码里，字母数字、零宽空白、特殊符号、英文单词、随机汉字&lt;strong&gt;混杂在一起&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;它解决的是一个很实际的问题：单一模式的名称虽然难读，但风格统一，逆向者适应一段时间后总能建立阅读习惯。而混合模式下：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;没有任何规律可循，每种风格切换都在打断阅读节奏；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;列表视图里会呈现出「有名字的、空白的、符号的、汉字的」交错排布的奇观，视觉压力拉满；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;无法通过批量替换或脚本快速统一处理这些名称。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;九、反编译效果对比&lt;/h2&gt;&lt;p&gt;配合 DEX 加壳、字符串加密、垃圾代码注入等选项一起使用时，重命名模式带来的可读性破坏会与其他保护叠加，反编译者面对的将是「名字看不懂 + 代码读不通 + 字符串看不到」的完整防线：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790600250311_2f4ccd1f.png&quot; alt=&quot;开启混淆加固后的反编译结果&quot;/&gt;&lt;/p&gt;&lt;h2&gt;十、怎么选：按场景对号入座&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情况&lt;/th&gt;&lt;th&gt;推荐模式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;首次使用，或不确定选什么&lt;/td&gt;&lt;td&gt;字母数字&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;目标机型复杂、覆盖海外市场、需要过应用市场审核&lt;/td&gt;&lt;td&gt;字母数字&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不想让人一眼看出包被加固过&lt;/td&gt;&lt;td&gt;英文单词&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;追求极致的人工阅读门槛&lt;/td&gt;&lt;td&gt;不可见字符&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;希望名字难以复制、检索&lt;/td&gt;&lt;td&gt;特殊符号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逆向者大概率是中文背景&lt;/td&gt;&lt;td&gt;Unicode&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;几条通用建议：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;从字母数字开始&lt;/strong&gt;：先用默认模式跑通「处理 → 安装 → 业务回归」的完整流程，确认稳定后再切换其他模式测试；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;英文单词适合作为进阶首选&lt;/strong&gt;：它在防护强度和兼容性之间取得了很好的平衡，且不会在审核环节引入额外变量；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;激进模式务必真机验证&lt;/strong&gt;：不可见字符、特殊符号、Unicode 的保护效果更强，但对个别机型、应用市场审核或第三方工具有概率出现显示、复制或兼容问题，&lt;strong&gt;发布前请务必安装验证&lt;/strong&gt;；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;配合随机种子使用&lt;/strong&gt;：填写随机种子后，相同 APK、相同配置、相同种子会得到完全一致的混淆结果，方便对不同模式的处理结果做可复现的对比测试。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;十一、注意事项&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;为保证 APK 能够正常安装运行，凡是&lt;strong&gt;组件类名、应用包名、资源名、XML 命名空间&lt;/strong&gt;等关键位置，都会自动使用普通的字母数字，不受所选模式影响。这是软件为保证兼容性做的兜底，不需要手动干预。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;重命名只作用于参与混淆的代码，被 &lt;a href=&quot;https://apkobf.leapever.com/docs/dex-ignore-list&quot;&gt;DEX 忽略列表&lt;/a&gt; 跳过的第三方 SDK 不会被重命名。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果项目使用了反射、JNI、插件化、热修复，或代码里写死了类名/方法名字符串，请把相关包加入 DEX 忽略列表后再处理，这与选择哪种重命名模式无关，但同样重要。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;十二、常见问题&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：重命名模式和 ProGuard 的混淆有什么区别？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ProGuard/R8 在源码构建阶段工作，默认把名字缩短为 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt;、&lt;code&gt;c&lt;/code&gt;；本工具在成品 APK 上工作，无需源码和构建脚本，且提供 6 种名称风格可选。两者可以叠加使用——你的 APK 即使已经过 ProGuard 混淆，也可以再用本工具做第二层重命名和其他加固。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：哪种模式防护强度最高？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对人工阅读的打击程度：不可见字符 &amp;gt; 混合模式 ≈ 特殊符号 ≈ Unicode &amp;gt; 英文单词 &amp;gt; 字母数字。但「英文单词」在对抗「快速定位混淆区域」这件事上有独特的价值。强度和隐蔽性是两个维度，按需选择。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：为什么有些位置的名字没有变成所选模式的风格？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是软件的兼容性兜底机制：组件类名、应用包名、资源名、XML 命名空间等关键位置必须使用常规字母数字，否则 APK 无法正常安装运行，软件会自动处理，无需干预。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：换了重命名模式后 APK 闪退怎么办？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先用「字母数字」模式重试，确认是模式引起的兼容性问题后，优先考虑「英文单词」这类同样基于 ASCII 的模式；同时检查闪退是否由反射、JNI 调用引起，必要时把相关包加入 DEX 忽略列表。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：不同模式会影响包体积吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;影响很小。零宽字符、特殊符号、CJK 字符在 DEX 中以 UTF-8 编码存储时会占用更多字节，但重命名名称本身很短，对整体体积的影响可以忽略；相比之下「注入垃圾代码」等选项对体积的影响要大得多。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：批量处理时每个包可以用不同模式吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;批量处理共用一套配置，因此所有 APK 使用同一重命名模式。如需不同模式，分批处理即可。配合随机种子时，软件会为每个 APK 自动派生不同的种子，保证各包结果稳定且互不相同。&lt;/p&gt;&lt;h2&gt;小结&lt;/h2&gt;&lt;p&gt;重命名模式是 APK 混淆中「低成本高收益」的典型选项：切换一个下拉框，就能让人工逆向的阅读成本翻倍增长。&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;字母数字&lt;/strong&gt;是稳妥的默认选择，兼容性无忧；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;不可见字符、特殊符号、Unicode&lt;/strong&gt; 在字符层面制造阅读和检索障碍，打击的是「看」和「找」；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;英文单词&lt;/strong&gt;反其道而行之，伪装成正常代码，打击的是「分辨」；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;混合模式&lt;/strong&gt;把以上全部随机组合。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;选好模式、处理完成后，别忘了最后一步：装到真机上把核心业务跑一遍。加固的目标永远是抬高逆向成本，而不是追求绝对安全，在防护强度与稳定性之间找到自己项目能接受的平衡点，才是可持续的做法。&lt;/p&gt;&lt;h2&gt;相关链接&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://apkobf.leapever.com/&quot;&gt;点击进入下载页面&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://apkobf.leapever.com/docs/settings&quot;&gt;完整设置说明文档&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://apkobf.leapever.com/blog/apk-obfuscator-settings-guide&quot;&gt;全部混淆选项配置详解&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://apkobf.leapever.com/docs/dex-ignore-list&quot;&gt;DEX 忽略列表说明&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Mon, 28 Sep 2026 20:57:29 +0800</pubDate></item><item><title>安卓APK混淆加固选项详解</title><link>https://www.h5pack.com/post/android-apk-obfuscation-settings-zblog.html</link><description>&lt;p&gt;打开安卓APK资源混淆加密重签名工具 &lt;a href=&quot;https://apkobf.leapever.com&quot;&gt;工具入口&lt;/a&gt; 后，不要被大量开关吓到。合理配置的核心是先保证安装和运行，再针对代码、资源、运行时和包结构逐层增加保护。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790474882200_3d37adf8.png&quot; alt=&quot;安卓APK资源混淆加密重签名工具主界面&quot;/&gt;&lt;/p&gt;&lt;h2&gt;处理模式&lt;/h2&gt;&lt;p&gt;全量处理按照解包→混淆→重编译执行，支持全部选项；轻量处理不解包，速度快、风险低，适合解包失败、加固后闪退或急需交付，但只支持部分选项，属于专业版。切换到轻量模式时，仅全量支持的选项会自动关闭。默认组合兼容性最高。&lt;/p&gt;&lt;h2&gt;通用设置&lt;/h2&gt;&lt;p&gt;应用名称不能包含 &lt;code&gt;&amp;lt;&lt;/code&gt;、&lt;code&gt;&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;#39;&lt;/code&gt;、&lt;code&gt;&amp;quot;&lt;/code&gt;、&lt;code&gt;&amp;amp;&lt;/code&gt;。包名只能由字母、数字、点号和下划线组成，至少两段且每段以字母开头，例如 &lt;code&gt;com.example.app&lt;/code&gt;。版本名不能为空，版本码为1~2100000000的整数；批量处理不支持修改名称、包名和版本号。&lt;/p&gt;&lt;p&gt;修改包名后不能覆盖安装原包，推送、支付、地图、统计等第三方配置要同步更新。“生成随机包名”“自动随机”可以生成或自动更换包名，“批量不改文件名”沿用原APK文件名。增加包体积填写0~1024MB，0表示不增加。&lt;/p&gt;&lt;p&gt;随机种子留空时结果每次不同；填写整数后，在相同APK、配置和种子下可生成一致的随机名称、资源和处理结果，适合复现与追溯。它不能与“自动重置证书”同时使用，不同软件版本的随机算法不保证一致。&lt;/p&gt;&lt;p&gt;APK必须重新签名，可用内建证书或“添加证书”导入自有证书。“重置证书”会生成新证书，新包无法覆盖旧包；“自动重置”每次更换证书，与随机种子互斥。&lt;/p&gt;&lt;h2&gt;重命名与DEX保护&lt;/h2&gt;&lt;p&gt;重命名模式包括字母数字、不可见字符、特殊符号、英文单词、Unicode、混合模式。字母数字兼容性最好，混合模式属于专业版。组件类名、应用包名、资源名和XML命名空间等关键位置仍使用普通字母数字，其他模式发布前务必真机验证。&lt;/p&gt;&lt;p&gt;类重命名、方法重命名、域重命名会同步修改引用，建议同时开启。反射、JNI、插件化、热修复或硬编码名称应加入&lt;a href=&quot;https://apkobf.leapever.com/docs/dex-ignore-list&quot;&gt;DEX忽略列表&lt;/a&gt;。注入垃圾代码会增加成体系的垃圾类和方法、体积及耗时，但不会超出DEX容量；垃圾指令、分支、跳转和指令乱序会扰乱代码流，通常可以开启。调用隐藏包装调用关系，字符串加密在运行时解密URL、参数、密钥和提示文案。&lt;/p&gt;&lt;p&gt;DEX加壳保护静态代码，DEX文件加壳增强进一步强化，属于专业版并自动启用DEX加壳。DEX拆分随机拆成多份，So文件加密保护C/C++代码。加壳属于高侵入性保护，需完整回归；少数国外小众杀毒软件提示有壳或误报属于常见现象。&lt;/p&gt;&lt;h2&gt;资源保护&lt;/h2&gt;&lt;p&gt;资源名称混淆处理 &lt;code&gt;res&lt;/code&gt;，增强版提高随机程度并属于专业版。图片资源混淆处理 &lt;code&gt;res&lt;/code&gt;、&lt;code&gt;assets&lt;/code&gt;，改变特征值但肉眼几乎无差异，点九图不处理。文本资源混淆处理 &lt;code&gt;assets&lt;/code&gt; 的html、js、css、json；XML混淆处理Manifest及 &lt;code&gt;res&lt;/code&gt; 下XML并调整结构。&lt;/p&gt;&lt;p&gt;内部包名混淆隐藏目录组织。Assets加密处理 &lt;code&gt;assets&lt;/code&gt; 中符合条件的文件；JS加密混淆保护H5和混合开发脚本，增强版为专业版并自动启用基础项；随机资源注入增加资源数量和结构复杂度。&lt;/p&gt;&lt;h2&gt;防篡改与包结构&lt;/h2&gt;&lt;p&gt;包名防修改、APK防重签、反调试、VPN检测和ROOT检测都会在检测异常后退出。测试包建议关闭；代理、VPN、ROOT设备和抓包联调时，必须关闭对应检测。&lt;/p&gt;&lt;p&gt;防止反编译会改变包结构，APK文件魔改修改整体结构；targetSdkVersion大于等于30时，魔改包不能安装在Android 11及更高版本。APK伪加密使部分工具无法识别内容，“伪加密兼容安卓8”兼容Android 8但强度略低，属于专业版并自动启用基础项。&lt;/p&gt;&lt;p&gt;ARSC魔改处理资源索引，DEX魔改处理DEX结构且轻量模式支持；不要对已处理包重复执行DEX魔改。APK高级保护处理资源索引和Manifest，属于专业版实验性功能。APK垃圾注解增加干扰信息，文件时间混淆修改时间戳，使用随机种子时会自动处理时间。&lt;/p&gt;&lt;p&gt;资源防解压处理 &lt;code&gt;res&lt;/code&gt;，普通解压和反编译工具不能直接提取；强制v2签名，仅支持Android 7.0及以上。移除无用代码、移除日志信息通常建议开启。&lt;/p&gt;&lt;h2&gt;配置建议&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;兼容性优先&lt;/strong&gt;：默认配置，适合首次处理、复杂机型或有兼容问题的APP。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;平衡发布&lt;/strong&gt;：增加字符串加密、调用隐藏、指令乱序、三项重命名、垃圾代码、资源名称/图片/文本混淆、Assets加密、JS加密混淆和两项优化。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;防护优先&lt;/strong&gt;：再增加DEX加壳与增强、DEX/ARSC魔改、防止反编译、So文件加密、APK伪加密、垃圾注解、文件时间混淆；发布前完整真机回归。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;问题收敛&lt;/strong&gt;：轻量处理→关闭类重命名、DEX加壳、DEX魔改→将第三方SDK加入&lt;a href=&quot;https://apkobf.leapever.com/docs/dex-ignore-list&quot;&gt;忽略列表&lt;/a&gt;→关闭ROOT、VPN、反调试→查看诊断日志。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;全选不一定更安全，过度加固会提高闪退、功能异常和应用市场拒审风险。报壳或误报时，可关闭DEX加壳、APK文件魔改和APK伪加密。配置可以保存，也可用“文件→导出配置”迁移；随机种子用于复现。&lt;/p&gt;&lt;h2&gt;结语&lt;/h2&gt;&lt;p&gt;DEX混淆解决代码可读性，资源混淆隐藏业务线索，防篡改阻止异常包运行，文件处理限制反编译工具，随机种子保证可追溯。发布前请安装到真机并验证核心流程。加固的目标是提高逆向成本，而非绝对安全。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://apkobf.leapever.com/&quot;&gt;下载页面&lt;/a&gt;&lt;a href=&quot;https://apkobf.leapever.com/docs/intro&quot;&gt;官方文档&lt;/a&gt;&lt;a href=&quot;https://apkobf.leapever.com/docs/settings&quot;&gt;完整设置说明&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sun, 27 Sep 2026 10:08:01 +0800</pubDate></item><item><title>从 jadx 反编译看 Android APK 加固</title><link>https://www.h5pack.com/post/jadx-android-apk-hardening.html</link><description>&lt;h2&gt;问题从一个反编译结果开始&lt;/h2&gt;&lt;p&gt;安卓 DEX 会保留类名、方法名和字符串常量。开发阶段不容易注意到这一点，但把成品 APK 放进 jadx-gui 后，问题就十分直观了：未加固 APK 的可读性可能远高于预期。&lt;/p&gt;&lt;!-- truncate --&gt;&lt;h2&gt;未加固状态：工程信息几乎裸露&lt;/h2&gt;&lt;p&gt;将 APK 拖入 jadx-gui：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790422527695_1e38349e.png&quot; alt=&quot;未做处理的APK被反编译出可读的Java代码&quot;/&gt;&lt;/p&gt;&lt;p&gt;包名、类名、方法名和字符串常量通常可以直接看到。沿调用链继续追踪，还能还原接口地址和请求参数拼接规则、本地加密与校验算法、授权校验和风控分支。&lt;/p&gt;&lt;p&gt;另外，&lt;code&gt;res&lt;/code&gt; 下的布局 XML、图片素材，以及 &lt;code&gt;assets&lt;/code&gt; 中的 H5 与 JS，也可能成为分析对象。对二次打包、资源搬运和广告 SDK 植入而言，这会显著降低门槛。&lt;/p&gt;&lt;h2&gt;加固之后：静态分析被分层阻断&lt;/h2&gt;&lt;p&gt;针对同一个 APK，执行 DEX 加壳、字符串加密、指令乱序、类/方法/域重命名、资源名称混淆，以及 Assets/JS 加密：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790422527867_0f4aa249.png&quot; alt=&quot;做保护之后的反编译结果&quot;/&gt;&lt;/p&gt;&lt;p&gt;变化主要集中在以下方面：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;DEX 加壳与魔改可能让工具解析失败，只留下壳入口&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;名称被替换，指令顺序被打乱，并混入不可达垃圾分支&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;URL、密钥、接口参数改为运行时解密，静态搜索难以命中&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;res&lt;/code&gt; 目录、文件名和 ARSC 被处理，资源名称不再容易表达业务含义&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;配合防调试、防重签名、包名防修改、ROOT 检测和 VPN 检测，可以在包被修改、附加调试器或处于 ROOT / 系统代理环境时触发闪退。&lt;/p&gt;&lt;p&gt;但边界仍然要明确：&lt;strong&gt;加固的价值在于提高成本，不是承诺绝对不可破解。&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;工具处理范围&lt;/h2&gt;&lt;p&gt;处理对象是成品 APK，源码工程和 Gradle 构建脚本都不需要调整。本文使用的工具：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://apkobf.leapever.com&quot;&gt;安卓APK资源混淆加密重签名工具&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790422528027_cdefe21d.png&quot; alt=&quot;安卓APK资源混淆加密重签名工具主界面&quot;/&gt;&lt;/p&gt;&lt;p&gt;它覆盖四层能力：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;DEX 代码层&lt;/strong&gt;：DEX 加壳与魔改、字符串加密、指令乱序、垃圾指令/分支注入、调用隐藏、DEX 拆分、类/方法/域重命名&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;资源层&lt;/strong&gt;：资源名称混淆（含增强模式）、图片/XML/文本资源混淆、ARSC 魔改、资源防解压、Assets 加密、JS 混淆加密&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;文件结构层&lt;/strong&gt;：APK 文件魔改、伪加密、垃圾注解、文件时间混淆、APK 文件高级保护&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;运行时层&lt;/strong&gt;：反调试、防重签名、包名防修改、ROOT 检测、VPN 检测，以及日志与无用代码清理&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;忽略列表可以避开推送、支付、统计等第三方 SDK。随机种子让相同输入得到一致结果，诊断日志则用于复现和定位问题。程序为 64 位，支持 2G 以上的大型 APK。选项说明见&lt;a href=&quot;https://apkobf.leapever.com/docs/intro&quot;&gt;这个文档&lt;/a&gt;&lt;/p&gt;&lt;p&gt;签名支持内置独立证书，也可以使用自定义 keystore；完成后自动重签名。&lt;/p&gt;&lt;h2&gt;实际流程&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开单个 APK，或用「批量打开文件夹」导入多个包。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;采用默认组合，或根据防护强度启用 DEX 加壳、DEX 魔改、字符串加密、资源名称混淆、So 文件加密、防调试等选项。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;指定输出位置，等待混淆、加固和重签名。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;注意：DEX 加壳、APK 文件魔改、APK 伪加密可能被部分国外小众杀毒软件报壳或误报。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;若新包运行异常，可以先关闭类重命名、DEX 加壳、DEX 魔改，再将第三方 SDK 包名加入忽略列表。&lt;/p&gt;&lt;h2&gt;结语&lt;/h2&gt;&lt;p&gt;jadx 让未加固 APK 的信息暴露一目了然。发布前直接处理成品 APK，不改源码、不配置 Android SDK 或 JDK 环境，也能增加逆向分析的工作量。&lt;/p&gt;</description><pubDate>Sat, 26 Sep 2026 19:35:26 +0800</pubDate></item><item><title>从AAB到APK：转换、签名与加固</title><link>https://www.h5pack.com/post/aab-to-apk-convert-sign-harden.html</link><description>&lt;p&gt;AAB是面向Google Play的发布包，APK则是更适合安装和分发的包。两者不能简单通过修改扩展名互换：AAB需要经过转换，才能得到通用APK。&lt;/p&gt;&lt;p&gt;安卓APK资源混淆加密重签名工具自2.0.0版本起内置AAB转APK功能，运行环境和转换工具均已包含，无需另行配置Java、Android SDK或Gradle。&lt;/p&gt;&lt;p&gt;官网介绍：&lt;a href=&quot;https://apkobf.leapever.com/&quot;&gt;安卓APK资源混淆加密重签名工具官网&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;先判断是否需要转换&lt;/h2&gt;&lt;p&gt;APK是完整安装包，可以直接安装；AAB不能直接安装，Google Play会按设备CPU架构、语言和屏幕密度生成对应的拆分APK。只有一个AAB、却需要测试安装、国内分发或继续加固时，就需要转换。&lt;/p&gt;&lt;h2&gt;准备输入文件&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;工具版本：&lt;strong&gt;2.0.0及以上&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;输入文件：完整的&lt;code&gt;.aab&lt;/code&gt;，例如&lt;code&gt;app-release.aab&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;输出条件：目录可写，并预留比拆分包更多的空间。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;软件不需要联网，也不需要配置环境变量。输出为包含全部资源的通用APK，因此体积通常更大。&lt;/p&gt;&lt;h2&gt;操作过程&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开软件，选择左侧&lt;strong&gt;AAB转APK&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;点击&lt;strong&gt;打开AAB&lt;/strong&gt;，载入&lt;code&gt;.aab&lt;/code&gt;，或在输入框粘贴完整路径。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;软件自动填写同目录下的&lt;code&gt;.apk&lt;/code&gt;。例如输入&lt;code&gt;D:\build\app-release.aab&lt;/code&gt;，默认保存为&lt;code&gt;D:\build\app-release.aab.apk&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;点击&lt;strong&gt;选择路径&lt;/strong&gt;可修改输出位置，但必须填写绝对路径并以&lt;code&gt;.apk&lt;/code&gt;结尾，不能填写文件夹。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;点击&lt;strong&gt;转换&lt;/strong&gt;。处理时间取决于AAB大小，大包可能需要几分钟，也可以在进度窗口取消。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790168355079_f97ed717.png&quot; alt=&quot;AAB转APK功能界面&quot;/&gt;&lt;/p&gt;&lt;ol start=&quot;6&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;看到APK保存路径提示后，即可进入下一步。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;**转换结果未签名。**未签名APK会被安卓系统拒绝安装。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;在同一工具中签名&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;回到&lt;strong&gt;首页&lt;/strong&gt;，点击&lt;strong&gt;打开单个文件&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;选择证书：可直接使用内置证书，或点&lt;strong&gt;重置证书&lt;/strong&gt;生成新的独立证书；自有证书通过&lt;strong&gt;添加证书&lt;/strong&gt;载入&lt;code&gt;.keystore&lt;/code&gt;或&lt;code&gt;.jks&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;按需勾选混淆加固项目。没有明确需求时，保留默认组合即可。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;设置保存路径并点击&lt;strong&gt;开始处理&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;仅签名时可不选额外混淆；APP名称、包名和版本号也能在首页一并修改。&lt;/p&gt;&lt;h2&gt;排查记录&lt;/h2&gt;&lt;h3&gt;AAB文件无效&lt;/h3&gt;&lt;p&gt;应选择完整的&lt;code&gt;.aab&lt;/code&gt;文件，而不是解压后的目录，并检查文件是否已被移动或删除。&lt;/p&gt;&lt;h3&gt;APK保存路径不正确&lt;/h3&gt;&lt;p&gt;例如&lt;code&gt;D:\output\app.apk&lt;/code&gt;这样的绝对路径才符合要求，且必须以&lt;code&gt;.apk&lt;/code&gt;结尾。&lt;/p&gt;&lt;h3&gt;目标文件已存在&lt;/h3&gt;&lt;p&gt;确认后覆盖，或取消并换一个路径。软件会先生成临时文件，成功后再替换目标APK。&lt;/p&gt;&lt;h3&gt;找不到转换工具&lt;/h3&gt;&lt;p&gt;检查安装包是否完整、转换工具是否被杀毒软件删除。必要时重新安装，并将软件目录加入信任列表。&lt;/p&gt;&lt;h3&gt;通用APK为什么更大&lt;/h3&gt;&lt;p&gt;因为它同时包含全部语言、屏幕密度及CPU架构资源，而Google Play下发的是按设备拆分的APK。&lt;/p&gt;&lt;h2&gt;小结&lt;/h2&gt;&lt;p&gt;流程可以概括为：AAB转通用APK、首页签名、按需混淆加固。整个过程不依赖额外Java、Android SDK或Gradle。&lt;/p&gt;</description><pubDate>Wed, 23 Sep 2026 20:59:15 +0800</pubDate></item><item><title>APK混淆器2.0.0完整更新记录</title><link>https://www.h5pack.com/post/apk-obfuscator-2-0-0-release-notes.html</link><description>&lt;p&gt;APK 混淆器 2.0.0 是一次覆盖处理能力与使用体验的版本更新。对需要保护安卓 APK 的开发者而言，AAB 转 APK、可复用配置和诊断日志是最直接的变化。&lt;/p&gt;
&lt;h2&gt;版本入口&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://apkobf.leapever.com/&quot;&gt;下载页面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apkobf.leapever.com/docs/intro&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/09/1790079929452_0dd278a0.png&quot; alt=&quot;APK混淆器2.0.0主界面&quot;&gt;&lt;/p&gt;
&lt;h2&gt;工具简介&lt;/h2&gt;
&lt;p&gt;软件可以处理安卓 APK 的代码和资源文件，提供 APK 加固、DEX 加壳、字符串加密、指令乱序、类/方法/域重命名、资源名称混淆、So 文件加密、Assets 加密、JS 混淆、防反编译、防调试、防重签名和重新签名等能力。&lt;/p&gt;
&lt;p&gt;它无需配置 Android SDK 或 Java 环境，支持单个 APK 和文件夹批量处理，内置独立签名证书，也支持载入自己的签名证书。&lt;/p&gt;
&lt;h2&gt;新增功能&lt;/h2&gt;
&lt;h3&gt;AAB 转 APK&lt;/h3&gt;
&lt;p&gt;AAB 适用于 Google Play 上架，但国内应用市场、测试分发和内测安装通常使用 APK。2.0.0 可以一键将 AAB 转换为可直接安装的 APK，转换后继续完成混淆加固和重签名，省去手动折腾 bundletool 命令行的过程。&lt;/p&gt;
&lt;h3&gt;配置管理&lt;/h3&gt;
&lt;p&gt;全部混淆设置都可以导出为配置文件，在另一台电脑或其他项目中导入。新增的保存与清除功能会保留常用设置，也可以一键恢复默认。团队统一加固标准、多版本发布和更换电脑后的环境恢复都适用。&lt;/p&gt;
&lt;h3&gt;忽略列表&lt;/h3&gt;
&lt;p&gt;忽略列表可自定义跳过代码处理的包名，并提供常用默认列表。推送、支付、统计、广告、地图等第三方 SDK 如存在兼容问题，可以将其排除。&lt;/p&gt;
&lt;h3&gt;随机种子&lt;/h3&gt;
&lt;p&gt;填写随机种子后，相同输入可复现完全一致的混淆结果；留空则每次随机。它可用于复现测试问题和追溯发布版本。&lt;/p&gt;
&lt;h3&gt;诊断日志&lt;/h3&gt;
&lt;p&gt;每轮处理会自动生成详细诊断日志，记录关键处理信息，便于分析 APK 处理失败、安装闪退和运行异常。&lt;/p&gt;
&lt;h3&gt;DEX 魔改与超大包&lt;/h3&gt;
&lt;p&gt;DEX 魔改会改造 DEX 文件结构，可与 DEX 加壳、指令乱序和字符串加密组合使用。软件新增 2G 以上 APK 支持，适合大型游戏、教育类音视频应用和离线地图应用。&lt;/p&gt;
&lt;h2&gt;优化与修复&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;资源混淆内核升级，资源文件名和目录混淆更彻底。&lt;/li&gt;
&lt;li&gt;arsc、manifest 等关键文件的特殊处理增强。&lt;/li&gt;
&lt;li&gt;程序升级为 64 位，大包和长时间批量处理更加稳定。&lt;/li&gt;
&lt;li&gt;界面重新改版，布局清晰，浅色模式显示效果优化。&lt;/li&gt;
&lt;li&gt;安装包体积大幅精简，APK 解包与重编译兼容性提升。&lt;/li&gt;
&lt;li&gt;修复类重命名导致崩溃、部分环境导入证书失败、新版本检测异常，以及多项功能组合兼容问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速操作&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击「打开单个文件」选择本地 APK，或选择「批量打开文件夹」。&lt;/li&gt;
&lt;li&gt;保持默认选项，或按需开启 DEX 加壳、DEX 魔改、字符串加密、资源名称混淆、类重命名、So 文件加密、防调试和防反编译，并设置忽略列表。&lt;/li&gt;
&lt;li&gt;选择输出位置，点击「开始处理」完成混淆、加固和重新签名，再安装到手机验证。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;DEX 加壳、APK 文件魔改、APK 伪加密可能导致部分国外小众杀毒软件报壳或误报病毒，属于正常现象。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;详细说明：&lt;a href=&quot;https://apkobf.leapever.com/docs/settings&quot;&gt;设置说明&lt;/a&gt;、&lt;a href=&quot;https://apkobf.leapever.com/docs/quick-tutorial&quot;&gt;快速使用&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;兼容性问答&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;是否免费升级？&lt;/strong&gt; 所有用户都可以免费更新。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置是否自动迁移？&lt;/strong&gt; 建议升级前记录旧版本选项，升级后重新配置并导出保存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;闪退如何处理？&lt;/strong&gt; 先关闭类重命名、DEX 加壳、DEX 魔改，仅保留默认选项重试；仍异常时加入第三方 SDK 忽略列表并查看诊断日志。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;支持批量和自定义证书吗？&lt;/strong&gt; 支持。批量处理使用「批量打开文件夹」，自定义证书通过「添加自定义证书」载入。2.0.0 修复了部分环境导入证书失败的问题。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;2.0.0 通过 AAB 转 APK、配置复用、随机种子、诊断日志和忽略列表完善工作流，同时以 DEX 魔改、资源混淆内核升级、64 位程序及 2G 以上超大包支持增强处理能力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://apkobf.leapever.com/&quot;&gt;再次进入下载页面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apkobf.leapever.com/docs/intro&quot;&gt;查看官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://csharpobf.leapever.com&quot;&gt;相关阅读：恒盾C#混淆加密大师&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 22 Sep 2026 20:25:29 +0800</pubDate></item><item><title>安卓更新WebView内核方法</title><link>https://www.h5pack.com/post/android-update-webview-methods.html</link><description>&lt;p&gt;用HTML一键打包APK工具生成的安卓APP，内部网页的渲染并不由APP本身负责，而是依赖系统内置的WebView组件。这个组件相当于手机里的浏览器引擎，所有需要加载网页的APP都在共用它。&lt;/p&gt;&lt;p&gt;由于打包工具为了保持APK体积小巧，直接借用系统WebView渲染页面，而不把完整浏览器内核塞进安装包，这就导致同一份页面在一台手机上显示正常，在另一台上却可能变形或报错。出现这种情况，通常不是打包配置的锅，而是两台手机WebView版本差异造成的。&lt;/p&gt;&lt;p&gt;安卓官网链接：&lt;a href=&quot;https://leapever.com/intro/apk-packer&quot;&gt;HTML一键打包APK工具官网&lt;/a&gt;&lt;/p&gt;&lt;!-- truncate --&gt;&lt;h2&gt;WebView版本为何如此关键&lt;/h2&gt;&lt;p&gt;WebView决定了APP支持的网页特性范围。版本越新，支持的HTML、CSS和JavaScript特性越丰富。&lt;/p&gt;&lt;p&gt;常见因版本过旧引发的问题包括：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;CSS新特性（&lt;code&gt;:has()&lt;/code&gt;、容器查询、级联层）不被识别，布局错乱&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;JavaScript新语法（可选链、空值合并、顶层&lt;code&gt;await&lt;/code&gt;）导致脚本执行中断&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;视频或音频编码不兼容，出现无画面或无声&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;新版API（全屏、剪贴板、文件系统）功能失灵&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;安全策略差异造成HTTPS资源被拦截&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;只要把系统WebView更新到较新版本，以上问题通常不需要改一行页面代码就能解决。&lt;/p&gt;&lt;h2&gt;确认当前WebView版本&lt;/h2&gt;&lt;p&gt;动手更新前，先确认手机当前的版本号：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方法一：在系统设置中查看&lt;/strong&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开手机&lt;strong&gt;设置&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;顶部搜索框输入&lt;strong&gt;WebView&lt;/strong&gt;或&lt;strong&gt;Android System WebView&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进入&lt;strong&gt;Android System WebView&lt;/strong&gt;，详情页显示版本号。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;方法二：查看WebView实现（安卓7.0及以上）&lt;/strong&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;进入&lt;strong&gt;设置 → 关于手机&lt;/strong&gt;，连续点击&lt;strong&gt;版本号&lt;/strong&gt;进入开发者模式。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;回到设置，进入&lt;strong&gt;系统 → 开发者选项&lt;/strong&gt;（各品牌位置不同，可搜索）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;找到&lt;strong&gt;WebView实现&lt;/strong&gt;，可看到当前是使用&lt;strong&gt;Android System WebView&lt;/strong&gt;还是&lt;strong&gt;Chrome&lt;/strong&gt;，并支持切换。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;方法三：网页在线检测&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用出问题的APP打开一个在线内核检测页面，页面会显示当前内核版本和支持度。对比正常与异常手机的结果，差异立现。&lt;/p&gt;&lt;h2&gt;通用更新步骤（各品牌通用）&lt;/h2&gt;&lt;p&gt;以下三种方法能覆盖大多数情况，建议优先尝试：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 更新Android System WebView组件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开手机自带应用商店（或Google Play），搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;，如有更新按钮直接点更新。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 更新Chrome浏览器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;安卓7.0以上系统，Chrome可作为WebView实现者。将Chrome更新到最新版，再到开发者选项中将WebView实现切换为Chrome。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 升级系统版本&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;部分厂商将WebView作为系统组件随系统更新推送。如果应用商店找不到WebView，进&lt;strong&gt;设置 → 系统更新&lt;/strong&gt;更新系统。&lt;/p&gt;&lt;h2&gt;各品牌手机详细更新指南&lt;/h2&gt;&lt;p&gt;不同品牌对WebView的打包和更新渠道有差异，以下按品牌逐一说明。&lt;/p&gt;&lt;h3&gt;华为（HarmonyOS / EMUI）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开&lt;strong&gt;华为应用市场&lt;/strong&gt;，搜索&lt;strong&gt;华为浏览器&lt;/strong&gt;并更新。华为机型主要由华为浏览器提供WebView内核。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;支持GMS的机型，可在Google Play搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;单独更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进&lt;strong&gt;设置 → 系统和更新 → 软件更新&lt;/strong&gt;升级系统，内核随之更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;HarmonyOS NEXT（纯鸿蒙）使用自研内核，只能通过系统更新和浏览器更新。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;荣耀（MagicOS）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开&lt;strong&gt;荣耀应用市场&lt;/strong&gt;，搜索&lt;strong&gt;荣耀浏览器&lt;/strong&gt;或&lt;strong&gt;Android System WebView&lt;/strong&gt;更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进&lt;strong&gt;设置 → 系统和更新 → 软件更新&lt;/strong&gt;检查系统更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;安卓7.0以上可在开发者选项切换WebView实现。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;小米 / Redmi（HyperOS / MIUI）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开&lt;strong&gt;小米应用商店&lt;/strong&gt;，搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进&lt;strong&gt;设置 → 我的设备 → 系统版本&lt;/strong&gt;（或关于本机）检查系统更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在&lt;strong&gt;设置 → 更多设置 → 开发者选项 → WebView实现&lt;/strong&gt;中，可切换为Chrome。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;OPPO / 一加 / realme（ColorOS / OxygenOS / realme UI）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开&lt;strong&gt;软件商店&lt;/strong&gt;，搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进&lt;strong&gt;设置 → 软件更新&lt;/strong&gt;（ColorOS为“设置 → 关于本机 → 版本信息”）检查系统更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;一加海外版可直接通过Google Play更新WebView和Chrome。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;vivo / iQOO（OriginOS / Funtouch OS）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开&lt;strong&gt;vivo应用商店&lt;/strong&gt;，搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进&lt;strong&gt;设置 → 系统管理 → 系统升级&lt;/strong&gt;更新系统。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;开发者选项可切换WebView实现。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;三星（One UI）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开&lt;strong&gt;Galaxy Store&lt;/strong&gt;或&lt;strong&gt;Google Play&lt;/strong&gt;，搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;和&lt;strong&gt;Google Chrome&lt;/strong&gt;更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;国行机型进&lt;strong&gt;设置 → 软件更新 → 下载并安装&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;更新后在开发者选项切换即可。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;魅族 / 联想 / 中兴 / 传音等&lt;/h3&gt;&lt;p&gt;这些品牌多采用原生方案：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;自带应用商店搜索&lt;strong&gt;Android System WebView&lt;/strong&gt;更新。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;若无结果，检查&lt;strong&gt;系统更新&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;仍无法更新，安装最新版&lt;strong&gt;Chrome&lt;/strong&gt;，并在开发者选项切换。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;更新后的操作&lt;/h2&gt;&lt;p&gt;更新WebView属于系统级变更，APP&lt;strong&gt;不需要重新打包&lt;/strong&gt;或重装。&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;更新完成后，&lt;strong&gt;重启手机&lt;/strong&gt;，确保系统加载新内核。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;重新打开APP，验证异常页面是否恢复。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;若有缓存，在&lt;strong&gt;设置 → 应用管理&lt;/strong&gt;中找到APP，清除缓存后重试。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;常见问题解答&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;所有网页正常，仅我的APP有问题，是WebView导致的吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很可能是。手机浏览器使用自身完整内核，而APP使用系统WebView，两者版本可能不同。浏览器能打开，不代表APP内的WebView够新。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;应用商店搜不到Android System WebView怎么办？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;部分厂商不上架此组件。先尝试系统更新；若系统已最新，安装最新版Chrome并在开发者选项切换，同样能升级内核。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更新WebView会影响其他APP吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;正面影响——WebView是共享组件，更新后所有使用网页的APP都会受益。更新本身是安全的，但勿安装来路不明的APK。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安卓4.4及以下能更新吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不能。独立WebView更新机制从安卓5.0开始。这类设备只能升级整个系统ROM，建议在代码中做降级处理。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更新后APP仍没变化，怎么办？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;确认开发者选项中的WebView实现指向已更新的组件；重启手机；清除APP缓存。若仍无效，可能是页面代码使用了过于激进的特性，建议为目标机型做降级。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何不依赖用户手机的WebView版本？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用HTML一键打包APK工具时，页面由系统WebView渲染，无法自带内核。实际做法：引导用户更新WebView，并在页面中使用成熟兼容的写法，做好特性检测与降级。&lt;/p&gt;&lt;h2&gt;实用小建议&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;出现兼容问题时，先对比WebView版本，再排查代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;优先使用官方应用商店和系统更新更新WebView，避免第三方包。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;分发前，在一台WebView较旧的设备上做兼容性测试。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;页面开发中避免依赖过于新的特性，必要时做降级。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;相关资源&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/intro/apk-packer&quot;&gt;HTML一键打包APK工具官网&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://api.leapever.com/apkpacker/download&quot;&gt;立即下载HTML一键打包APK工具&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html-apk-user-agent-setting&quot;&gt;HTML打包APK之User Agent设置教程&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html-apk-video-fullscreen-player&quot;&gt;HTML打包APK视频播放教程&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html-apk-camera-video-audio-file-picker&quot;&gt;HTML打包APK文件选择教程&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html-apk-file-download&quot;&gt;HTML打包APK文件下载教程&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Tue, 01 Sep 2026 19:29:14 +0800</pubDate></item><item><title>C#强签名作用及恒盾强签名教程</title><link>https://www.h5pack.com/post/csharp-strong-name-function-tutorial.html</link><description>&lt;p&gt;在使用&lt;a href=&quot;https://csharpobf.leapever.com/&quot;&gt;恒盾C#混淆加密大师&lt;/a&gt;处理 C# DLL 或 EXE 时，如果原始程序集本身带有强名称（Strong Name），混淆处理后原有的强签名会失效。这是因为重命名、流程混淆、字符串加密等功能都会修改程序集内容，而强签名一旦生成，就与文件的二进制内容绑定，任何改动都会让签名校验无法通过。&lt;/p&gt;&lt;p&gt;软件提供的强签名功能，可以在混淆处理完成后，使用你指定的强名称密钥文件（.snk）对输出的 DLL 或 EXE 重新签名。这样处理后的文件既能保留混淆保护，又能拥有有效的强名称签名，方便被其他程序集继续引用，或用于安装到全局程序集缓存（GAC）等需要强名称的场景。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/08/1788181003568_a66c07b6.png&quot; alt=&quot;恒盾C#混淆加密大师强签名配置&quot;/&gt;&lt;/p&gt;&lt;!-- truncate --&gt;&lt;h2&gt;强签名有什么作用&lt;/h2&gt;&lt;p&gt;强签名是 .NET 平台为程序集提供的一种签名机制，通过一对公私钥（保存在 .snk 密钥文件中）为程序集生成数字签名。它的作用主要体现在三个方面：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;唯一标识&lt;/strong&gt;：强名称由程序集名称、版本号、区域性和公钥标记（Public Key Token）共同组成。使用不同密钥签名的同名程序集可以共存，避免与第三方类库发生命名冲突。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;防篡改校验&lt;/strong&gt;：强签名与程序集内容绑定。文件被修改后，签名校验将无法通过，可以用于发现程序集是否被篡改。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;引用绑定&lt;/strong&gt;：当一个强签名程序集引用另一个强签名程序集时，运行时会按&amp;quot;简单名称 + 公钥标记&amp;quot;进行绑定。密钥一致，引用才能正常加载。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;需要注意的是，强签名解决的是&amp;quot;程序集是谁、是否被改动&amp;quot;的问题，它不等于混淆和加密，也不能替代代码保护功能。两者配合使用，才能同时满足&amp;quot;防篡改&amp;quot;和&amp;quot;难反编译&amp;quot;的需求。&lt;/p&gt;&lt;h2&gt;为什么混淆后需要重新签名&lt;/h2&gt;&lt;p&gt;如果输入的 DLL 或 EXE 本身是强签名程序集，混淆处理完成后，文件内容已经发生变化，原有的强名称签名随之失效。此时会出现两类问题：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;引用加载失败&lt;/strong&gt;：其他程序集在编译时记录了对你的 DLL 的强名称引用。签名失效或公钥标记变化后，运行时可能抛出找不到程序集或加载失败的异常。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;无法通过强名称校验&lt;/strong&gt;：需要放入 GAC 或接受签名校验的场合，签名失效的文件会被直接拒绝。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;通过强签名功能，使用与原始程序集相同的 .snk 密钥重新签名，公钥标记保持不变，其他程序集的引用关系得以延续。这也是启用该功能最常见的原因。&lt;/p&gt;&lt;p&gt;如果原始程序本来没有强签名，也可以借助该功能为输出文件补上强签名，例如后续需要将 DLL 安装到 GAC，或公司规范要求所有程序集必须签名时。&lt;/p&gt;&lt;h2&gt;如何生成强名称密钥文件&lt;/h2&gt;&lt;p&gt;强签名需要 .snk 格式的密钥文件。如果项目中已有密钥文件（例如编译时用于签名的 &lt;code&gt;xxx.snk&lt;/code&gt;），直接使用该文件即可。常见的生成方式有两种：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式一：使用命令行工具&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 Visual Studio 的&amp;quot;开发者命令提示符&amp;quot;（Developer Command Prompt）中执行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-text&quot;&gt;sn&amp;nbsp;-k&amp;nbsp;MyKey.snk&lt;/pre&gt;&lt;p&gt;命令会在当前目录生成一个包含公私钥对的密钥文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式二：使用 Visual Studio&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在传统 .NET Framework 项目中，打开&amp;quot;项目属性&amp;quot; → &amp;quot;签名&amp;quot;页，勾选&amp;quot;为程序集签名&amp;quot;，点击&amp;quot;新建&amp;quot;即可生成 .snk 文件。SDK 风格项目（.NET Core / .NET 5+）也可以在项目属性中勾选&amp;quot;为程序集生成强名称&amp;quot;来创建。&lt;/p&gt;&lt;h2&gt;如何使用强签名功能&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开恒盾C#混淆加密大师，切换到&amp;quot;强签名配置&amp;quot;选项卡。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;勾选&amp;quot;启用强签名&amp;quot;，此时密钥文件输入框变为可用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在&amp;quot;强名称密钥文件&amp;quot;处点击&amp;quot;选择文件&amp;quot;，指定用于签名的 .snk 文件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;回到&amp;quot;快速混淆加密&amp;quot;选项卡，选择要处理的 DLL 或 EXE，按需要勾选保护、混淆和重命名等选项。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;设置输出文件路径，点击&amp;quot;开始处理&amp;quot;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;处理完成后，输出的文件即为带有效强名称签名的程序集。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果后续仍需使用相同配置，点击&amp;quot;保存配置&amp;quot;保留当前设置，密钥文件路径会一并保存。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;如果不需要强签名，保持&amp;quot;启用强签名&amp;quot;为未勾选状态即可，输出文件不会执行签名操作。&lt;/p&gt;&lt;h2&gt;哪些场景适合启用强签名&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;原始程序集已带强签名&lt;/strong&gt;：用同一把密钥重新签名，保证混淆后的 DLL 仍能被既有引用方正常加载，这是最主要的场景。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;需要安装到 GAC 的类库&lt;/strong&gt;：放入全局程序集缓存的 DLL 必须具有强名称，混淆后需重新签名才能继续部署。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;对发布文件有完整性要求的场景&lt;/strong&gt;：借助强名称校验机制，便于发现文件是否在分发过程中被篡改。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;团队或客户规范要求&lt;/strong&gt;：部分企业要求所有对外发布的程序集必须强签名，此时可在混淆后统一补签。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;如何确认签名结果&lt;/h2&gt;&lt;p&gt;处理完成后，可以在开发者命令提示符中使用以下命令查看输出文件的公钥标记：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-text&quot;&gt;sn&amp;nbsp;-T&amp;nbsp;输出文件.dll&lt;/pre&gt;&lt;p&gt;将显示的公钥标记与原始程序集对比：使用同一把密钥签名时，两者的公钥标记应一致，说明引用标识已保留。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/08/1788181004151_0bf5300f.png&quot; alt=&quot;使用sn命令查看公钥标记&quot;/&gt;&lt;/p&gt;&lt;h2&gt;使用时需要注意什么&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;妥善保管 .snk 文件&lt;/strong&gt;：密钥文件包含私钥，一旦泄露，他人可以生成与你同标识的程序集。不要将密钥提交到公开仓库或随安装包分发。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;保持密钥一致&lt;/strong&gt;：如果目的是延续原有引用关系，必须使用与原始程序集相同的密钥。更换密钥会改变公钥标记，导致引用方加载失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;强签名不是代码签名证书&lt;/strong&gt;：强签名与 Authenticode 数字签名是两种不同机制，后者需要向证书机构申请，用于标识发布者身份，两者可以同时存在。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;.NET Core / .NET 5+ 中的定位变化&lt;/strong&gt;：在 .NET Framework 中，强名称程序集装入 GAC 时会校验签名；而 .NET Core 及更高版本默认不校验强签名，强名称主要用于保持程序集标识唯一。因此不要把强签名当作主要的安全防线。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;强签名不提升混淆强度&lt;/strong&gt;：它只负责标识和校验，实际反编译防护仍取决于启用的混淆和加密选项。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;与防篡改选项的区别&lt;/strong&gt;：软件中的&amp;quot;防篡改（仅限EXE）&amp;quot;是运行时主动检测文件改动的保护功能，强签名是基于密钥的签名校验机制，两者可以配合使用。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;p&gt;恒盾C#混淆加密大师的强签名功能，解决了&amp;quot;混淆修改内容后原签名失效&amp;quot;的问题。对于本身就是强签名程序集的项目，使用原密钥重新签名可以无缝保持引用兼容；对于需要 GAC 部署或签名规范的项目，也可以在混淆后为输出文件补上强名称。&lt;/p&gt;&lt;p&gt;使用时记住两点：延续引用必须用同一把密钥，密钥文件需要严格保密。将强签名与混淆、加密等保护选项配合使用，可以让发布的 C# DLL、EXE 既保持完整标识，又具备反编译防护能力。&lt;/p&gt;</description><pubDate>Mon, 31 Aug 2026 20:56:40 +0800</pubDate></item><item><title>HTML打包APK自定义User Agent教程</title><link>https://www.h5pack.com/post/html-apk-user-agent-zblog-h5pack.html</link><description>&lt;p&gt;每个APP在访问网站时，都会向网站&amp;quot;自报家门&amp;quot;，说明自己使用的是什么设备和浏览器。这份&amp;quot;自我介绍&amp;quot;就是User Agent。网站根据它来决定展示手机版还是电脑版页面，或者提示&amp;quot;请使用指定浏览器打开&amp;quot;。&lt;/p&gt;&lt;p&gt;HTML一键打包APK工具提供了&lt;strong&gt;User Agent设置&lt;/strong&gt;功能，你可以为打包的APP自定义这份&amp;quot;自我介绍&amp;quot;，让网站将APP识别为指定的浏览器或设备，从而正确展示页面内容。&lt;/p&gt;&lt;p&gt;如果你对HTML打包APK工具还不熟悉，可以查看官网：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/intro/apk-packer&quot;&gt;HTML一键打包APK工具官网&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;User Agent设置的使用场景&lt;/h2&gt;&lt;p&gt;大多数情况下，保持默认（留空）即可正常访问网站。但遇到以下情况时，自定义User Agent可以解决问题：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;网站显示了电脑版页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有些网站根据访问设备自动切换页面版本。如果网站将打包的APP误认为是电脑浏览器，用户看到的将是排版错乱的电脑版页面。将User Agent设置为手机浏览器身份后，网站会正常返回手机版。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;页面提示&amp;quot;请使用指定浏览器打开&amp;quot;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;部分网站或活动页只对特定环境开放，例如只允许在微信内打开或只允许某品牌浏览器访问，默认身份会被直接拦截。将User Agent设置为网站要求的身份后，APP就能正常打开这些页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;统计识别自己的APP&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你同时运营网站，希望区分&amp;quot;来自APP的访问&amp;quot;和&amp;quot;来自普通浏览器的访问&amp;quot;，可以为APP设置一个专属的User Agent，方便网站后台单独统计。&lt;/p&gt;&lt;h2&gt;设置位置&lt;/h2&gt;&lt;p&gt;打开HTML一键打包APK工具，在&lt;strong&gt;快速打包&lt;/strong&gt;页面中找到&lt;strong&gt;User Agent设置&lt;/strong&gt;输入框，它位于时间限制和App包名之间。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/08/1787836666933_bd57eb32.png&quot; alt=&quot;User Agent设置位置&quot;/&gt;&lt;/p&gt;&lt;h2&gt;设置步骤&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;打开工具，进入&lt;strong&gt;快速打包&lt;/strong&gt;页面。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在&lt;strong&gt;网址或本地HTML文件路径&lt;/strong&gt;中填入网址，或选择本地HTML文件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在&lt;strong&gt;User Agent设置&lt;/strong&gt;输入框中填入想要使用的User Agent内容（各类浏览器对应的User Agent可以在网上轻易获取）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;填写应用名称、包名等其他常规打包配置。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;点击&lt;strong&gt;打包APK&lt;/strong&gt;，等待生成。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;打包完成后安装到手机，APP就会使用你设置的User Agent访问网站，对APP内所有网页统一生效。&lt;/p&gt;&lt;h2&gt;留空与填写&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;留空（推荐）&lt;/strong&gt;：APP使用系统自带的默认User Agent访问网站，兼容性最好，绝大多数项目直接留空即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;填写内容&lt;/strong&gt;：APP以你指定的身份访问网站，适合需要&amp;quot;变身&amp;quot;的场景。&lt;/p&gt;&lt;h2&gt;使用建议&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;拿不准就留空，默认配置可以正常访问绝大多数网站。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;遇到页面打不开、提示浏览器不兼容、显示电脑版页面时，再考虑修改User Agent。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;填写后请先在手机上充分测试，确认目标网站都能正常打开，再分发APP。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果设置后页面出现异常，把输入框清空重新打包即可恢复。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;常见问题&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;设置User Agent后，会影响APP的其他功能吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不会。该设置只改变APP访问网站时表明的身份，打印、下载、扫码等功能均不受影响。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修改User Agent需要重新打包吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要。User Agent在打包时写入APP，修改后需要重新打包并安装新的APK才会生效。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;可以给不同页面设置不同的User Agent吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不可以。该设置对APP内所有网页统一生效。如需针对不同页面使用不同身份，建议在网站端处理。&lt;/p&gt;&lt;h2&gt;相关阅读&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/intro/apk-packer&quot;&gt;HTML一键打包APK工具官网&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://api.leapever.com/apkpacker/download&quot;&gt;立即下载HTML一键打包APK工具&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html-apk-print&quot;&gt;HTML打包APK实现页面打印功能教程&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html2apk-local-file-encryption-guide&quot;&gt;5分钟学会如何使用HTML打包APK的文件加密功能&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://leapever.com/tutorial/html2apk-package-name-guide&quot;&gt;HTML一键打包APK工具使用指南 - 为什么APP安装时会覆盖&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Thu, 27 Aug 2026 21:17:44 +0800</pubDate></item><item><title>HTML一键打包APK实现打印功能</title><link>https://www.h5pack.com/post/html-apk-print-zblog-h5pack.html</link><description>&lt;p&gt;在网页中，一行 &lt;code&gt;window.print()&lt;/code&gt; 就能调起浏览器的打印功能。在HTML一键打包APK工具生成的APP中，这行代码同样有效：工具会拦截 &lt;code&gt;window.print()&lt;/code&gt; 调用，并转交给安卓系统打印服务。用户可以直接选择打印机打印，也可以&amp;quot;另存为PDF&amp;quot;把页面保存成PDF文件。&lt;/p&gt;&lt;p&gt;如果你不了解HTML打包APK工具, 想要进一步了解, 可以查看官网:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://html2apk.leapever.com/&quot;&gt;HTML一键打包APK工具官网&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;创建打印页面&lt;/h2&gt;&lt;p&gt;在HTML项目入口目录中创建 &lt;code&gt;index.html&lt;/code&gt;，写入以下代码。页面展示一张简单的单据，点击&amp;quot;打印&amp;quot;按钮后调用 &lt;code&gt;window.print()&lt;/code&gt; 触发打印。通过 &lt;code&gt;@media print&lt;/code&gt; 样式，打印时会自动隐藏按钮等屏幕元素，只保留单据内容。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-html&quot;&gt;&amp;lt;!doctype&amp;nbsp;html&amp;gt;
&amp;lt;html&amp;nbsp;lang=&amp;quot;zh-CN&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;head&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;charset=&amp;quot;UTF-8&amp;quot;&amp;nbsp;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;name=&amp;quot;viewport&amp;quot;&amp;nbsp;content=&amp;quot;width=device-width,&amp;nbsp;initial-scale=1,&amp;nbsp;viewport-fit=cover&amp;quot;&amp;nbsp;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;单据打印&amp;lt;/title&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;box-sizing:&amp;nbsp;border-box;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min-height:&amp;nbsp;100vh;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding:&amp;nbsp;20px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display:&amp;nbsp;grid;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;place-items:&amp;nbsp;center;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-family:&amp;nbsp;&amp;#39;Microsoft&amp;nbsp;YaHei&amp;#39;,&amp;nbsp;sans-serif;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;#f4f7f5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color:&amp;nbsp;#17221c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;main&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;min(100%,&amp;nbsp;440px);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.sheet&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding:&amp;nbsp;24px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#cad4ce;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border-radius:&amp;nbsp;8px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;#fff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;h1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin:&amp;nbsp;0&amp;nbsp;0&amp;nbsp;4px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-size:&amp;nbsp;24px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:&amp;nbsp;center;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.sheet-meta&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin:&amp;nbsp;0&amp;nbsp;0&amp;nbsp;16px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-size:&amp;nbsp;13px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color:&amp;nbsp;#526159;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:&amp;nbsp;center;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;100%;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border-collapse:&amp;nbsp;collapse;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-size:&amp;nbsp;14px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;th,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;td&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding:&amp;nbsp;8px&amp;nbsp;6px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border-bottom:&amp;nbsp;1px&amp;nbsp;solid&amp;nbsp;#e2e8e4;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:&amp;nbsp;left;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;th&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;#eef2f0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.total&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin-top:&amp;nbsp;12px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:&amp;nbsp;right;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-size:&amp;nbsp;16px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-weight:&amp;nbsp;700;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;100%;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min-height:&amp;nbsp;48px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;margin-top:&amp;nbsp;14px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border-radius:&amp;nbsp;6px;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;#197447;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color:&amp;nbsp;white;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font:&amp;nbsp;inherit;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font-weight:&amp;nbsp;700;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;打印相关样式&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@media&amp;nbsp;print&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;#fff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;打印时隐藏按钮，只保留单据&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.no-print&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display:&amp;nbsp;none;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.sheet&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;100%;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;border-radius:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/head&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;main&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;class=&amp;quot;sheet&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;购物清单&amp;lt;/h1&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;nbsp;class=&amp;quot;sheet-meta&amp;quot;&amp;gt;单号：20260824001　日期：2026-08-24&amp;lt;/p&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;thead&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;品名&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;数量&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;th&amp;gt;金额&amp;lt;/th&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/thead&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tbody&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;无线鼠标&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;79.00&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;机械键盘&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;299.00&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;USB数据线&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;30.00&amp;lt;/td&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tbody&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;nbsp;class=&amp;quot;total&amp;quot;&amp;gt;合计：408.00&amp;nbsp;元&amp;lt;/p&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;class=&amp;quot;no-print&amp;quot;&amp;nbsp;type=&amp;quot;button&amp;quot;&amp;nbsp;onclick=&amp;quot;window.print()&amp;quot;&amp;gt;打印&amp;lt;/button&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/main&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;p&gt;代码说明：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;点击&amp;quot;打印&amp;quot;按钮执行 &lt;code&gt;window.print()&lt;/code&gt;，这是整个打印功能的核心，不需要引入任何第三方库。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;@media print&lt;/code&gt; 中定义了打印时的样式，&lt;code&gt;display: none&lt;/code&gt; 的 &lt;code&gt;.no-print&lt;/code&gt; 元素（按钮等）不会出现在打印内容中。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;单据表格、金额等内容在屏幕和打印中都会完整保留。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;打包APK&lt;/h2&gt;&lt;p&gt;打开HTML一键打包APK工具，选择包含 &lt;code&gt;index.html&lt;/code&gt; 的项目目录，填写应用名称、包名等打包信息。打印功能依赖安卓系统打印服务，无需额外勾选权限，按默认配置打包即可。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.h5pack.com/zb_users/upload/2026/08/1787574899082_e751c0b0.jpg&quot; alt=&quot;打包APK生成应用&quot;/&gt;&lt;/p&gt;&lt;p&gt;确认配置后开始打包，等待工具生成APK文件。&lt;/p&gt;&lt;h2&gt;安装并测试打印&lt;/h2&gt;&lt;p&gt;将生成的APK安装到安卓手机，打开APP点击&amp;quot;打印&amp;quot;按钮，系统会弹出打印预览界面。在这里可以：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;选择已连接的打印机（云打印机、局域网打印机等）直接打印；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在打印机列表中选择&amp;quot;另存为PDF&amp;quot;，把页面保存成PDF文件。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;保存的PDF文件可以在手机的&amp;quot;文件&amp;quot;应用或相册中找到，方便发送给客户或存档。&lt;/p&gt;&lt;h2&gt;常见问题&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;点击打印没有反应？&lt;/strong&gt; 请确认手机系统为Android 5.0及以上，旧系统没有内置打印服务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;列表中找不到打印机？&lt;/strong&gt; 安卓打印服务需要打印机与手机处于同一网络，或打印机已接入云打印服务。也可以直接使用&amp;quot;另存为PDF&amp;quot;，不依赖任何打印机。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;打印内容不完整或分页异常？&lt;/strong&gt; 在 &lt;code&gt;@media print&lt;/code&gt; 中适当调整宽度、字号和间距，避免内容超出纸张范围；需要强制分页时，可以在指定元素上添加 &lt;code&gt;page-break-after: always&lt;/code&gt; 样式。&lt;/p&gt;</description><pubDate>Mon, 24 Aug 2026 20:34:57 +0800</pubDate></item></channel></rss>