比如某个Phone.apk应用,会用到framewrok里面的东西,用import来指定,但是我在网上看import并不等于C语言中的include,所以framewrok里面的代码实际上并没有被编译进Phone.apk中,那是Phone.apk在运行的时候动态的去找framewrok里面的代码?在system/lib下会有framework编译出来的jar包,那么是所有应用共用一个jar包?还是每个应用有自己的jar包?
我们知道Linux下的动态链接库.so就是所有应用可以共用,不知道java是不是有类似的功能?忘高手给与解答

解决方案 »

  1.   

    JAVA半路出家,不懂,所以表示关注~
      

  2.   

    在system/lib下会有framework编译出来的jar包,那么是所有应用共用一个jar包?还是每个应用有自己的jar包?这个需要了解Linux的make 编译
    在Framework下,编译时会有好几个jar包:framework.jar、services.jar、android-policy.jar、common.jar 以及系统资源res-common.apk和R.java文件这些架包都是供系统层调用的,各司其职,这些基本上能满足所有应用的调用
      

  3.   


    跟linux的make有神马关系呢?
      

  4.   

    虚拟机能够在运行时load进jar的,更别提在启动的时候指定class path了。
    对于动态库来说,只要编译的时候生成位置无关码,就没必要将库插进执行文件。静态库才需要。
      

  5.   

    package和import正好一对相反操作,import是省略了这样的操作
     java.io.InputStream is = java.lang.System.in;
    可以省略为
     import java.io.InputStream;
     InputStream = System.in;应用程序加载的类库一定是用映射的手段,这样可以缩减系统消耗.这和.so的道理是一样的,这部分有Zygote进行管理.
      

  6.   

    你说的这个我知道,但是我的问题还是没闹明白
    我们知道动态库之所以能够多个进程共享一套代码并能够动态执行 ,那是因为有ld的支持,把这段代码映射到了某个共享的地址上,而且最重要的一点就是C语言里面符号导出,某个进程需要某个函数的话,会根据符号表去找
    我在想在java里面是不是也有类似的一套机制,framework的代码被java的ld加载到系统共享的一段内存里,但是这部分代码包括不包括一份虚拟机的代码?不然别人调用他的时候,他怎么执行?
      

  7.   

    貌似LZ问的是packageManager在APK载入和安装的时候的事情
    按我的理解 安装的时候 已经把APK的信息都记录到runtime的系统里面了

    我在想在java里面是不是也有类似的一套机制,framework的代码被java的ld加载到系统共享的一段内存里,但是这部分代码包括不包括一份虚拟机的代码?不然别人调用他的时候,他怎么执行?

    这里framework中的部分代码逻辑(比如很多后台的service)的确是在系统的内存里面 但是应该不是共享内存吧
    第一路由应用请求启动application 
    apk -> AMS -> startProcess -> attachApplicationLocked -> Thread.attach
    第二路 Dalvik 启动process 
    看来这部分代码并不包含虚拟机的代码了
      

  8.   


    你说的这个也不reasonable,这个跟APK载入和安装好像关系不大这里framework中的部分代码逻辑(比如很多后台的service)的确是在系统的内存里面 但是应该不是共享内存吧这句话倒是有点提醒我,framework里面的代码好像都是service,而这些service又是AIDL的,所以是不是说framework的代码只需有一份在运行时,就OK了,我怀疑有个runtime的进程里面跑得是不是就是这些东西?
      

  9.   

    应该说system_process 里面跑的是这些东西另外调用framework层逻辑的权限 还是和APK的安装和载入应该有一定关系的
    你的APK安装之后解析为有效的应用APK才能被dalvik执行 这时候会把你的APK信息存到PM中
    之后才可能有权限去调用framework层的代码 
    如果解析失败 连执行的权限都没有 比如framework-res.apk 
      

  10.   

    你说的不怎么沾边 但我想明白了,所以说还是要大家讨论
    是这样
    zygote在init的时候会preload一下java的class,这就是framework里面的所有东西,注意,代码只load了一份,作为java虚拟机的runtime运行时库来处理,当zygote第一个进程的时候,这个进程就拥有了这写class,最牛X的地方就是他利用了linux的COW机制,把这个东西可以复制给他所有的子进程,不得不佩服android的设计者。
      

  11.   

    java里有个JIT机制来处理多次重复调用的类库代码,提高效率。android的dalvik虽然和jvm不一样,但是从2.2开始也有了类似的措施