Android FrameworkAndroid知识Android开发

Framework基础:类的预加载之为什么gms启动这么快

2017-03-20  本文已影响282人  我在等你回复可你没回
苏苏.png

Android预加载,是指在开机的时候预先加载一堆常用的类,例如Activity,BroadcastReceiver啥的,进而提高应用的速度的一种技术。这些是在framework层做的,应用层无能为力,例如你说能不能开机预加载我的应用的资源到内存啊,肯定是不行的。

预加载名单preloaded-classes

预加载的类的名单保存在/system/etc/preloaded-classes目录下。执行adb cat /system/etc/preloaded-classes 查看下内容,如下,大多了,显示不完。

预加载类.png

这个名单是google测试出来的,他觉得这些类很重要,要开机的时候预先加载到内存。如果你觉得你的apk很重要,你可以向google申请,让自己apk的类进入这份名单,当然,这不太可能。

类加载入口

/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
类预加载入口是上面这个路径,依次经过main->preload->preloadClasses,最后读取预加载名单文件preloaded-classes,调用Class.forName函数完成预加载。

    public static void main(String argv[]) {
            .........
            preload();
            .........

    }

    static void preload() {
        .........
        Log.d(TAG, "begin preload");
        preloadClasses();
        .........

    }

  private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes"; 
   //预加载名单
    private static void preloadClasses() {
            .............
            is = new FileInputStream(PRELOADED_CLASSES);
            BufferedReader br
                = new BufferedReader(new InputStreamReader(is), 256);
           //读取预加载名单,加载类。
            while ((line = br.readLine()) != null) {
                    Class.forName(line, true, null);
                    count++;
   
            }
            .............
        }
    }

生成预加载名单preloaded-classes的方法

在源代码根目录执行如下语句,其中out/host/linux-x86/framework/preload.jar和frameworks/base/tools/preload/20080522.compiled要根据你的项目改以下路径。

java -Xss512M -cp out/host/linux-x86/framework/preload.jar WritePreloadedClassFile  frameworks/base/tools/preload/20080522.compiled

其中20080522.compiled是谷歌给我们的,现在6.0项目给了我们三个类似的文件,是google在不同时期给出了最优化预加载名单。

Paste_Image.png

这个名单是怎么来的呢?是谷歌在经典测试中,获取手机运行过程中加载的所有类,然后这些类就组成了预加载名单reloaded-classes。你的apk类没有出现在这个预加载名单,说明google觉得你的apk还不够经典哦!!要知道,微信,gms等可是在这个列表里面的哟!!!

上一篇下一篇

猜你喜欢

热点阅读