美文网首页
第二代插件化:Hook实现

第二代插件化:Hook实现

作者: 主音King | 来源:发表于2018-12-29 18:11 被阅读4次
第二代插件化:Hook.jpg

了解系统启动activity的过程,先检查Activity是否注册,然后再去生成该Activity。我们在检查时用一个已经注册的Activity(桩,StubActivity和ViewStub类似)来给系统检查,检查通过后再替换成插件的Activity。

plugin(插件项目,可以独立运行)

不用做特殊处理。
debug下项目生成为plugin.apk。放到sdcard中提供主项目去hook。

app(主项目)中的代码:

HookedInstrumentation:自己实现Instrumentation,做一些替换工作,Hook掉系统持有的对象。
PluginApp:插件app实体类
PluginManager:负责加载插件的类和资源
ReflectUtil:反射工具类
StubActivity:桩,用来躲过项目清单文件对插件activity的检测

清单文件权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

注册桩:

<activity android:name=".StubActivity"/>

MainActivty的代码:

public class MainActivity extends Activity implements View.OnClickListener {
    // https://zhuanlan.zhihu.com/p/33017826
    public static final String TAG = "MainActivity";
    private String mPluginPackageName = "com.george.plugin";
    private String mPluginClassName = "com.george.plugin.MainActivity";
    //读写权限
    private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    //请求状态码
    private static int REQUEST_PERMISSION_CODE = 1;
    private PluginManager mPluginManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
        initPlugin();
    }

    private void initPlugin() {
        // !! must first
        ReflectUtil.init();
        mPluginManager = PluginManager.getInstance(getApplicationContext());
        mPluginManager.hookInstrumentation();
        mPluginManager.hookCurrentActivityInstrumentation(this);
    }

    private void initData() {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
            }
        }
    }

    private void initView() {
        (findViewById(R.id.tv_launch)).setOnClickListener(this);
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        // !!! 不要在此Hook,看源码发现mInstrumentaion会在此方法后初始化
    }

    @Override
    public void onClick(View view) {
        if (Constants.DEBUG) Log.e(TAG, "click view id: " + view.getId());
        if (view.getId() == R.id.tv_launch) {
            // TODO launch plugin app
            if (mPluginManager.loadPlugin(Constants.PLUGIN_PATH)) {
                Intent intent = new Intent();
                intent.setClassName(mPluginPackageName, mPluginClassName);
                startActivity(intent);
            }
        }
    }
}

运行主项目,点击hook,跳转到插件plugin的activity中。
代码地址

相关文章

  • 插件化之旅3-Hook实现加载完整的apk

    一、插件化与Hook实现集中式登录架构的区别? 不同点:目的不同,集中式登录框架是利用Hook实现的,插件化是实现...

  • Android插件化(2)启动未注册的Service

    在上一篇Activity的插件化已经介绍了Android插件化的概念和通过Hook方案实现Activity的插件化...

  • 第二代插件化:Hook实现

    了解系统启动activity的过程,先检查Activity是否注册,然后再去生成该Activity。我们在检查时用...

  • Android登录拦截:动态代理+Hook的实现

    一、动态代理 + Hook 的实现 在之前的文章我们讲过插件化的实现有点类似,插件化一般是替换系统的 mInstr...

  • Hook方式实现Activity插件化

    随着应用程序的功能模块越来越多,复杂度越来越高,导致了应用程序模块之间的耦合度越来越高,App的体积也随之越来越大...

  • Hook技术实现Android插件化

    实现原理 通过Android的Activity启动原理可以知道startActivity()时,通过进程间通信(I...

  • Android 插件化实现方式(Hook)

    一、首先我们要找到Hook的点 1. 分析 我们先大概看下activity的启动流程(图片来自Android 插件...

  • NDK--andfix热修复之art虚拟机

    在so插件化原理,hook技术实现andfix热修复中,只实现了dalvik虚拟机中的热修复,安卓5.0后,谷歌彻...

  • 代理模式

    Android插件化原理解析——Hook机制之动态代理 Android插件化原理解析——概要 Retrofit2 ...

  • hook 技术简析

    最近在研究插件化开发,插件化开发的基础就是hook技术,现在市面上存在的各种插件化框架,其基础原理都是使用hook...

网友评论

      本文标题:第二代插件化:Hook实现

      本文链接:https://www.haomeiwen.com/subject/hqeplqtx.html