Android adb指令实现应用双开功能
最终实现界面
adb实现步骤
//新建user0 的profile工作区
adb shell pm create-user --profileOf 0 --managed test
//查看新建user id = 12
lito:/ # pm list users
Users:UserInfo{0:机主:c13} runningUserInfo{12:test:1020}//启动user 12
am start-user 12
lito:/ # am start-user 12
Success: user started
lito:/ # pm list users
Users:UserInfo{0:机主:c13} runningUserInfo{12:test:1030} running
lito:/ #
清除launcher3数据
adb shell pm clear com.android.launcher3
开机后Profiles工作区启动流程
ActivityManagerService.java finishBooting() 中调用mUserController.scheduleStartProfiles(); 来启动profiles工作区。
下面是finishBooting的调用栈。
01-02 07:44:11.053 W/System.err( 1027): java.lang.Exception: startProfile
01-02 07:44:11.053 W/System.err( 1027): at com.android.server.am.ActivityManagerService.finishBooting(ActivityManagerService.java:5650)
01-02 07:44:11.053 W/System.err( 1027): at com.android.server.am.ActivityManagerService.bootAnimationComplete(ActivityManagerService.java:5697)
01-02 07:44:11.053 W/System.err( 1027): at com.android.server.wm.WindowManagerService.performEnableScreen(WindowManagerService.java:3492)
01-02 07:44:11.053 W/System.err( 1027): at com.android.server.wm.WindowManagerService.access$1100(WindowManagerService.java:318)
01-02 07:44:11.053 W/System.err( 1027): at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:4936)
01-02 07:44:11.053 W/System.err( 1027): at android.os.Handler.dispatchMessage(Handler.java:106)
01-02 07:44:11.054 W/System.err( 1027): at android.os.Looper.loop(Looper.java:223)
01-02 07:44:11.054 W/System.err( 1027): at android.os.HandlerThread.run(HandlerThread.java:67)
具体的start user在UserController.java 中
void scheduleStartProfiles() {// Parent user transition to RUNNING_UNLOCKING happens on FgThread, so it is busy, there is// a chance the profile will reach RUNNING_LOCKED while parent is still locked, so no// attempt will be made to unlock the profile. If we go via FgThread, this will be executed// after the parent had chance to unlock fully.FgThread.getHandler().post(() -> {if (!mHandler.hasMessages(START_PROFILES_MSG)) {mHandler.sendMessageDelayed(mHandler.obtainMessage(START_PROFILES_MSG),DateUtils.SECOND_IN_MILLIS);}});}void startProfiles() {int currentUserId = getCurrentUserId();if (DEBUG_MU) Slog.i(TAG, "startProfilesLocked");List<UserInfo> profiles = mInjector.getUserManager().getProfiles(currentUserId, false /* enabledOnly */);List<UserInfo> profilesToStart = new ArrayList<>(profiles.size());for (UserInfo user : profiles) {if ((user.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED&& user.id != currentUserId && !user.isQuietModeEnabled()) {profilesToStart.add(user);}}final int profilesToStartSize = profilesToStart.size();int i = 0;for (; i < profilesToStartSize && i < (getMaxRunningUsers() - 1); ++i) {startUser(profilesToStart.get(i).id, /* foreground= */ false);}if (i < profilesToStartSize) {Slog.w(TAG, "More profiles than MAX_RUNNING_USERS");}}boolean startUser(final @UserIdInt int userId,final boolean foreground,@Nullable IProgressListener unlockListener) {checkCallingPermission(INTERACT_ACROSS_USERS_FULL, "startUser");TimingsTraceAndSlog t = new TimingsTraceAndSlog();t.traceBegin("startUser-" + userId + "-" + (foreground ? "fg" : "bg"));try {return startUserInternal(userId, foreground, unlockListener, t);} finally {t.traceEnd();}}
Android adb指令实现应用双开功能相关推荐
- Android 常用adb指令记录总结
Android 日常开发adb指令记录(不断更新): 注:这里包名均使用com.redsun.phone代替. 一.java -version: 查看java安装版本 二.adb shell: 查看 ...
- android仿卷皮框架,Android刷机常用adb指令集合
Android刷机最常用到的就是adb命令,不过adb命令也跟程序员敲代码一样分为很多种,不同的指令执行之后会起到不同的效果.刷机常用的adb指令有哪些相信同学们也多少能猜到一点点皮毛了,小编今天就为 ...
- Android adb使用总结记录
文章转自:https://github.com/mzlogin/awesome-adb 博主做了格式化以及持续补充,作为自己的一个索引使用. 文章目录 1. 基本用法 1.1 命令语法 1.2 为命令 ...
- 【转官方】Android ADB调试命令、支持的命令、ADB文档
ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具. 持续更新中,欢迎提 PR 和 Issue 补充指 ...
- Android系统源码目录及功能介绍
Android的移植按如下流程: 1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. 2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...
- 一步步教你如何简单自定义 ADB 指令
adb 指令相信大家都用得不少,但是自定义 adb 指令不知道大家又试过没有?最近公司有一个需求,需要自定义 adb 指令来对手机硬件进行测试,这篇博客我们就来一起聊一聊我的实现方法,希望能帮助到有相 ...
- Android手机指令操作释疑
有人问我一个关于Android手机root与否的问题,她说明明iTools显示已取得root权限,但她就是没法在该手机上运行需要root权限的App如钛备份等等.我告诉她最好的确认方式便是以adb指令 ...
- Android adb logcat使用技巧
前言 新买的笔记本E431装了最新版的Eclipse,搞定了Android开发环境,可是logcat里查看东西居然仅仅显示level,没有错误的具体信息.我本身也不是一个愿意折腾图形界面,更喜欢纯命令 ...
- Android Adb 源码分析
扭起屁股得意洋洋 最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知,好景不长,u ...
最新文章
- 【jsp】写jsp文件的准备
- 技校毕业是什么学历_技校毕业是什么学历
- ML之SVM:调用(sklearn的lfw_people函数在线下载55个外国人图片文件夹数据集)来精确实现人脸识别并提取人脸特征向量
- 刷脸支付弊端举例_刷脸支付的优势和弊端,你都知道?
- 一个DEMO让你彻底理解线程池
- matlab调用手机摄像头,MATLAB下使用摄像头
- CDOJ 1401 谭爷的黑暗沙拉 数学
- 运维工程师之-MySQL的故障问题总结
- 中英文对照 —— 宗教
- 云存储技术与云存储服务
- MSsql差异备份总结
- pythonATM,购物车项目实战_补充4-db模块
- 无法启动mysql server问题:“1067”进程意外终止
- GNS3 思科交换机配置三层转发
- Vijos 3764 牛奶题
- 【Python】2019年武汉市天气数据分析与可视化
- Android 监控APP是否在后台运行
- 美国音乐学院计算机音乐专业排名2015年,2019USNEWS美国音乐专业排名前100!
- c语言中tc和vc有什么区别,转:写C++用什么编译器好——TC,VC++6.0,DEV C++,VS2005浅显比较...
- FastAPI:快速开发一个文本转语音的接口
热门文章
- MATLAB运行程序报错:“等号右侧的输出数目不足,不满足赋值要求。”的解决方法
- 190111- Dartmouth COCS1 【第五章:参数、返回值和范围】
- 测试代码怎么做抽象才是有意义的?
- 在新手机里如何找回上一个手机便签里的内容
- PHP框架之ThinkPHP
- TokenGazer《一问到底》| 第46期:研究员 VS eNotes
- Camera Calibration Toolbox for Matlab使用教程
- 2021年全球最具吸引力的雇主:谷歌、微软、苹果占据前三名
- 阿里巴巴直播内容风险防控中的AI力量
- PTC Mathcad Prime7.0,简单易用的用户界面