zoukankan      html  css  js  c++  java
  • 安卓dex 文件结构简要说明

    #ifndef _DEX_FILE_HELPER_
    #define _DEX_FILE_HELPER_
    //此文件仅仅是起帮助作用,帮助不太了解DexFile结构的了解一下DexFile相关结构,想更具体的了解还须要參考相关源代码


    //classes.dex 相应于一个结构 DexFile
    //struct DexFile {
    //    const DexOptHeader* pOptHeader;//opt 头结构指针
    //    const DexHeader*    pHeader;//dex header结构指针
    //    const DexStringId*  pStringIds;//全部字符串,类似于elf的字符串表,包括全部引用符号,函数、变量等
    //    const DexTypeId*    pTypeIds;//类型比如Ljava/lang/String、I、[B等表明一种数据类型
    //    const DexFieldId*   pFieldIds;//属性id,来自一个类内部属性,指向它的指针
    //    const DexMethodId*  pMethodIds;//函数id,类似于函数指针概念
    //    const DexProtoId*   pProtoIds;//函数原型,这个原型,包括指向字符串表的符号,包括传入參数类型,和返回值类型,比如VL
    //    const DexClassDef*  pClassDefs;//指向class对象的指针,这个class的表现形式是一种结构,这个结构包括了类的訪问属性。接口、来自文件、指向ClassCode的指针等、一看smali文件你就明确了
    //    const DexLink*      pLinkData;//链接库指针,临时为空
    //    const DexClassLookup* pClassLookup;
    //    const void*         pRegisterMapPool;//这个应该是系统提供的api级别的
    //    const u1*           baseAddr;
    //    int                 overhead;
    //};

    classdef是一个最外层的类结构体,就像房子(板楼(描写叙述),在北京昌平(文件名称位置),归昌平管(继承实现)),classdata就像房子真实样子(详细这个房子布局。几个房间。几个灯等等)。codedata就相当于详细房间了(不同方法有不同的code,房子里有非常多不同的房间),大致这么讲呵呵。

    当中code_item 才是(包括)真正的dalvik解释的字节码。




    //解析Dex文件,能够从头解析。也能够从mapItem解析。两者有相对于的关系,而且当dex file 被填充好时,头部下面的结构也都指向相应位置
    //DexFile 样例 通过dexdump获取的
    //Processing 'classes.dex'...
    //Opened 'classes.dex', DEX version '035'
    //DEX file header:
    //magic               : 'dex 035'
    //checksum            : c04ea208
    //signature           : 8182...4329
    //file_size           : 905352
    //header_size         : 112
    //link_size           : 0
    //link_off            : 0 (0x000000)
    //string_ids_size     : 6068
    //string_ids_off      : 112 (0x000070)
    //type_ids_size       : 852
    //type_ids_off        : 24384 (0x005f40)
    //field_ids_size      : 1352
    //field_ids_off       : 40968 (0x00a008)
    //method_ids_size     : 5309
    //method_ids_off      : 51784 (0x00ca48)
    //class_defs_size     : 517
    //class_defs_off      : 94256 (0x017030)
    //data_size           : 794492
    //data_off            : 110860 (0x01b10c)





    //完整的Class结构,这个类比較简单


    //////////////////////////////////////////////////////////////////////////////////////////////////////
    //Class #1 header:
    //class_idx           : 9
    //access_flags        : 9729 (0x2601)
    //superclass_idx      : 766
    //interfaces_off      : 116956 (0x01c8dc)
    //source_file_idx     : 2232
    //annotations_off     : 905336 (0x0dd078)
    //class_data_off      : 123492 (0x01e264)
    //static_fields_size  : 0
    //instance_fields_size: 0
    //direct_methods_size : 0
    //virtual_methods_size: 1
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Class #1            -
    //  Class descriptor  : 'Landroid/annotation/TargetApi;'
    //  Access flags      : 0x2601 (PUBLIC INTERFACE ABSTRACT ANNOTATION)
    //  Superclass        : 'Ljava/lang/Object;'
    //  Interfaces        -
    //    #0              : 'Ljava/lang/annotation/Annotation;'
    //  Static fields     -
    //  Instance fields   -
    //  Direct methods    -
    //  Virtual methods   -
    //    #0              : (in Landroid/annotation/TargetApi;)
    //      name          : 'value'
    //      type          : '()I'
    //      access        : 0x0401 (PUBLIC ABSTRACT)
    //      code          : (none)
    //  source_file_idx   : 2232 (TargetApi.java)
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //class code data 就不拷贝了 太多
    #endif
  • 相关阅读:
    learning.py报错
    Swift与OC的相互调用
    微信小程序地图之逆地理编码
    微信小程序-滑动视图注意事项
    animate.css动画种类
    利用WKWebView实现js与OC交互注意事项
    jquey下eq()的使用注意事项
    如何判断html页面停止滚动?
    git 常见报错
    openresty中http请求body数据过大的处理方案
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7190407.html
Copyright © 2011-2022 走看看