博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pm 源码分析
阅读量:4212 次
发布时间:2019-05-26

本文共 2972 字,大约阅读时间需要 9 分钟。

platform_frameworks_base/cmds/pm/Android.mk
从下面可以看出pm是一个可执行bin档。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := pmlib
LOCAL_MODULE_STEM := pm
include $(BUILD_JAVA_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := pm
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := pm
LOCAL_REQUIRED_MODULES := pmlib
include $(BUILD_PREBUILT)
具体pm 要怎么用呢?可以看
platform_frameworks_base/cmds/pm/src/com/android/commands/pm/pm.java 中的showUsage方法。
如下所示:
private static void showUsage() {
        System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [FILTER]");
        System.err.println("       pm list permission-groups");
        System.err.println("       pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
        System.err.println("       pm list instrumentation [-f] [TARGET-PACKAGE]");
        System.err.println("       pm list features");
}
当执行pm list features是首先会跑pm.java的main函数.
    public static void main(String[] args) {
        new Pm().run(args);
    }
直接调用run方法。
   public void run(String[] args) {
        boolean validCommand = false;
        if (args.length < 1) {
            showUsage();
            return;
        }
        mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
        if (mPm == null) {
            System.err.println(PM_NOT_RUNNING_ERR);
            return;
        }
        mArgs = args;
        String op = args[0];
        mNextArg = 1;
        if ("list".equals(op)) {
            runList();
            return;
        }
        if ("path".equals(op)) {
            runPath();
            return;
        }
        if ("install".equals(op)) {
            runInstall();
            return;
        }
pm support的所有命令都是在这个run方法中实现。我们以pm list features。会走runList();
    private void runList() {
        String type = nextArg();
        if (type == null) {
            System.err.println("Error: didn't specify type of data to list");
            showUsage();
            return;
        }
        if ("package".equals(type) || "packages".equals(type)) {
            runListPackages(false);
        } else if ("permission-groups".equals(type)) {
            runListPermissionGroups();
        } else if ("permissions".equals(type)) {
            runListPermissions();
        } else if ("features".equals(type)) {
            runListFeatures();
继续调用runListFeatures()
 private void runListFeatures() {
        try {
            List<FeatureInfo> list = new ArrayList<FeatureInfo>();
            FeatureInfo[] rawList = mPm.getSystemAvailableFeatures();
            for (int i=0; i<rawList.length; i++) {
                list.add(rawList[i]);
            }
            // Sort by name
            Collections.sort(list, new Comparator<FeatureInfo>() {
                public int compare(FeatureInfo o1, FeatureInfo o2) {
                    if (o1.name == o2.name) return 0;
                    if (o1.name == null) return -1;
                    if (o2.name == null) return 1;
                    return o1.name.compareTo(o2.name);
                }
            });
            int count = (list != null) ? list.size() : 0;
            for (int p = 0; p < count; p++) {
                FeatureInfo fi = list.get(p);
                System.out.print("feature:");
                if (fi.name != null) System.out.println(fi.name);
                else System.out.println("reqGlEsVersion=0x"
                        + Integer.toHexString(fi.reqGlEsVersion));
            }
        } catch (RemoteException e) {
            System.err.println(e.toString());
            System.err.println(PM_NOT_RUNNING_ERR);
        }
    }
这个函数调用pm的getSystemAvailableFeatures() 来返回系统所有的feature,保存在rawList 数组中,然后在rawList 中的每一项加到list列表中。通过Collections.sort来排序一下.最后通过for循环打印。
所以不用死机pm的命令,需要用的的时候,可以看源码就行了.

转载地址:http://ivcmi.baihongyu.com/

你可能感兴趣的文章
中断API之enable_irq
查看>>
中断API之disable_irq
查看>>
nova 中的guestfs
查看>>
nova中的localfs
查看>>
utils/rpm_build.sh
查看>>
查看模块参数
查看>>
udev重命名网口
查看>>
pgrep
查看>>
test-definitions/blob/master/toolset/util/parallel_cmds.py
查看>>
中断API之irq_activate
查看>>
中断API之tasklet_disable_nosync/tasklet_trylock/tasklet_unlock
查看>>
中断API之tasklet_init/tasklet_kill
查看>>
内存管理API之__free_pages
查看>>
内存管理API之__get_free_pages
查看>>
内存管理API之__get_vm_area
查看>>
内存管理API之krealloc
查看>>
内存管理API之ksize
查看>>
内存管理API之alloc_pages
查看>>
linux performance tool
查看>>
test-definitions/blob/master/auto-test/bazel/bazel.sh
查看>>