ApkTool 将 java 个文件拆分为多个文件
ApkTool splits java files in to multiple files
我正在使用 ApkTool 从 APK 中反汇编 DEX 文件以恢复 smali 代码。我注意到 .java
文件已拆分为不同的文件。
例如:
- MainActivity.java -> MainActivity.smali, MainActivity$1.smali
- FirstFragment.java -> FirstFragment.smali, FirstFragment$1.smali, FirstFragment$2.smali
为什么会这样?
我还有一个与此相关的问题:如果这些文件引用同一个文件,为什么它们的第一行内容不同?他们都引用了来源“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/Foo
和 Abc/Foo$Bar
。请注意分隔内部 class 名称的 $
符号。它可以继续下去,比如Abc/Foo$Bar$Func
。匿名 classes 只是获取名称的数字,例如 Abc/Foo
和 Abc/Foo
.
现在 Apktool and baksmali 在后台使用完全解析的 class 名称作为文件路径和名称。
(*) 通常,每个 Java class 都被放入它自己的文件中,文件名和路径与 class 的包名称和自身名称相匹配。这是一个惯例。鉴于只有一个 class 是 public,其他可以出现在同一文件中 - Multiple classes in single file.
我正在使用 ApkTool 从 APK 中反汇编 DEX 文件以恢复 smali 代码。我注意到 .java
文件已拆分为不同的文件。
例如:
- MainActivity.java -> MainActivity.smali, MainActivity$1.smali
- FirstFragment.java -> FirstFragment.smali, FirstFragment$1.smali, FirstFragment$2.smali
为什么会这样?
我还有一个与此相关的问题:如果这些文件引用同一个文件,为什么它们的第一行内容不同?他们都引用了来源“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/Foo
和 Abc/Foo$Bar
。请注意分隔内部 class 名称的 $
符号。它可以继续下去,比如Abc/Foo$Bar$Func
。匿名 classes 只是获取名称的数字,例如 Abc/Foo
和 Abc/Foo
.
现在 Apktool and baksmali 在后台使用完全解析的 class 名称作为文件路径和名称。
(*) 通常,每个 Java class 都被放入它自己的文件中,文件名和路径与 class 的包名称和自身名称相匹配。这是一个惯例。鉴于只有一个 class 是 public,其他可以出现在同一文件中 - Multiple classes in single file.