🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
adb install有多个参数,这里仅考虑最简单的,如adb installframeworktest.apk。adb是一个命令,install是它的参数。此处直接跳到处理install参数的代码: **commandline.c** ~~~ 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** ~~~ int install_app(transport_type transport, char*serial, int argc, char** argv) { //要安装的APK现在还在Host机器上,要先把APK复制到手机中。 //这里需要设置复制目标的目录,如果安装在内部存储中,则目标目录为/data/local/tmp; //如果安装在SD卡上,则目标目录为/sdcard/tmp。 staticconst char *const DATA_DEST = "/data/local/tmp/%s"; staticconst char *const SD_DEST = "/sdcard/tmp/%s"; constchar* where = DATA_DEST; charapk_dest[PATH_MAX]; charverification_dest[PATH_MAX]; char*apk_file; char*verification_file = NULL; intfile_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 */); ...... //①4.0新增了一个安装包Verification功能,相关知识稍后分析 //②执行pm命令,这个函数很有意思 pm_command(transport,serial, argc, argv); ...... cleanup_apk: //③在手机中执行shell rm 命令,删除刚才传送过去的目标APK文件。为什么要删除呢 delete_file(transport, serial, apk_dest); returnerr; } ~~~ 以上代码中共有三个关键点,分别是: - 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命令。为什么说它很有意思呢?