Android可执行文件

1.Android 程序的生成步骤 

  1. aapt 打包资源文件, 生成R.java, resources.arsc
  2. 处理aidl文件, 生成相应接口文件
  3. javac编译工程文件, 生成class文件
  4. NDK编译C/C++文件
  5. dx转换所有class文件生成classes.dex (压缩常量池等工作)
  6. apkbuilder打包生成apk
  7. jarsigner或signapk给apk签名
  8. zipalign apk

2.Android 程序的安装流程 

四种安装方式:

1.系统应用安装――开机时完成,没有安装界面

2.网络下载应用安装――通过market应用完成,没有安装界面

3.ADB工具安装――没有安装界面

4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。

 

应用安装的流程及路径 
应用安装涉及到如下几个目录:        

system/app ------------系统自带的应用程序,获得adb root权限才能删除

data/app  ---------------用户程序安装的目录。安装时把 apk文件复制到此目录
data/data ---------------存放应用程序的数据
data/dalvik-cache-----将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

3.dex文件格式

  1. dex 文件中的数据结构

    类型描述
    u1等同于uint8_t, 表示1字节的无符号数
    u2等同于uint16_t, 表示2字节的无符号数
    u4等同于uint32_t, 表示4字节的无符号数
    u8等同于uint64_t, 表示8字节的无符号数
    sleb128有符号LEB128, 可变长1~5字节
    uleb128无符号LEB128, 可变长1~5字节
    uleb128p1无符号LEB128值加1, 可变长1~5字节

    每个LEB128由1~5个字节组成, 所有字节组合在一起表示一个32位数据, 每个字节只有7位有效位, 如果第一个字节的最高位是1, 表示LEB128需要使用到第二个字节, 以此类推, 最多能用5个字节.

  2. dex 的文件结构 
    1. dex_header dex文件头, 指定dex的属性, 及其他部分在dex中的物理偏移
    2. string_ids
    3. type_ids
    4. proto_ids
    5. field_ids
    6. method_ids
    7. class_def
    8. data
    9. link_data 目前为空 
      struct DexFile { 
      DexHeader Header, 
      DexStringId StringIds[stringIdsSize], 
      DexTypeId TypeIds[typeIdsSize], 
      DexProtoId ProtoIds[protoIdsSize], 
      DexFieldId FieldIds[fieldIdsSize], 
      DexMethodId MethodIds[methodIdsSize], 
      DexClassDef ClassDefs[classDefsSize], 
      DexData Data[], 
      DexLink LinkData 
      };
  3. Dex文件结构分析

    1. DexHeader

      类型字段名描述
      u1magic[8]dex版本标识
      u4checksumadler32检验
      u1signature[kSHA1DigestLen]SHA-1哈希值, kSHA1DigestLen为20, 见dalvik/libdex/DexFile.h.
      u4headerSizeDexHeader结构大小
      u4endianTag字节序标记
      u4linkSize链接段大小
      u4linkOff链接段偏移
      u4mapOffDexMapList的文件偏移
      u4stringIdsSizeDexStringId的个数
      u4stringIdsOffDexStringId的文件偏移
      u4typeIdsSizeDexTypeId的个数
      u4typeIdsOffDexTypeId的文件偏移
      u4protoIdsSizeDexProtoId的个数
      u4protoIdsOffDexProtoId的文件偏移
      u4fieldIdsSizeDexFieldId的个数
      u4fieldIdsOffDexFieldId的文件偏移
      u4methodIdsSizeDexMethodId的个数
      u4methodIdsOffDexMethodId的文件偏移
      u4classDefsSizeDexClassDef的个数
      u4classDefsOffDexClassDef的文件偏移
      u4dataSize数据段的大小
      u4dataOff数据段的文件偏移
    2. DexMapList

      类型字段描述
      u4sizeDexMapItem的个数
      DexMapItemlistDexMapItem结构
    3. DexMapItem

      类型字段描述
      u2typekDexType开头的类型
      u2unused未使用, 用于字节对齐
      u4size指定类型的个数
      u4offset指定类型数据的文件偏移
    4. DexStringId

      类型字段描述
      u4stringDataOff字符串的数据偏移

      MUTF-8编码

    5. DexTypeId

      类型字段描述
      u4descriptorIdx指向DexStringId列表的索引
    6. DexProtoId

      类型字段描述
      u4shortyIdx指向DexStringId列表的索引
      u4returnTypeIdx指向DexTypeId列表的索引
      u4parametersOff指向DexTypeList的偏移

      它表示一个方法声明, shortyIdx为方法声明字符串, returnTypeIdx为方法返回类型字符串, parametersOff指向DexTypeList结构体, 存放了方法的参数列表.

    7. DexTypeList

      类型字段描述
      u4sizeDexTypeItem的个数
      DexTypeItemlistDexTypeItem结构
    8. DexTypeItem

      类型字段描述
      u2typeIdx指向DexTypeId列表的索引
    9. DexFieldId

      类型字段描述
      u2classIdx类的类型, 指向DexTypeId列表的索引
      u2typeIdx字段类型, 指向DexTypeId列表的索引
      u4nameIdx字段名, 指向DexStringId列表的索引
    10. DexMethodId

      类型字段描述
      u2classIdx类的类型, 指向DexTypeId列表的索引
      u2protoIdx声明类型, 指向DexProtoId列表的索引
      u4nameIdx方法名, 指向DexStringId列表的索引
    11. DexClassDef

      类型字段描述
      u4classIdx类的类型, 指向DexTypeId列表的索引
      u4accessFlags访问标志
      u4superclassIdx父类类型, 指向DexTypeId列表的索引
      u4interfacesOff接口, 指向DexTypeList的偏移
      u4sourceFileIdx源文件名, 指向DexStringId列表的索引
      u4annotationsOff注解, 指向DexAnnotataionDirectoryItem结构
      u4classDataOff指向DexClassData结构的偏移
      u4staticValuesOff指向DexEncodedArray结构的偏移
    12. DexClassData

      类型字段描述
      DexClassDataHeaderheader指定字段与方法的个数
      DexFieldstaticFields静态字段, DexField结构
      DexMethoddirectMethods直接方法, DexMethod结构
      DexMethodvirtualMethods虚方法, DexMethod结构
    13. DexClassDataHeader

      类型字段描述
      u4staticFieldsSize静态字段个数
      u4instanceFieldsSize实例字段个数
      u4staticMethodsSize直接方法个数
      u4virtualMethodsSize虚方法个数
    14. DexField

      类型字段描述
      u4fieldIdx指向DexFieldId的索引
      u4accessFlags访问标志
    15. DexMethod

      类型字段描述
      u4methodIdx指向DexMethodId的索引
      u4accessFlags访问标志
      u4codeOff指向DexCode结构的偏移
    16. DexCode

      类型

      字段

      描述  
      u2registersSize使用的寄存器个数  
      u2insSize参数个数  
      u2outsSize调用其他方法时, 使用的寄存器个数  
      u2triesSizetry/catch个数  
      u4debugInfoOff指向调试信息的偏移  
      u4insnsSize[1]指令集  
      2字节空间用于结构对齐    
      try_item[triesSize]DexTry结构   
      try/catch中handler的个数    
      catch_handler_item[handlersSize]DexCatchHandler结构

       

      参加

4.odex文件格式

  1. odex文件的生成略
  2. odex文件的整体结构略
  3. odex文件结构分析略

5.dexopt的工作过程略

6.破解dex文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值