四种安装方式:
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文件大小的四分之一)
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个字节.
dex 的文件结构 dex_header dex文件头, 指定dex的属性, 及其他部分在dex中的物理偏移string_idstype_idsproto_idsfield_idsmethod_idsclass_defdatalink_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
};
Dex文件结构分析
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数据段的文件偏移DexMapList
类型字段描述u4sizeDexMapItem的个数DexMapItemlistDexMapItem结构DexMapItem
类型字段描述u2typekDexType开头的类型u2unused未使用, 用于字节对齐u4size指定类型的个数u4offset指定类型数据的文件偏移DexStringId
类型字段描述u4stringDataOff字符串的数据偏移MUTF-8编码
DexTypeId
类型字段描述u4descriptorIdx指向DexStringId列表的索引DexProtoId
类型字段描述u4shortyIdx指向DexStringId列表的索引u4returnTypeIdx指向DexTypeId列表的索引u4parametersOff指向DexTypeList的偏移它表示一个方法声明, shortyIdx为方法声明字符串, returnTypeIdx为方法返回类型字符串, parametersOff指向DexTypeList结构体, 存放了方法的参数列表.
DexTypeList
类型字段描述u4sizeDexTypeItem的个数DexTypeItemlistDexTypeItem结构DexTypeItem
类型字段描述u2typeIdx指向DexTypeId列表的索引DexFieldId
类型字段描述u2classIdx类的类型, 指向DexTypeId列表的索引u2typeIdx字段类型, 指向DexTypeId列表的索引u4nameIdx字段名, 指向DexStringId列表的索引DexMethodId
类型字段描述u2classIdx类的类型, 指向DexTypeId列表的索引u2protoIdx声明类型, 指向DexProtoId列表的索引u4nameIdx方法名, 指向DexStringId列表的索引DexClassDef
类型字段描述u4classIdx类的类型, 指向DexTypeId列表的索引u4accessFlags访问标志u4superclassIdx父类类型, 指向DexTypeId列表的索引u4interfacesOff接口, 指向DexTypeList的偏移u4sourceFileIdx源文件名, 指向DexStringId列表的索引u4annotationsOff注解, 指向DexAnnotataionDirectoryItem结构u4classDataOff指向DexClassData结构的偏移u4staticValuesOff指向DexEncodedArray结构的偏移DexClassData
类型字段描述DexClassDataHeaderheader指定字段与方法的个数DexFieldstaticFields静态字段, DexField结构DexMethoddirectMethods直接方法, DexMethod结构DexMethodvirtualMethods虚方法, DexMethod结构DexClassDataHeader
类型字段描述u4staticFieldsSize静态字段个数u4instanceFieldsSize实例字段个数u4staticMethodsSize直接方法个数u4virtualMethodsSize虚方法个数DexField
类型字段描述u4fieldIdx指向DexFieldId的索引u4accessFlags访问标志DexMethod
类型字段描述u4methodIdx指向DexMethodId的索引u4accessFlags访问标志u4codeOff指向DexCode结构的偏移DexCode
类型字段
描述 u2registersSize使用的寄存器个数 u2insSize参数个数 u2outsSize调用其他方法时, 使用的寄存器个数 u2triesSizetry/catch个数 u4debugInfoOff指向调试信息的偏移 u4insnsSize[1]指令集 2字节空间用于结构对齐 try_item[triesSize]DexTry结构 try/catch中handler的个数 catch_handler_item[handlersSize]DexCatchHandler结构
参加
4.odex文件格式 odex文件的生成略odex文件的整体结构略odex文件结构分析略5.dexopt的工作过程略 6.破解dex文件