IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android pm 命令 -> 正文阅读

[移动开发]Android pm 命令

经常在使用中的am & pm 命令,现在来看看里面到底是什么东西,以pm 为例:

在Android 6.0 中

cat /system/bin/pm

# shell.
base=/system
export CLASSPATH=$base/framework/pm.jar
exec app_process $base/bin com.android.commands.pm.Pm "$@"

首先我们需要知道/system/bin/pm是一个可执行的shell 文件
在Android6.0中,这个shell 脚本文件实际上执行的是源文件是
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
Pm->main->new Pm().run(args)->

public int run(String[] args) throws IOException, RemoteException {
        ......
        这里省略了部分代码,只看关键部分
        ......
        if ("list".equals(op)) {
            return runList();
        }

        if ("path".equals(op)) {
            return runPath();
        }
        if ("dump".equals(op)) {
            return runDump();
        }

        if ("install".equals(op)) {
            return runInstall();
        }
    
        if ("uninstall".equals(op)) {
            return runUninstall();
        }

        if ("clear".equals(op)) {
            return runClear();
        }
        ...
        这里省略了部分代码,只看关键部分
        ......
    }

看到这里逻辑就很清楚了,根据参数做不同的处理。最后通过IPackageManager mPm = IPackageManager.Stub.asInterface(ServiceManager.getService(“package”)); 调用到PackageManagerService 里面去。

在Android 9.0 中

cat /system/bin/pm

#!/system/bin/sh
cmd package "$@"

cmd 是什么呢,
which cmd 查看一下:

 /system/bin/cmd

cmd 是一个二进制文件
frameworks/native/cmds/cmd/cmd.cpp

int main(int argc, char* const argv[])
{
	....
    sp<IServiceManager> sm = defaultServiceManager();
    ...
    sp<IBinder> service = sm->checkService(cmd);
 	...
    status_t err = IBinder::shellCommand(service, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO, 
    ...
}

关系图

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

@Override
    public void onShellCommand() {
         (new PackageManagerShellCommand(this)).exec( 
                this, in, out, err, args, callback, resultReceiver);
    }

frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java

public int onCommand(String cmd) {
   		...
        try {
            switch(cmd) {
                case "path":
                    return runPath();
                case "dump":
                    return runDump();
                case "list":
                    return runList();
           
                case "uninstall":
                    return runUninstall();
                case "clear":
                    return runClear();
                case "enable":
                    return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
                case "disable":
                    return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
                case "disable-user":
                    return runSetEnabledSetting(
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
          
                    return uninstallSystemUpdates();
                ...
            }
        } catch (RemoteException e) {
            pw.println("Remote exception: " + e);
        }
        return -1;
    }

看到这里整体的脉络应该是比较清晰了.

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:48:03  更:2021-12-09 11:48:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:47:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码