最近想用 electron 写一个 adb 的可视化客户端,在展示安装的应用时遇到了如何获取 APK 的名称和 icon 的问题。下面就是一些解决问题的思路。
前提:在这里默认大家已经下载好 apk, 下面 localApkPath
就是你下载好的 apk 的路径。
小提示,示例代码不能直接执行,需要自行修改哦
获取 apk 的名称
我们要下载一个 aapt, 如果找不到下载地址,用这个, 然后我们就可以通过这个工具来获取到一些相关的信息了。其实不仅仅可以获取到 apk 的名称,具体的内容可以自己打印一下查看。下面是通过正则获取到中文 apk name。
aapt 是什么。
import { exec } from "child_process";
import { promisify } from "util";
import aapt from "../../resources/aapt.exe?asset&asarUnpack"; // 这里需要指定路径,我这里是 electron-vite 的用法,如果是其他方式,请自行修改const execAsync = promisify(exec);
const { stdout: aaptInfo } = await execAsync(`${aapt} dump badging ${localApkPath}`
);
const appNameMatch = aaptInfo.match(/application-label-zh_CN:'([^']*)'/);
const appName = appNameMatch ? appNameMatch[1] : "未知";
获取 apk 的 icon
我们要安装一个依赖,他是 adm-zip
, 他是用来解压 apk 文件的。
npm i adm-zip
然后安装好之后,我们就可以使用他来解压 apk 文件了。第一步还是要用 aapt
获取到 icon 的路径。然后我们就可以使用 adm-zip
来获取到 icon 的 base64 了。其实挺简单的,就是网上没有现成的例子,所以记录一下。换到别的语言其实思路都是一样的。
import AdmZip from "adm-zip";
import { promisify } from "util";
import aapt from "../../resources/aapt.exe?asset&asarUnpack"; // 这里需要指定路径,我这里是 electron-vite 的用法,如果是其他方式,请自行修改const zip = new AdmZip(localApkPath);
const execAsync = promisify(exec);
const { stdout: aaptInfo } = await execAsync(`${aapt} dump badging ${localApkPath}`
);
const iconMatch = aaptInfo.match(/application-icon-[0-9]+:'([^']+)'/);
if (iconMatch) {const iconPath = iconMatch[1];const iconBuffer = zip.getEntry(iconPath).getData();const iconBase64 = iconBuffer.toString("base64");return iconBase64;
}
aapt 是什么
aapt
(Android Asset Packaging Tool)是 Android 开发工具链中的一个重要工具,主要用于打包和处理 Android 应用程序中的资源文件。它是 Android SDK 中的一部分,在应用构建过程中起到关键作用。
主要功能包括:
- 打包资源文件:将项目中的资源(如 XML 文件、图片等)打包为
.apk
文件中的资源包。 - 生成 R.java 文件:
aapt
负责分析应用中的资源文件并生成R.java
文件,供 Java 代码访问资源。 - 编译资源文件:
aapt
会将.xml
等资源文件编译成二进制格式,减少文件大小并提高解析效率。 - 查看 APK 文件内容:可以使用
aapt
查看 APK 文件中的内容和资源。 - 签名 APK 文件:配合其他工具,
aapt
可以协助进行 APK 的签名操作,确保应用安全。
通常, aapt
是 Android 构建过程中自动调用的,开发者不需要手动使用它,但在一些高级使用场景下(比如反编译、查看 APK 内容等), aapt
仍然是一个非常有用的工具。