You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中用Apktool.jar反编译APK出现Brut.Androlib.AndrolibException错误求助

问题解决:Apktool反编译报错「file must be a directory」

错误原因

你调用Apktool的d(解码)命令时,仅传入了APK文件路径,未指定输出目录。Apktool需要一个目录来存放反编译后的文件,缺少该参数就会触发此报错。

修复步骤

1. 补充输出目录参数

修改Main.main的参数数组,通过-o指定输出目录:

try {
    // 添加-o参数指定输出目录,确保路径有读写权限
    Main.main(arrayOf("d", "/sdcard/m/m.apk", "-o", "/sdcard/m/decode_output"))
} catch (e: Exception) {
    println("error: $e")
}

若指定的输出目录不存在,Apktool会自动创建它。

2. 确保存储权限

Android 6.0(API 23)及以上版本,需动态申请读写外部存储权限,否则应用无法访问/sdcard路径:

// 在onCreate中先检查并申请权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(
        this,
        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE),
        1001
    )
}

同时在AndroidManifest.xml中声明权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Android 13+ 使用细分权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

3. 推荐使用ApkDecoder直接调用(更灵活)

相比调用Main.main,使用ApkDecoder可更灵活配置解码选项,避免命令行参数问题:

import java.io.File

try {
    val decoder = ApkDecoder()
    decoder.setApkFile(File("/sdcard/m/m.apk"))
    decoder.setOutDir(File("/sdcard/m/decode_output"))
    // 可选配置:是否保留原始资源ID、是否解码源码等
    decoder.setDecodeResources(true)
    decoder.setDecodeSources(true)
    decoder.decode()
} catch (e: Exception) {
    println("error: $e")
}

额外注意事项

  • 确认Apktool的jar包包含所有依赖(如brut.common、brut.directory等),避免缺失依赖引发其他报错。
  • 不要在主线程执行反编译操作,会导致应用卡顿甚至ANR,建议放到协程或异步任务中:
// 协程示例
lifecycleScope.launch(Dispatchers.IO) {
    try {
        Main.main(arrayOf("d", "/sdcard/m/m.apk", "-o", "/sdcard/m/decode_output"))
        // 解码完成后切回主线程更新UI
        withContext(Dispatchers.Main) {
            // 例如显示成功提示
        }
    } catch (e: Exception) {
        println("error: $e")
    }
}

内容的提问来源于stack exchange,提问作者Lamine Ml

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:37:24