应用程序包的安装是android的特点

APK---AndroidPackage
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文件大小的四分之一)
安装过程:
复制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/fra
mework/core.odex
       at org.jf.dexlib2.analysis.ClassPath.loadClassPathEntry(ClassPath.java:2
17)
       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压缩包进行签名,这样就可以安装了。