纯浏览器解析 APK 信息,不用服务器 | 开源了一个小工具

纯浏览器解析 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。


相关推荐
Penge6661 小时前
JavaScript:BOM 详解
前端
Penge6662 小时前
Vite vs Webpack:前端构建工具原理与实战
前端
Penge6662 小时前
前端包管理工具:npm、Yarn、pnpm 快速入门
前端
Penge6662 小时前
Sass 了解
前端
Penge6663 小时前
Webpack 打包从 0 到 1 实战笔记
前端
Penge6663 小时前
Webpack 入门:是什么、为什么需要、怎么使用?
前端
Penge6663 小时前
Ant Design(Antd)了解
前端
wangruofeng3 小时前
同一行代码,百种渲染:Asuka、React Native 与 Flutter 跨平台渲染机制深度拆解
前端·github
Penge6664 小时前
JavaScript 核心语法速通
前端
wangruofeng5 小时前
写给开发者的〈重构 UI〉实战笔记:从改好一个设置页开始,告别“程序员审美”
前端·aigc