ApkTool 将 java 个文件拆分为多个文件

ApkTool splits java files in to multiple files

我正在使用 ApkTool 从 APK 中反汇编 DEX 文件以恢复 smali 代码。我注意到 .java 文件已拆分为不同的文件。

例如:

为什么会这样?

我还有一个与此相关的问题:如果这些文件引用同一个文件,为什么它们的第一行内容不同?他们都引用了来源“MainActivity.java”但有不同的 类.

MainActivity$1.smali

.class Lcom/example/testapp/MainActivity;
.super Ljava/lang/Object;
.source "MainActivity.java"

MainActivity.smali

.class public Lcom/example/testapp/MainActivity;
.super Landroidx/appcompat/app/AppCompatActivity;
.source "MainActivity.java"

为单个 Java class 创建了一个 .smali 文件。一个 .java 文件可以显式或隐式地包含多个 Java class。明确地 - 可以用于内部 class;含蓄地 - 例如创建一个线程(使用匿名 class)。考虑:

package Abc;

class Foo {
  class Bar {}
}

在内部,完全解析的 class 名称将是 Abc/FooAbc/Foo$Bar。请注意分隔内部 class 名称的 $ 符号。它可以继续下去,比如Abc/Foo$Bar$Func。匿名 classes 只是获取名称的数字,例如 Abc/FooAbc/Foo.

现在 Apktool and baksmali 在后台使用完全解析的 class 名称作为文件路径和名称。


(*) 通常,每个 Java class 都被放入它自己的文件中,文件名和路径与 class 的包名称和自身名称相匹配。这是一个惯例。鉴于只有一个 class 是 public,其他可以出现在同一文件中 - Multiple classes in single file.