android - ApkTool 将 java 文件拆分为多个文件
问题描述
我使用 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"
解决方案
.smali
为单个 Java 类创建一个文件。一个.java
文件可以显式或隐式包含多个 Java 类。显式 - 可以用于内部类;隐式 - 例如创建一个线程(使用匿名类)。考虑:
package Abc;
class Foo {
class Bar {}
}
在内部,完全解析的类名将是Abc/Foo
and Abc/Foo$Bar
。注意$
分隔内部类名称的符号。它可以继续,就像Abc/Foo$Bar$Func
。匿名类只需获取名称的数字,例如Abc/Foo$1
和Abc/Foo$1$1
。
现在Apktool和baksmali在幕后使用完全解析的类名作为文件路径和名称。
(*) 通常,每个 Java 类都被放入一个自己的文件中,文件名和路径与该类的包名和自身名称匹配。这是一个约定。鉴于只有一个类是公共的,其他类可以出现在同一个文件中 - 单个文件中的多个类。
推荐阅读
- c# - 具有 FromForm 绑定到 IFormFile 属性的 C# 集成测试控制器
- android - Android 活动不会从工具栏返回到主要活动
- python - 如何获得一个列表,它是许多列表的笛卡尔积
- python - 希望使用 argparse 设置全局默认参数
- java - 在 DataProvider 为单个测试方法运行具有不同数据的多个测试的情况下,在 TestNG/Maven 报告中获取测试方法名称
- c++ - 通过 QTextStream 反复读写 QBuffer
- java - 如何在unity3d中修复“JAVA_HOME环境引用目录”
- hidden-markov-models - 无法运行具有大量混合物的 GMMHMM(hmmlearn 中具有高斯混合排放的隐马尔可夫模型)
- sql-server - Docker-compose覆盖不覆盖连接字符串
- javascript - 使用 node.js 运行代码会出错,但没有 node 它可以完美运行