应用程序包的安装是android的特点
APK---AndroidPackageAndroid应用安装有如下四种方式: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文件大小的四分之一)安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。同时修改 /data/system/packages.xml 这个文件,将应用的安装信息写入到这个文件中。
卸载过程:
删除安装过程中在上述三个目录下创建的文件及目录。同时修改 /data/system/packages.xml 这个文件,去掉相关应用的信息
同时在系统目录下/system/app下有apk和odex文件,其中apk文件都是知道是应用文件,但是odex文件是什么呢。我们在原生Android中安装apk会产生apk和odex两个文件,而使用第三方的rom只有apk一个文件。 我们知道普通的Android App编译之后会生成apk,其中的class.dex是其可执行文件。Android App运行的策略也就是解压apk后运行class.dex。那么odex是什么?odex是同名apk经系统优化后的dex文件,原生ROM中apk和odex文件是配对的,对应的apk文件中没有了dex(比正常可安装的apk小)。这样的好处: 1.加快程序的装载与运行 2.防止系统程序的简单复制,针对不同的ROM,odex文件是变化的,不可混用的,否则程序就不能政策运行。与odex配对的apk文件又因为缺少dex无法单独安装和使用。 3.节省data分区资源(这个我的理解是原始apk解压需要占用data分区资源,odex可直接执行)比如我们从system/app 里面adb pull 出来Phone.odex 和 Phone.apk 这两个文件,从文件名称看一目了然,就是打电话的apk了,但是就像前面说的,其实Phone.apk中是没有classes.dex 这个文件的所以Phone.apk这个应用是没有办法安装到其他的android手机上的。但是好在有 Phone.odex 这个文件,可以通过baksmali 和 samli 这两个工具生成新的classes.dex 文件,然后将这个文件放在Phone.apk中,然后打上签名就可以安装了。ok,说做就做。java -jar baksmali-2.0.2.jar -x Phone.odex运行这个命令Error occured while loading boot class path files. Aborting.org.jf.util.ExceptionWithContext: Cannot locate boot class path file /system/framework/core.odex at org.jf.dexlib2.analysis.ClassPath.loadClassPathEntry(ClassPath.java:217) at org.jf.dexlib2.analysis.ClassPath.fromClassPath(ClassPath.java:161) at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:58) at org.jf.baksmali.main.main(main.java:270)不幸的是报错了,这是因为还需要这个 apk 所在的 rom 里面的一些 jar 文件,都在 /system/framework 里面使用adb pull /system/framework 这个命令将rom中的文件导出到framework 文件夹中,然后再使用java -jar baksmali-2.0.2.jar -x Phone.odex -d framework/这个命令,ok 生成了out 文件夹,里面都是smali汇编代码,这个时候再使用java -jar smali-2.0.2.jar -o classes.dex out/这个命令生成classes.dex 这个文件,然后将classes.dex 这个文件放在apk压缩包中,再使用auto-signed工具将apk压缩包进行签名,这样就可以安装了。