纯浏览器解析 APK 信息,不用服务器 | 开源了一个小工具
做内部分发平台的时候遇到一个需求:用户上传 APK 后,自动填写包名、版本号、应用名称。
最直接的方案是丢给后端解析,但能不能直接在浏览器里搞定呢?折腾了一番,写了个零依赖(对服务端零依赖)的小包:apk-meta-parser。
能解析什么
javascript
import { parseApkMeta } from "apk-meta-parser";
const meta = await parseApkMeta(file); // file 就是 input[type=file] 拿到的 File 对象
// {
// packageName: "com.example.app",
// versionName: "1.2.3",
// versionCode: 123,
// label: "我的应用", // 真实应用名,不是包名
// labelIsResourceId: false,
// apkSize: 10485760,
// apkMd5: "d41d8cd98f00b204e9800998ecf8427e"
// }
三行代码,搞定。
技术上做了什么
APK 本质是个 ZIP,里面的 AndroidManifest.xml 是 Android 二进制 XML 格式(不是普通文本),不能直接读。我手写了一个 AXML 解析器,支持 UTF-8/UTF-16 字符串池,处理了 versionCode 超 32 位的边界情况。
比较麻烦的一个坑是 应用名称 。用 uni-app、HBuilderX 打包的 APK,android:label 不是明文字符串,而是一个资源 ID(比如 @0x7f0d001b),真正的名字存在 resources.arsc 里。为了解析这个,又手写了一套 resources.arsc 的 ResTable_type 块解析逻辑,能正确拿到中文应用名。
安装
npm install apk-meta-parser jszip spark-md5
jszip 和 spark-md5 是 peer deps,按需安装(只需要包名版本不计算 MD5 的话可以跳过 spark-md5 用 skipMd5: true)。
使用场景
- APK 分发平台(上传自动识别)
- 移动端 CI/CD 面板
- 任何需要在前端展示 APK 元信息的地方
GitHub:github.com/xuantiandao...
小工具,代码量不大,欢迎看源码提 issue。