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下。
其实这些我手动解压出来然后考过去也是可以运行的,呵呵。我觉得应该把这些操作放到底层来做才更合理吧。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值