Skip to content
启动未在AndroidManifest中注册的Activity,适配了Android4-9
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
app 增加参考文章列表到readme Apr 14, 2019
gradle/wrapper add doc Apr 1, 2019
.gitignore init project Apr 1, 2019
README.md readme增加了问题和解答 Apr 14, 2019
build.gradle 给Hook增加代码注释 Apr 8, 2019
clean.sh hook代码增加注释 Apr 11, 2019
gradle.properties init project Apr 1, 2019
gradlew init project Apr 1, 2019
gradlew.bat
run.sh 删除无用的代码,删除错误的注释,更新启动脚本 Apr 12, 2019
settings.gradle init project Apr 1, 2019
showlog.sh

README.md

Android ams hook, 启动未在AndroidManifest.xml中注册的Activity

适配了Android4-9,要彻底搞清楚代码,需要提前掌握的知识点如下:

  1. 反射的使用
  2. 泛型
  3. 动态代理
  4. AIDL通信
  5. Activity启动流程以及其中涉及到的两次跨进程通信
  6. Handler消息处理机制
  7. Activity启动拦截

问题思考

  1. 如何确保我们启动的未注册的Activity,有正常的Activity的生命周期?

源码探索系列29---插件化基础之启动插件的Activity

  1. 从整体宏观的角度看,我们到底做了什么?

  2. 对PackageManager的hook,为什么要hook两个地方

hook技术(三)对AMS&PMS进行Hook

@Override
public PackageManager getPackageManager() {
    if (mPackageManager != null) {
        return mPackageManager;
    }
    IPackageManager pm = ActivityThread.getPackageManager();
    if (pm != null) {
        return (mPackageManager = new ApplicationPackageManager(this, pm));
    }
    return null;
}

由于系统的执行肯定在我们代码之前,所以系统先生成了一个pm,这个是原生的pm然后保存在ApplicationPackageManager中, 使得以后使用ContextImp.getPackageManager()都返回这个IPackageManager 对象。 就算我们后来替换了ActivityThread.getPackageManager(),但是也不影响mPackageManager 里面之前包装好的。 所以我们还需要改变mPackageManager 里面的原来的pm对象。

参考文章列表

  1. Android:学习AIDL,这一篇文章就够了(上)
  2. Android:学习AIDL,这一篇文章就够了(下)
  3. 大白话说Java反射:入门、使用、原理
  4. Android 插件化原理解析——Hook机制之AMS&PMS
  5. Android系统篇之----Hook系统的AMS服务实现应用启动的拦截功能
  6. Android插件化的兼容性(中):Android P的适配
  7. Android Hook Activity 的几种姿势
You can’t perform that action at this time.