首页 > 解决方案 > ApkTool 将 java 文件拆分为多个文件

问题描述

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

例如:

发生这种情况有什么原因吗?

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

MainActivity$1.smali

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

MainActivity.smali

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

标签: androidreverse-engineeringsmaliapktool

解决方案


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

package Abc;

class Foo {
  class Bar {}
}

在内部,完全解析的类名将是Abc/Fooand Abc/Foo$Bar。注意$分隔内部类名称的符号。它可以继续,就像Abc/Foo$Bar$Func。匿名类只需获取名称的数字,例如Abc/Foo$1Abc/Foo$1$1

现在Apktoolbaksmali在幕后使用完全解析的类名作为文件路径和名称。


(*) 通常,每个 Java 类都被放入一个自己的文件中,文件名和路径与该类的包名和自身名称匹配。这是一个约定。鉴于只有一个类是公共的,其他类可以出现在同一个文件中 - 单个文件中的多个类


推荐阅读