【问题标题】:ApkTool splits java files in to multiple filesApkTool 将 java 文件拆分为多个文件
【发布时间】:2021-03-17 14:05:09
【问题描述】:

我正在使用 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$1;
.super Ljava/lang/Object;
.source "MainActivity.java"

MainActivity.smali

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

【问题讨论】:

    标签: android reverse-engineering smali apktool


    【解决方案1】:

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

    package Abc;
    
    class Foo {
      class Bar {}
    }
    

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

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


    (*) 通常,每个Java 类都被放入一个自己的文件中,文件名和路径与该类的包名和自身名相匹配。这是一个约定。假设只有一个类是公开的,其他类可以出现在同一个文件中 - Multiple classes in single file

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多