博客 / 詳情

返回

藍易雲cdn:java解析apk獲取應用信息

下面給你一套在 Java 環境解析 APK 並提取應用信息 的“可落地”方案,覆蓋 包名/版本/SDK/權限/簽名證書 等核心字段,適合放到後台服務、上傳檢測、應用倉庫等業務鏈路中。🙂


目標:你通常要拿到哪些信息

  • <span style="color:red">packageName</span>(包名)
  • <span style="color:red">versionName</span> / <span style="color:red">versionCode</span>(版本)
  • <span style="color:red">minSdk</span> / <span style="color:red">targetSdk</span>(兼容性)
  • <span style="color:red">appName</span>(應用名,可能來自 resources)
  • <span style="color:red">permissions</span>(權限清單)
  • <span style="color:red">signCertSha256</span>(簽名證書指紋,用於可信校驗)

方法對比(建議你按場景選型)

方案 優點 缺點 適用場景
A:調用 aapt2/apkanalyzer(命令行) 信息最全、與 Android 構建工具一致 依賴外部工具、需要部署環境準備 風控審核、應用市場、產線解析
B:純 Java 解析 APK(庫解析 Manifest/資源) 無需安裝 Android 工具、易容器化 資源解析/多語言 appName 可能更復雜 後台服務、輕量解析、批量任務
C:解析簽名(apksig) 可直接做可信校驗、黑白名單 只解決簽名,不負責 appName 等 反作弊、渠道包驗真

工作流程(可直接落到你的系統)

flowchart TD
A[上傳APK] --> B[基礎校驗: 大小/後綴/ZIP結構]
B --> C[解析Manifest: 包名/版本/SDK/權限]
C --> D[解析資源: appName/圖標(可選)]
D --> E[解析簽名證書: SHA-256指紋]
E --> F[落庫/出參: JSON返回 + 風險策略]

方案 A:用 aapt2 抽取“準官方”信息(最穩)

1)命令示例

aapt2 dump badging your.apk

解釋(逐項説明):

  • aapt2:Android 官方構建工具鏈中的資源/包分析工具
  • dump badging:輸出 APK 的“徽章信息”,包含 <span style="color:red">packageName</span>、<span style="color:red">versionName</span>、<span style="color:red">versionCode</span>、<span style="color:red">sdkVersion</span>、權限等
  • your.apk:待解析文件路徑

2)Java 中調用命令並解析輸出(生產可用骨架)

ProcessBuilder pb = new ProcessBuilder("aapt2", "dump", "badging", apkPath);
pb.redirectErrorStream(true);
Process p = pb.start();

try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
    String line;
    while ((line = br.readLine()) != null) {
        // 你可在這裏用正則提取 package、version、sdk、uses-permission 等行
        System.out.println(line);
    }
}
int code = p.waitFor();
if (code != 0) throw new RuntimeException("aapt2解析失敗,exitCode=" + code);

解釋(逐行説明):

  • ProcessBuilder(...):在服務端啓動外部進程執行 aapt2 dump badging
  • redirectErrorStream(true):把錯誤輸出合併到標準輸出,方便統一讀取日誌
  • BufferedReader:逐行讀取 aapt2 輸出文本(最常見的產線解析方式)
  • waitFor():等待進程結束並拿到退出碼;非 0 直接判失敗,避免“解析半成功”污染數據

方案 B:純 Java 解析 APK(更適合容器化/無外部工具)

這裏用常見的 APK 解析庫思路:讀取 APK(ZIP)→ 解析二進制 AndroidManifest.xml → 提取字段。

1)Maven 依賴(示例)

<dependency>
  <groupId>net.dongliu</groupId>
  <artifactId>apk-parser</artifactId>
  <version>2.6.10</version>
</dependency>

解釋:

  • 該類庫用於解析 APK 內部結構與 Manifest(能拿到 <span style="color:red">packageName</span>、<span style="color:red">versionName</span>、<span style="color:red">versionCode</span>、權限等)
  • version 建議你以自身依賴策略為準(企業內可走製品庫管控)

2)核心代碼:讀取基礎信息與權限

try (net.dongliu.apk.parser.ApkFile apkFile = new net.dongliu.apk.parser.ApkFile(new File(apkPath))) {
    net.dongliu.apk.parser.bean.ApkMeta meta = apkFile.getApkMeta();

    String packageName = meta.getPackageName();          // <span style="color:red">packageName</span>
    String versionName = meta.getVersionName();          // <span style="color:red">versionName</span>
    Long versionCode = meta.getVersionCode();            // <span style="color:red">versionCode</span>
    String label = meta.getLabel();                      // <span style="color:red">appName</span>(可能為默認語言)

    List<String> permissions = meta.getUsesPermissions(); // <span style="color:red">permissions</span>

    System.out.println(packageName + " " + versionName + " " + versionCode + " " + label);
    System.out.println("perm size=" + (permissions == null ? 0 : permissions.size()));
}

解釋(逐段説明):

  • ApkFile:對 APK 文件的封裝讀取器(內部會當作 ZIP 處理)
  • getApkMeta():解析 Manifest + 部分資源映射,返回元數據對象
  • getLabel():常用於應用展示名;如果遇到多語言/資源引用複雜,可能需要你進一步按 locale 做資源解析(多數業務夠用)
  • getUsesPermissions():返回聲明的權限集合,適合做“權限風控畫像”

方案 C:簽名證書指紋(強烈建議加上,用於驗真)✅

如果你要做“同包名不同作者”的風險識別,簽名證書 SHA-256 指紋幾乎是必備字段。

<dependency>
  <groupId>com.android.tools.build</groupId>
  <artifactId>apksig</artifactId>
  <version>8.2.2</version>
</dependency>

解釋:

  • apksig 是 Android 工具鏈的簽名驗證庫,可提取並校驗 APK v1/v2/v3/v4 簽名信息
  • 你可以把 <span style="color:red">signCertSha256</span> 作為“作者身份”做白名單/灰度策略

(簽名解析代碼相對更長,建議你在業務裏封裝成 SignatureService,輸出證書鏈 + 指紋;如果你需要我可以給你一份可直接運行的完整類。)


建議落地策略(務實版)

  1. 產線優先:aapt2(信息全、穩定)
  2. 容器/Serverless:走 純 Java 解析(少外部依賴)
  3. 風控增強:務必補上 簽名指紋,把 <span style="color:red">packageName + signCertSha256</span> 作為主鍵維度之一,誤判會顯著下降🙂

如果你告訴我:你是跑在 Linux/Windows、是否允許安裝 Android Build Tools、以及你最終要輸出的字段 JSON 結構,我可以直接給你一份“企業可上線”的完整封裝(含異常策略、超時、併發、緩存、解析失敗降級)。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.