fix(admin-service): 修复 APK 解析失败 — 写入临时文件后再解析

adbkit-apkreader v3 底层使用 yauzl.open(),只接受文件路径,
传入 Buffer 会被当成文件路径字符串导致 ENOENT。
改为先将 Buffer 写入 os.tmpdir() 临时文件,解析完成后在 finally 中删除。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-06 09:03:14 -08:00
parent 4369aecf60
commit e00cbb71c5
1 changed files with 10 additions and 2 deletions

View File

@ -1,3 +1,6 @@
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { Injectable, Logger, BadRequestException } from '@nestjs/common';
import { IPackageParser, ParsedPackageInfo } from '../../domain/ports/package-parser.interface';
@ -13,10 +16,13 @@ export class PackageParserService implements IPackageParser {
}
private async parseApk(buffer: Buffer): Promise<ParsedPackageInfo> {
// adbkit-apkreader v3 底层用 yauzl.open(),只接受文件路径而非 Buffer
// 先写入临时文件,解析后删除
const tmpFile = path.join(os.tmpdir(), `apk-parse-${Date.now()}.apk`);
try {
// Dynamic import to handle missing dependency gracefully
fs.writeFileSync(tmpFile, buffer);
const ApkReader = await import('adbkit-apkreader').then(m => m.default || m);
const reader = await ApkReader.open(buffer);
const reader = await ApkReader.open(tmpFile);
const manifest = await reader.readManifest();
return {
packageName: manifest.package || 'unknown',
@ -33,6 +39,8 @@ export class PackageParserService implements IPackageParser {
versionName: '0.0.0',
platform: 'ANDROID',
};
} finally {
try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }
}
}