4.4 APK Installation分析
本节将分析APK的安装及相关处理流程,它可能比读者想象得要复杂。
马上开始我们的行程,我们的行程从adb install开始。
4.4.1 adb install分析
adb install有多个参数,这里仅考虑最简单的,如adb install frameworktest.apk。adb是一个命令,install是它的参数。此处直接跳到处理install参数的代码:
[—>commandline.c:adb_commandline]
int adb_commandline(int argc, char**argv){
……
if(!strcmp(argv[0],"install")){
……//调用install_app函数处理
return install_app(ttype, serial, argc, argv);
}
……
}
install_app函数也在commandline.c中定义,代码如下:
[—>commandline.c:install_app]
int install_app(transport_type transport, charserial, int argc, char*argv)
{
//要安装的APK现在还在Host机器上,要先把APK复制到手机中。
//这里需要设置复制目标的目录,如果安装在内部存储中,则目标目录为/data/local/tmp;
//如果安装在SD卡上,则目标目录为/sdcard/tmp。
static const char*const DATA_DEST="/data/local/tmp/%s";
static const char*const SD_DEST="/sdcard/tmp/%s";
const char*where=DATA_DEST;
char apk_dest[PATH_MAX];
char verification_dest[PATH_MAX];
char*apk_file;
char*verification_file=NULL;
int file_arg=-1;
int err;
int i;
for(i=1;i<argc;i++){
if(*argv[i]!='-'){
file_arg=i;
break;
}else if(!strcmp(argv[i],"-i")){
i++;
}else if(!strcmp(argv[i],"-s")){
where=SD_DEST;//-s参数指明该APK安装到SD卡上
}
}
……
apk_file=argv[file_arg];
……
//获取目标文件的全路径,如果安装在内部存储中,则目标全路径为/data/local/tmp/安装包名,
//调用do_sync_push将此APK传送到手机的目标路径
err=do_sync_push(apk_file, apk_dest,1/verify APK/);
……//①Android 4.0新增了一个安装过程中的Verification功能,相关知识稍后分析
//②执行pm命令,这个函数很有意思
pm_command(transport, serial, argc, argv);
……
cleanup_apk:
//③在手机中执行shell rm命令,删除刚才传送过去的目标APK文件。为什么要删除呢
delete_file(transport, serial, apk_dest);
return err;
}
以上代码中共有3个关键点,分别是:
Android 4. 0新增了APK安装过程中的Verification的功能。其实就是在安装时,把相关信息发送给指定的Verification程序(另外一个APK),由它对要安装的APK进行检查(Verify)。这部分内容在后面分析APK安装时会介绍。目前,标准代码中还没有从事Verification工作的APK。
调用pm_command进行安装,这是一个比较有意思的函数,稍后对其进行分析。
安装完后,执行shell rm删除刚才传送给手机的APK文件。为什么会删除呢?因为PKMS在安装过程中会将该APK复制一份到/data/app目录下,所以/data/local/tmp目录下的对应文件就可以删除了。这部分代码在后面也能见到。
先来分析pm_command命令。为什么说它有意思呢?