文章目录

  • 一、目前的 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 执行的操作 )相关推荐

  1. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  2. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  3. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 【Android 插件化】VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )

    文章目录 一.在 VirtualApp 工程下创建 Module 二.添加依赖 三.启动 VirtualApp 插件引擎 四.博客源码 一.在 VirtualApp 工程下创建 Module 在 [A ...

  7. 《Android插件化技术——原理篇》

    | 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...

  8. Android插件化原理—ClassLoader加载机制

    前面<Android 插件化原理学习 -- Hook 机制之动态代理>一文中我们探索了一下动态代理 hook 实现了 启动没有在 AndroidManifest.xml 中显式声明的 Ac ...

  9. android 禁止插件化,Android 插件化实现方式(Hook)

    一.首先我们要找到Hook的点 1. 分析 我们先大概看下activity的启动流程(图片来自Android 插件化开发指南) image 当我们调用startActivity的时候,AMS对我们要启 ...

最新文章

  1. StaticFactoryMethod_Level3
  2. 大货车事故频发,智能物流可减少19.9%事故率
  3. bat 调用python
  4. html5 progress css,CSS content: attr() on HTML5 progress doesn't work
  5. python numpy库安装 mac_教程|如何在mac上为Python安装XGBoost!
  6. 基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
  7. React开发(245):ant design form自定义验证
  8. mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP
  9. 对口计算机专业分数线,湖南省2021年普通高校招生本科批(职高对口类)平行一志愿投档分数线公布...
  10. 接口测试 接口自动化测试框架
  11. Spring-beans-ListableBeanFactory/AutowireCapableBeanFactory/HierarchicalBeanFactory
  12. 极客大学架构师训练营 系统架构 淘宝架构 第四次作业
  13. ISIS-三类路由器区域路由
  14. 802.11a/b/g/n/ac速率表
  15. ps软件与计算机不兼容怎么办,ps版本不兼容怎么办,ps怎么解决版本兼容问题
  16. 怎么批量给文件名加统一的几个字?
  17. Microsoft Web Application Stress Tool(WAST)详细设置说明
  18. Codeforces 985A. Chess Placing(1ni)(水题)(div.2)
  19. 正在创建系统还原点_如何在Windows 7中创建系统还原点
  20. 计算机ms office 基础知识教程,计算机等级考试二级MS-Office基础知识教程.doc

热门文章

  1. shell中获取时间
  2. RegionServer宕机的原因
  3. SpringCloud 介绍
  4. Android为TV端助力context转换类型
  5. StringUtils详解
  6. 关于tomcat8在windows2008下高并发下问题的解决方案
  7. 自己动手丰衣足食之 jQuery 数量加减插件
  8. Linq学习笔记(三)
  9. BZOJ5137lg4081(广义后缀自动机,set启发式合并)
  10. react-native 集成极光推送jpush-react-native时的小问题