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命令。为什么说它有意思呢?