APK文件结构
assets
:不需要编译的资源文件lib
:.so
动态链接库文件,C/C++编译后文件META-INF
:所有文件的摘要信息res
:编译过的资源文件(图标、布局等)AndroidManifest
:安卓设备配置文件classes.dex
:Java代码编译后文件resources.arsc
:字符串样式等资源
APK打包流程
- AADT编译资源文件,生成R文件
- 其它资源文件、R文件和JAVA源码一起编译成class文件,并和第三方包编译成dex文件
- 其它资源、已编译资源和dex文件打包成apk文件并签名压缩
APK安装流程
- 先复制到tmp文件夹,提取出dex文件
- 在data\app下创建文件夹存放资源文件
APK包修改
- 修改包名:使用ApkKiller和apktools反编译apk,搜索工程进行替换(不能有xml转义字符)
- 修改图标:搜索相应图片路径替换
- 修改包名实现共存:搜索修改,双版本共存如果提供者不一样要修改相应的
provider
标签 - 该配置禁网络实现去广告:修改
AndroidManifest.xml
,功能可以正常使用但容易报错,仅离线。删除INTERNET ACCESS_NETWORK_STATE ACESS_WIFI_STATE
三项在xml中所有标签
虚拟机与汇编
- Java代码使用hotspot等虚拟机,翻译class文件(jar包是java字节码的集合),基于栈架构
- dalvik虚拟机翻译dex(优化后odex)文件(dalvik字节码),基于寄存器架构,可执行文件体积更小,AndroidL以下使用,JIT(just-in-time即时翻译)机制。
- art(android-run-time)虚拟机使用dex优化后的oat文件,AndroidL及以上,AOT(ahead-of-time提前翻译)机制。现阶段也有混合使用的。
- 使用不同虚拟机的区别:
persist.sys.dalvik.vm.lib
参数如果是libdvm.so
就是dalvik虚拟机,如果是libart.so
就是art虚拟机。java代码汇编成smali文件,c代码汇编成so文件。 /system/bin/dexopt
对dex文件进行优化,/system/bin/dex2oat
将dex文件转换为oat文件,系统启动需要/system/app
、/system/framework
和/data/app
路径
dalvik字节码
- dalvik虚拟机中的寄存器都是32位。寄存器命名分v和p两种方法,
smali.jar
使用p命名方法,ddx.jar
使用v命名方法。 - v命名法:对参数寄存器,是v0-vn;局部变量寄存器是vn+1-vn+m。即前面存放参数后面存放局部变量,现在不常用。
- p命名法:参数寄存器:p0-pn,局部变量寄存器:v0-vn。
- 类型(smali):V-void,Z-boolean,B-byte,S-short,C-char,I-int,J-long,F-float,D-double,L-java_class,[-array。
smali文件结构
-
描述类的信息:.class<访问权限>[修饰关键字]<类名>.super<父类名>.source<源文件名>
-
静态字段(static fields):.fields<访问权限>static[修饰关键字]<字段名>:<字段类型>
-
实例字段(instance fields):同上,没有static
-
直接方法(direct methods):.method<访问权限>[修饰关键字]<方法原型>
<.locals>指定使用的局部变量个数,[.paramet]指定方法的参数,[.prologue]指定代码的开始处,[.line]该处指令在源代码中的行号,<代码体>,.end method,虚方法相同但注释为virtual
-
接口和注解:.implement,.annotation[注解属性]<注解类名>[注解字段=值].end annotation