【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )
文章目录
- 一、目前的 API 现状
- 二、安装应用源码分析
- 1、安装按钮执行的操作
- 2、返回到 HomeActivity 执行的操作
一、目前的 API 现状
下图是 VirtualApp 官方给出的集成 VirtualApp 的步骤 , 这个 API 目前跑不通 , 应该是最新的商业版的使用 API ;
当前的开放源码是 2017 年底的源码 , 好在源码 , 可以从源码中查找 API ;
二、安装应用源码分析
1、安装按钮执行的操作
在安装应用界面中的 手机内存 界面中 , 选中要安装的应用 , 点击 " 安装 " 按钮 , 即可安装该应用到 VirtualApp 插件化引擎中 ;
到字符串资源中 , 找 " 安装 " 字符串 ;
查找到在 io.virtualapp.home.ListAppFragment
页面中 , mInstallButton
就是要安装应用的按钮 , 其点击方法在后面的代码中 , 在后续的点击方法中 , 传入了一个 Lambda 表达式 , 获取了若干应用信息 AppInfoLite 对象 , 将该对象返回给 HomeActivity ;
这里 getActivity().setResult
返回到上一个界面 , 带着数据进入到上一个界面 , 也就是 HomeActivity 的
public class ListAppFragment extends VFragment<ListAppContract.ListAppPresenter> implements ListAppContract.ListAppView {@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {mAdapter.setSelectionListener(count -> {mInstallButton.setEnabled(count > 0);mInstallButton.setText(String.format(Locale.ENGLISH, getResources().getString(R.string.install_d), count));});mInstallButton.setOnClickListener(v -> {Integer[] selectedIndices = mAdapter.getSelectedIndices();ArrayList<AppInfoLite> dataList = new ArrayList<AppInfoLite>(selectedIndices.length);for (int index : selectedIndices) {AppInfo info = mAdapter.getItem(index);dataList.add(new AppInfoLite(info.packageName, info.path, info.fastOpen));Log.i("HSL", "packageName : " + info.packageName + " , path : " + info.path + " , fastOpen : " + info.fastOpen);}Intent data = new Intent();data.putParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST, dataList);getActivity().setResult(Activity.RESULT_OK, data);getActivity().finish();});}
}
使用
Log.i("HSL", "packageName : " + info.packageName + " , path : " + info.path + " , fastOpen : " + info.fastOpen);
代码 , 拦截一下数据 , 查看下传入的是什么参数 :
I/HSL: packageName : com.example.filepath , path : /storage/emulated/0/./app-debug.apk , fastOpen : false
在 adb shell 中查看 , 该应用在 SD 卡根目录 ;
2、返回到 HomeActivity 执行的操作
使用的 MVP 模式 ;
返回的时候 , 获取到 AppInfoLite 集合 , 逐个遍历安装应用 ;
mPresenter.addApp(info);
实际上调用的是 io.virtualapp.home.HomePresenterImpl
类的 addApp()
方法
public class HomeActivity extends VActivity implements HomeContract.HomeView {@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && data != null) {List<AppInfoLite> appList = data.getParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST);if (appList != null) {for (AppInfoLite info : appList) {mPresenter.addApp(info);}}}}
}
【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )相关推荐
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )
文章目录 一.在 VirtualApp 工程下创建 Module 二.添加依赖 三.启动 VirtualApp 插件引擎 四.博客源码 一.在 VirtualApp 工程下创建 Module 在 [A ...
- 《Android插件化技术——原理篇》
| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...
- Android插件化原理—ClassLoader加载机制
前面<Android 插件化原理学习 -- Hook 机制之动态代理>一文中我们探索了一下动态代理 hook 实现了 启动没有在 AndroidManifest.xml 中显式声明的 Ac ...
- android 禁止插件化,Android 插件化实现方式(Hook)
一.首先我们要找到Hook的点 1. 分析 我们先大概看下activity的启动流程(图片来自Android 插件化开发指南) image 当我们调用startActivity的时候,AMS对我们要启 ...
最新文章
- StaticFactoryMethod_Level3
- 大货车事故频发,智能物流可减少19.9%事故率
- bat 调用python
- html5 progress css,CSS content: attr() on HTML5 progress doesn't work
- python numpy库安装 mac_教程|如何在mac上为Python安装XGBoost!
- 基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
- React开发(245):ant design form自定义验证
- mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP
- 对口计算机专业分数线,湖南省2021年普通高校招生本科批(职高对口类)平行一志愿投档分数线公布...
- 接口测试 接口自动化测试框架
- Spring-beans-ListableBeanFactory/AutowireCapableBeanFactory/HierarchicalBeanFactory
- 极客大学架构师训练营 系统架构 淘宝架构 第四次作业
- ISIS-三类路由器区域路由
- 802.11a/b/g/n/ac速率表
- ps软件与计算机不兼容怎么办,ps版本不兼容怎么办,ps怎么解决版本兼容问题
- 怎么批量给文件名加统一的几个字?
- Microsoft Web Application Stress Tool(WAST)详细设置说明
- Codeforces 985A. Chess Placing(1ni)(水题)(div.2)
- 正在创建系统还原点_如何在Windows 7中创建系统还原点
- 计算机ms office 基础知识教程,计算机等级考试二级MS-Office基础知识教程.doc