【问题标题】:Format of .dex files for Android 2.1 (Eclair), i.e. API level 7Android 2.1 (Eclair) 的 .dex 文件格式,即 API 级别 7
【发布时间】:2019-09-29 16:56:58
【问题描述】:

对于 Android/Dalvik .dex 文件,我是 writing an assemblerofficial Android docs 似乎只描述了 .dex 格式的最新版本(显然是 038,截至 2019 年 5 月),还有一些简短的说明描述了差异回到版本 035 quick glimpse into Android sources 似乎暗示,该格式的版本035 对应于Android API 级别13,意思是Android 3.2.x(蜂窝)。我拥有一台装有 Android 2.1 (Eclair) 的 deviceapparently 表示 API 级别 7。我希望能够学习如何为该设备发出正确的 .dex 和 .apk 文件,以希望为我的汇编程序添加对这些文件的支持。

我在哪里可以找到可以帮助我为 Android 2.1 (Eclair)(即 API 级别 7)生成正确 .dex 文件的信息?我什至不知道 .dex 格式版本字符串是什么那个 API 级别!

对于“奖励积分”,我真的很想找到一些很好的参考资料来解释所有 API 级别(至少回到 API 级别 7)之间 .dex 格式的差异。如果 Android API 级别之间的二进制 .xml 和资源文件(由aapt 工具发出)的格式有任何实质性差异,我也会感兴趣。我认为 .apk 格式本身以及签名算法很有可能不会改变根本,因为它与用于签署 Java .jar 文件的格式相同(即META-INF/ 子目录中包含一些简单特殊文件的常规 .zip)。但是 .dex 格式规范(包括字节码)可能是最重要的部分,或者至少是一个很好的起点。

【问题讨论】:

  • 除了教育目的之外,这纯粹是浪费时间。参见操作系统版本分布图developer.android.com/about/dashboards
  • 二进制资源/xml 格式没有记录,也没有很好地指定。您几乎必须通读 aapt 和/或 android-framework 代码才能确定格式。随着时间的推移发生了变化,虽然我认为大部分是肤浅的东西——结构没有显着变化。
  • 查看这里了解不同的 apk 签名方案:source.android.com/security/apksigning
  • @MarcinOrlowski 请注意,我明确写了我实际上拥有(并且很高兴使用!)一个 2.1(API lvl 7)设备,所以它也可能至少有一些个人用途! :)
  • 我可能错过了。仍然 - 你的时间,不是我的:) 我只是想指出,虽然这样做可能很有趣,但没有人会抱怨缺乏对中世纪设备的支持 :)

标签: android dalvik dex


【解决方案1】:

https://source.android.com/devices/tech/dalvik/dex-format 简要介绍了版本之间的差异。

Note: Support for version 037 of the format was added in the Android 7.0 
release. Prior to version 037 most versions of Android have used version 035 of 
the format. The only difference between versions 035 and 037 is the addition of 
default methods and the adjustment of the invoke.

Note: Support for version 038 of the format was added in the Android 8.0 
release. Version 038 added new bytecodes (invoke-polymorphic and invoke- 
custom) and data for method handles.

不过,请注意最新版本是 039,文档中似乎没有提及。 iirc, 039 添加了invoke-custom/rangeconst-method-handleconst-method-type 指令。

其他信息来源包括查看这些文档的变更日志: https://android.googlesource.com/platform/docs/source.android.com/+log/refs/heads/master/en/devices/tech/dalvik/dex-format.html https://android.googlesource.com/platform/docs/source.android.com/+log/refs/heads/master/en/devices/tech/dalvik/dalvik-bytecode.html

在此之前,在文件被移动之前:

https://android.googlesource.com/platform/docs/source.android.com/+log/a3b748b40bab557fb47fe5a48a5bfb642837fb05/src/devices/tech/dalvik/dex-format.jd https://android.googlesource.com/platform/docs/source.android.com/+log/a3b748b40bab557fb47fe5a48a5bfb642837fb05/src/devices/tech/dalvik/dalvik-bytecode.jd

此外,您应该能够从 smali 源中收集一些信息。对于每条指令,它都有min/max api levels(如果适用)。

对于将 min/max 设置为艺术版本的说明,您可以使用 this mapping 映射回 api 级别。

【讨论】:

  • 我有点希望你有一天能回答,没想到这么快,谢谢! :D 也就是说,即使是 .jd 文件似乎也以 Gingerbread (API lvl 10) 开头,并且已经提到了 .dex 格式 035。但至少现在我知道一些文件名,所以我可以尝试挖掘一些以前的重命名。至于在当前文档中描述格式035 的简介,我已经看到了它们,正如我在问题中提到的那样。最后,smali 来源,他们似乎拒绝(?)pre-035 .dex 和 API lvl NO_VERSION,对吧?那么,对于我的 API lvl 7 需求来说可能不太有用? :(
  • 格式 035 是第一个版本的 android 附带的
  • 哦。我没想到。我从我的 2.1 设备上下载了一些 .apk 文件,我知道这些文件已经在它上面工作过,然后解压缩,确实,其中的 classes.dex 有 035 格式标记。太棒了,谢谢,这是我不知道的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2014-04-14
  • 2011-08-13
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多