Android 插件化开发(四)—— LoadApk方式插件化开发

Android中的LoadedApk:使用指南与核心代码解析 LoadedApk是Android系统中的一个内部类,位于包中。它代表了一个已加载的APK文件,负责管理应用程序的资源、类加载器、以及与其他系统组件的交互。LoadedApk资源管理LoadedApk负责管理应用程序的资源,包括布局文件、字符串、图片等。类加载器管理LoadedApk负责创建和管理应用程序的类加载器,用于加载应用程序的类和资源。上下文管理LoadedApk与Context密切相关,负责为应用程序提供上下文环境。 阅读详情

插件化开发的第三种方法,其实是在第二种Hook式方法上继续改进,因为第二种hook式存在一个问题,那就是第三步中将多个apk插件进行加载,导致dexElements会很大,占用内存比较大,很有可能当插件很多时候,直接oom,因此产生了一种新的方法,就是讲LoadApk进行扩展,当加载插件时候,使用插件的LoadApk,这样就不会产生占很大内存的dexElements了。

下面是步骤:
1、绕过AMS检测,使用ProxyActivity替换PluginActivity
2、将ProxyActivity换回PluginActivity
3、将两个apk文件一起加载

1、使用ProxyActivity替换PluginActivity

 /**
     * 要在AMS执行之前,将插件中的Activity替换成ProxyActivity,替换成在宿主app的Manifest中注册的activity
     *
     * @throws Exception
     */
    private void hookAMSAction() throws Exception {
   
   

        // 我们要拿到IActivityManager对象,才能让动态代理里面的 invoke 正常执行下
        // 执行此方法 static public IActivityManager getDefault(),就能拿到 IActivityManager
        Class<?> mActivityManagerNativeClass = Class.forName("android.app.ActivityManager");
        final Object mIActivityManager = mActivityManagerNativeClass.getMethod("getService").invoke(null);

        Field mActivityManagerClassSingletonField = mActivityManagerNativeClass.getDeclaredField("IActivityManagerSingleton");
        mActivityManagerClassSingletonField.setAccessible(true);
        Object mActivityManagerClassSingleton = mActivityManagerClassSingletonField.get(null);

        Class mIActivityManagerClass = Class.forName("android.app.IActivityManager");

        Object mActivityManagerProxy = Proxy.newProxyInstance(HookApplication.class.getClassLoader(),
                new Class[]{
   
   mIActivityManagerClass}, //监听的接口
                new InvocationHandler() {
   
    //监听的回调
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
   
                        if ("startActivity".equals(method.getName())) {
   
   
                            //执行自己的逻辑,就是将插件的activity替换成宿主的ProxyActivity
                            Intent intent = new Intent(HookApplication.this, Proxy2Activity.class);
                            intent.putExtra("actionIntent", (Intent) args[2]);
                            args[2] = intent;
                        }

                        Log.e("hookapplication", "拦截到了IActivityManager里面的方法" + method.getName());
                        //要保证方法继续执行下去
                        return method.invoke(mIActivityManager, args);
                    }
                });


        if (mActivityManagerClassSingleton == null || mActivityManagerProxy == null) {
   
   
            throw new IllegalArgumentException("系统不匹配,请检查兼容性");
        }

        Class<?> mSingleTonClass = Class.forName("android.util.Singleton");
        Field mInstance = mSingleTonClass.getDeclaredField("mInstance");
        mInstance.setAccessible(true); //授权
        mInstance.set(mActivityManagerClassSingleton, mActivityManagerProxy); //替换原来的值

    }

2、将ProxyActivity换回PluginActivity

/**
     * 在activity创建时候,将ProxyActivity替换成原来跳转的activity
     *
     * @throws Exception
     */
    private void hookLaunchActivity() throws Exception {
   
   
        Class<?> mActivityThreadClass = Class.forName("android.app.ActivityThread");
        Object mActivityThread = mActivityThreadClass.getMethod("currentActivityThread").invoke(null);

        Field mHField = mActivityThreadClass.getDeclaredField("mH");
        mHField.setAccessible(true);
        Object mH = mHField.get(mActivityThread);

        Field mCallbackField = Handler.class.getDeclaredField("mCallback");
        mCallbackField.setAccessible(true);
        //将系统中的Handler.Callback实现,替换成我们自己写的CustomCallback
        mCallbackField.set(mH, new CustomCal
Android 插件化开发(一) —— 概要篇 插件化开发分为三种,如下 1、占位式插件化开发 原理:使用ProxyActivity代替要跳转的Activity,使用的上下文环境也是宿主的环境,因为插件并未安装加载,所以是没有环境的。Service、动态广播都是需要使用ProxyService、ProxyReceiver的。静态广播 就需要解析APK的manifest文件了 特点:稳定,但是开发中会存在很多的问题,需要写很多的代理类,并且四大组件中的大部分方法都需要重写,上下文使用也是存在问题。 2、Hook式: 原理:将宿主app和插件app包一起加载 阅读详情

相关推荐

实现Android动态加载APK的完整教程

在Android系统中,类加载器负责将存储在文件系统、网络等来源的.class文件或者Dalvik Executable (DEX) 文件中的字节码加载到JVM中,转换为可被运行时系统识别和使用的数据结构。在Android中,类加载器的种类主要分为以下几种:Boot ClassLoader(引导类加载器):它是所有类加载器的父类加载器,是虚拟机的一部分。它负责加载Java核心库和Android核心库。

weixin_42181686的博客 1314

dynamic-load-apk(android模块化,热更新,插件化)

android模块化,热更新,插件化

Android 免安装动态加载APK

使用说明请参看 http://blog.youkuaiyun.com/happyst1990/article/details/51146301

S32K144 ADC硬件触发+DMA传输实战:从寄存器配置到数据采集全流程

本文详细解析了S32K144微控制器中ADC硬件触发与DMA传输的协同工作机制,提供了从寄存器配置到数据采集的全流程实战指南。通过PDB定时触发ADC转换,并利用DMA实现数据自动搬运,构建了高效、实时的汽车级数据采集系统,有效释放CPU资源,满足汽车电子应用的严苛要求。

weixin_29194693的博客 474

三极管稳压电路仿真分析

Z1的负极连接到三极管的基极,三极管发射极E是输出,形成了一个射极跟随器,也就是说,E极的电压随着B电压变化而变化,但BE之间有一个压降,一般硅管0.7V左右,假设B极是6.7V,那E极就是6.7-0.7=6V,所以就有一个公式VOUT=Vz-Vbe,可以根据VOUT来选择合适的稳压管。从稳压管的SPEC中我们可以看到,Vz@Izt这个参数,指在Izt=20mA时,稳压管的稳压值Vz=5.1V,也就是说流过稳压管的电流在20mA以上,稳压效果最佳。三极管导通之后,E点电压会升高,当升高到Vbe。

U_YAO的博客 2321

国密https握手协议抓包及流程详解

使用的密码套件清单-Cipher Suite,这里服务器端选择了ECC_SM4_CBC_SM3密码套件,也就是SM2公钥算法、SM4-CBC分组密码算法和SM3杂凑算法。具体来说,这里SM2算法密钥交换算法,SM4是加密算法(SM4-CBC)、SM3是校验算法(国标要求为HMAC-SM3)。服务器的加密证书:加密证书中在同样在扩展字段中KeyUsage标识出KeyEncipherment为true和dataEncipherment为true,即数字证书中包含的公钥可用来做密钥加密密钥和数据密钥。

ryanzzzzz的博客 5847

高性能网站设计之缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这

代码技巧 1万+

Conda环境创建报错?教你快速解决Solving environment: failed和ResolvePackageNotFound问题

本文深入解析Conda环境创建中常见的'Solving environment: failed'和'ResolvePackageNotFound'报错原因,并提供从基础到高级的系统化解决方案。涵盖渠道配置、版本通配、环境文件编辑等实用技巧,帮助开发者快速解决conda环境创建问题,提升工作效率。

weixin_28677451的博客 258

数字滤波器应用介绍

线性滤波器FIR ,会引起恒定延迟,通过补零的方式补偿非线性滤波器IIR,会引起频率相关的延迟,通过零相位延迟filtfilt补偿从信号中去除不需要的频谱时,通过滤波和补偿实现。如果需要去除的频率与采样率相差甚远,比如4kHz 与100Hz, 可通过 低通滤波->补偿->降采样–> 滤波 补偿 -->上采样还原的方法。*降采样前一定要先低通滤波为了防止混叠。

weixin_39107270的博客 274

软考嵌入式 第五讲 嵌入式Linux系统技术

5.1 inittab配置文件 Linux实时操作系统开机引导时首先启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程,它是系统运行的第一个进程,进程号为1。在init运行完成并启动其他必要的后续进程后,系统开始运行,引导过程结束。 在任何时候,可以在文件inittab中添加新的记录项。重新检查inittab文件时,可以通过命令:init q/ Q使init进程立即重新读取并处理文件inittab。 5.1.1 inittab文件记录

Leon的博客 526

YOLOv11改进 | Conv篇 | 图像去雾卷积DEConv助力yolov11有效涨点(部署零额外开销)

本文介绍了一种最新改进机制用于低层视觉任务的细节增强卷积(DEConv)机制。DEConv在训练阶段采用"普通卷积+差分卷积"的多分支并联结构,增强网络对边缘、纹理等细节特征的学习能力;在推理阶段可折叠为标准3×3卷积,保持与普通卷积相同的计算效率。文中详细阐述了DEConv的工作原理、实现方法以及在YOLOv11中的应用步骤,包括核心代码解析、模型修改方法和训练配置。实验表明,该机制在去雾、去噪、超分等强调细节重建的任务中具有显著优势。文章还提供了完整的代码实现和训练指导.

Snu77的博客 2431

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: Android 插件化开发(三)—— hook式插件化开发
下一篇: Android 插件化开发(五)—— Replugin内部插件开发
明天的增加
博客等级 码龄11年 22粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值