android8.0的vdex文件格式分析

google在android8.0新增加了vdex文件,定义如下

art\runtime\ vdex_file.h

// VDEX files contain extracted DEXfiles. The VdexFile class maps the file to

// memory and provides tools foraccessing its individual sections.

//

// File format:

//  VdexFile::Header    fixed-lengthheader

//

//  DEX[0]              array of theinput DEX files

//  DEX[1]              the bytecodemay have been quickened

//  ...

//  DEX[D]

//

 

 

Vdex的文件头定义

 

   struct Header {

   public:

    Header(uint32_tnumber_of_dex_files_,

           uint32_tdex_size,

           uint32_tverifier_deps_size,

           uint32_tquickening_info_size);

 

    const char*GetMagic() const { return reinterpret_cast<const char*>(magic_); }

    const char*GetVersion() const { return reinterpret_cast<const char*>(version_); }

    boolIsMagicValid() const;

    boolIsVersionValid() const;

    bool IsValid()const { return IsMagicValid() && IsVersionValid(); }

 

    uint32_tGetDexSize() const { return dex_size_; }

    uint32_tGetVerifierDepsSize() const { return verifier_deps_size_; }

    uint32_tGetQuickeningInfoSize() const { return quickening_info_size_; }

    uint32_tGetNumberOfDexFiles() const { return number_of_dex_files_; }

 

    static constexpr uint8_t kVdexInvalidMagic[]= { 'w', 'd', 'e', 'x' };

 

   private:

    staticconstexpr uint8_t kVdexMagic[] = { 'v', 'd', 'e', 'x' };

    staticconstexpr uint8_t kVdexVersion[] = { '0', '0', '5', '\0' };  // access flags

 

    uint8_t magic_[4];

    uint8_tversion_[4];

    uint32_tnumber_of_dex_files_;

    uint32_tdex_size_;

    uint32_tverifier_deps_size_;

    uint32_tquickening_info_size_;

 

    friend classVdexFile;

  };

 

 

 

 

 

 

//VDEX的转换代码

art\dex2oat\dex2oat.cc

 

 

示例分析:


Vdex header部分

 

地址

字节数

描述

备注

示例含义

0x00

4

Magic Number

0x76,0x64,0x65,0x78,

’v’,’d’,’e’,’x’,

 

0x04

4

version

005

 

0x08

4

number_of_dex_files

Dex个数

01

0x0c

4

dex_size_

bc f0 06 00

符合后面dex header描述

0x10

4

verifier_deps_size_

00 00 17 98

0x14

4

quickening_info_size_

 

00 00 b2 f4

0x18

4

未知,是否是VdexFile的类地址?

 

bd e5 c4 1f

 

 

Dex部分:

 

 

地址

字节数

描述

备注

示例含义

0x1c

8

Magic Number

0x64,0x65,0x78,0x0a,

’d’,’e’,’x’,’/’,’0’,’3’,’7’,0

 

0x24

4

checksum

 

 

0x28

20

SHA-1 签名

 

 

0x3c

4

Dex文件长度

bc f0 06 00

加上0x1c的偏移,该dex00 06 f0 d7结束

0x40

4

dex文件头大小

035到037版本都是70

Dex文件头在0x8b处结束

0x44

4

Endian

78 56 34 12

表示小头字节序

0x48

4

Link size

0

0表示无动态链接

0x4c

4

Link off

0

 

0x50

4

Map off

00 06 ef e0

 

 

 

Dex结束处 00 06 f0 d7

 


MAP数据

 


在dex ids数据结束后,后面的是data数据和link数据,详细分析见dex文件格式分析。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植 Android 8.0 的 kernel.img 是指将 Android 8.0 的内核移植到其他硬件平台上的过程。这个过程可以分为以下几个步骤。 首先,需要了解目标硬件平台的架构和规格,以便知道要移植的内核需要做哪些适配和修改。比如,了解目标硬件的处理器类型、内存大小、设备驱动等信息。 其次,下载 Android 8.0 的内核源代码,并配置正确的编译环境。根据目标硬件平台的架构,进行编译设置,例如选择合适的交叉编译工具链。 然后,根据目标硬件平台的需求,对内核源代码进行适配和修改。这可能包括添加或修改设备驱动、调整内存管理、更新中断处理等方面的工作。还需要根据目标硬件平台的特性进行配置调整,如开启或关闭特定功能模块。 在完成修改后,进行内核编译。根据编译环境和目标硬件平台的要求,进行编译操作。编译过程中可能会出现一些错误和警告,需要进行适当的处理和修正。 最后,编译成功后,将生成的 kernel.img 分别烧录到目标硬件设备上。确保设备启动时加载新内核,并对其进行测试和调试,以确保内核移植的准确性和稳定性。 总结来说,移植 Android 8.0 的 kernel.img 需要了解目标硬件平台的架构和规格,并进行适配和修改。然后进行编译和烧录测试。这个过程需要对内核的架构和编译环境有一定的了解和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值