android守护进程installd分析

最近在研究android的apk安装,从PackageManagerService开始看的,包括解析包PackagePaser,连接底层的Installer,继而转到c部分的installd,(位于frameworks/base/cmds/installd),installd是个很小的程序,主要文件installd.c处理java层Installer的连接,command.c处理真正的命令,包括install,remove,getsize等。

搜了一些installd的分析,看到唯一一篇比较接近的,但是发现他讲到最后其实都是在讲其中的socket连接,原文地址:
android installd分析

虽然说installd这个程序很小,其中的代码也不是很复杂,就我现在的理解是这样的,它主要是做了些创建目录的操作

比如install

C/C++ code

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 int  install( const  char  *pkgname, uid_t uid, gid_t gid) {      char  pkgdir[PKG_PATH_MAX];      char  libdir[PKG_PATH_MAX];        if  ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) {          LOGE( "invalid uid/gid: %d %d\n" , uid, gid);          return  -1;      }        if  (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX))          return  -1;      if  (create_pkg_path(libdir, PKG_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX))          return  -1;        if  (mkdir(pkgdir, 0751) < 0) {          LOGE( "cannot create dir '%s': %s\n" , pkgdir,  strerror ( errno ));          return  - errno ;      }      if  (chown(pkgdir, uid, gid) < 0) {          LOGE( "cannot chown dir '%s': %s\n" , pkgdir,  strerror ( errno ));          unlink(pkgdir);          return  - errno ;      }      if  (mkdir(libdir, 0755) < 0) {          LOGE( "cannot create dir '%s': %s\n" , libdir,  strerror ( errno ));          unlink(pkgdir);          return  - errno ;      }      if  (chown(libdir, AID_SYSTEM, AID_SYSTEM) < 0) {          LOGE( "cannot chown dir '%s': %s\n" , libdir,  strerror ( errno ));          unlink(libdir);          unlink(pkgdir);          return  - errno ;      }      return  0; }

既然只是创建目录,为什么不直接又java来做呢? 感觉installd很鸡肋诶,求各位分析一下!

在java层的操作其实也没什么,就是解析AndroidManifest.xml,还有把包拷贝到/data/app下,把lib拷贝到data/data/<appname>/lib,还有dex文件拷贝到/data/dalvik-cache下。

其实这些我手动解压出来然后考过去也是可以运行的,呵呵。我觉得应该把这些操作放到底层来做才更合理吧。

    原文作者:mirkerson
    原文地址: https://blog.csdn.net/mirkerson/article/details/38128643
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞