最近做一个项目,关于优化启动速度的。现在有两个地方想不明白,还请大家不吝赐教。
当开机,整个java世界起来以后,system_server也启动了相应的服务后,此时系统开始去启动apk。从home开始启动到显示出来的过程中,我从日志看到的是-----home程序起来的同时,某些应用也是开始启动了,在多数应用启动以后,home才display出来。
1.为什么开机某些apk会运行?,,,比如说LatinIME....(我查看了一下LatinIME的AndroidManifest.xml,并没有接受开机广播)2.为什么是当所有会运行的apk加载到内存以后,home程序才会显示出来?(android机制如此?不能像XP那样快速显示界面而在后台跑其他未完全启动的服务么?)
两个问题想不明白,请朋友们赐教赐教。

解决方案 »

  1.   

    第一个问题
    通过查看,是因为框架里面的问题。在InputMethodManagerService.java中的
    mCurIntent = new Intent(InputMethod.SERVICE_INTERFACE);
    mContext.bindService(mCurIntent, this, Context.BIND_AUTO_CREATE);而InputMethod中定义的public static final String SERVICE_INTERFACE = "android.view.InputMethod";。最后每个输入法的apk的AndroidManifest.xml中有            
                <intent-filter>
                    <action android:name="android.view.InputMethod" />
                </intent-filter>
    ..所以开机启动了
    跪求第二个问题的想法 
      

  2.   

    第2个问题有一点是可以肯定的,绝对不是启动所有的程序才完成launch的,理由有3
    1,Google的工程师不傻,能够开发android系统,如果连这个一点都不知道,是不可思意的,只能说明有这样猜测的工程师太高估自己的想法了。
    2,其次zygote会接受socket的信息来决定是否启动新的进程来运行新apk,如果开始就运行的话,android无需采用这样的形式启动新进程。
    3,至于启动慢,据我所知,有扫描sdcard的后台服务在运行,可能还有扫描apk安装信息的数据库,所以绝对不是楼主想的那样。
      

  3.   

    第二个问题我觉得是这样的:
    HOME 就是 Launcher,他本身的功能就是加载 应用程序,启动并在桌面显示相应的图片,那么HOME应该是所有程序最后才加载完成的。。不知道理解的对不对。
      

  4.   

    关于第二个问题,我描述的不够仔细。抱歉。第二个问题,其具体表现是,当系统开始尝试去启动home程序的时候,同时还会有别的程序被启动。通过查看log,我发现,若开机启动了Settings,输入法等程序,会导致home程序显示出来的时间变慢。我个人的看法是,系统启动的这些程序,包括home程序的时候,是宏观并发执行的,但对于单核的cpu来说,还是一个一个时间片处理过来的。我不明白的地方是,为什么不能让home程序的处理级别提高一些?PS:之前描述有误,并不是所有开机启动的apk启动以后,home才显示出来。
      

  5.   

    对于第二个问题,Home程序也就是一个apk程序来的,跟目前市面上的QQ桌面,360桌面,goLauncher出来权限上有区别外,其他的并没有很大的区别。研究过原生Launcher2的代码,其实并不是等所有的apk都加载后才启动的,而是用一种异步加载的方法同时启动,不过最后还是要将机器上面的app图标取出来,刷新到Home程序里面。这样才能从Home的程序列表打开对应的app.
      

  6.   

    异步加载的方法同时启动...我的项目的home,没有laucher的作用。所以没有app图标刷新进来。就单单一个apk,设为home后系统就此一个home),有办法让其快速显示出来么?我看到的log也是异步加载的方法同时启动...的表现。。