ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:93.48KB ,
资源ID:2824661      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2824661.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Android70 PackageManagerService 3 APK安装一.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Android70 PackageManagerService 3 APK安装一.docx

1、Android70 PackageManagerService 3 APK安装一Android7.0 PackageManagerService (3) APK安装(一)一、adb命令 看看system/core/adb/commandline.cpp中的adb_commandline函数:int adb_commandline(int argc, const char *argv) . else if (!strcmp(argv0, install) if (argc 2) return usage(); FeatureSet features; std:string error; if (

2、!adb_get_feature_set(&features, &error) fprintf(stderr, error: %sn, error.c_str(); return 1; if (CanUseFeature(features, kFeatureCmd) /支持FeatureCmd时调用install_app return install_app(transport_type, serial, argc, argv); /否则,利用install_app_legacy return install_app_legacy(transport_type, serial, argc, a

3、rgv); .1、install_app_legacy 我看先看看传统的install_app_legacy:static int install_app_legacy(TransportType transport, const char* serial, int argc, const char* argv) /待安装的APK目前还在源机器上,现在需要把APK的文件复制到手机里 /如果安装在手机内部存储,那么目的地址为DATA_DEST /如果安装在SD卡上,则目的地址为SD_DEST static const char *const DATA_DEST = /data/local/tmp

4、/%s; static const char *const SD_DEST = /sdcard/tmp/%s; . /默认安装到手机内部 const char* where = DATA_DEST; for (i = 1; i argc; i+) /携带参数-s时,才安装到SD卡 if (!strcmp(argvi, -s) where = SD_DEST; /解析参数,判断adb命令中是否携带了有效的apk文件名 . /取出apk名 std:vector apk_file = argvlast_apk; /构造apk目的地址 std:string apk_dest = android:bas

5、e:StringPrintf( where, adb_basename(argvlast_apk).c_str(); /do_sync_push将此APK文件传输到手机的目标路径,失败的话将跳转到clenaup_apk if (!do_sync_push(apk_file, apk_dest.c_str() goto cleanup_apk; /执行pm_command result = pm_command(transport, serial, argc, argv);cleanup_apk: /删除刚才传输的文件 /PKMS在安装过程中会将该APK复制一份到/data/app目录下,所有d

6、ata/local/tmp目录下对应的文件可以删除 delete_file(transport, serial, apk_dest); return result;从代码来看,传统的安装方式就是将源机器中的APK文件拷贝到目的手机的tmp目录下,然后调用pm_command进行处理。2、install_app 我们再看看支持FeatureCmd的机器,如何安装APK:static int install_app(TransportType transport, const char* serial, int argc, const char* argv) /利用参数创建出本地文件的名称 con

7、st char* file = argvargc - 1; /解析参数,判断adb命令中是否携带了有效的apk文件名 . /adb_open中将创建出这个file对应的文件 int localFd = adb_open(file, O_RDONLY); . std:string cmd = exec:cmd package; /添加cmd参数 . /连接源端,获取源APK文件的描述符 int remoteFd = adb_connect(cmd, &error); . /将remoteFd中的数据写入到localFd copy_to_file(localFd, remoteFd); /得到结果

8、 read_status_line(remoteFd, buf, sizeof(buf); adb_close(localFd); adb_close(remoteFd); . return 0;从代码来看install_app就是将源机器的文件复制到了目的机器中,并没有进行额外的操作。猜想可能是支持特殊FeatureCmd的机器,PKMS能够监听到这个拷贝,然后触发后续的扫描工作。这个过程没有研究过对应代码,暂时不做深入分析。对于传统的安装方式,我们需要继续往下看看pm_command。二、pm_command 我们先看看pm_command函数:static int pm_command(

9、TransportType transport, const char* serial, int argc, const char* argv) std:string cmd = pm; /构造pm cmd while (argc- 0) cmd += + escape_arg(*argv+); /发送shell命令给adbd return send_shell_command(transport, serial, cmd, false);我们跟进下send_shell_command:/ Connects to the device shell service with |command|

10、and prints the/ resulting output.static int send_shell_command(TransportType transport_type, const char* serial, const std:string& command, bool disable_shell_protocol, std:string* output=nullptr, std:string* err=nullptr) . while (true) bool attempt_connection = true; / Use shell protocol if its sup

11、ported and the caller doesnt explicitly disable it. if (!disable_shell_protocol) . if (adb_get_feature_set(&features, &error) /如果定义了feature,则替换shell protocol use_shell_protocol = CanUseFeature(features, kFeatureShell2); else / Device was unreachable. attempt_connection = false; if (attempt_connectio

12、n) std:string error; /此时command中携带的就是以pm开头的命令 std:string service_string = ShellServiceString(use_shell_protocol, , command); /向shell服务发送命令 fd = adb_connect(service_string, &error); if (fd = 0) break; . /读取返回结果 int exit_code = read_and_dump(fd, use_shell_protocol, output, err); if (adb_close(fd) 0) .

13、 return int exit_code;从上面的代码来看,pm_command就是向shell服务发送pm命令。pm是一个可执行脚本,我们在终端上调用adb shell,然后执行pm,可以得到以下结果:root:/ # pmusage: pm list packages -f -d -e -s -3 -i -u -user USER_ID FILTER pm list permission-groups pm list permissions -g -f -d -u GROUP pm list instrumentation -f TARGET-PACKAGE.pm脚本定义在framewo

14、rks/base/cmds/pm中:base=/systemexport CLASSPATH=$base/framework/pm.jarexec app_process $base/bin mands.pm.Pm $在编译system.img时,会根据Android.mk将该脚本复制到system/bin目录下。 从脚本的内容来看,当调用pm时,将向app_process目录的main函数传入Pm对应的参数:我们看看对应的定义于app_main.cpp的main函数(前面的博客分析过,这个其实也是zygote启动的函数):/app_process的main函数int main(int argc, char* const argv) . /解析参数 while (i argc) const char* arg = argvi+; if (strcmp(arg, -zygot

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1