Android插件学习汇总(持续更新)
来源:互联网 发布:淘粉吧和淘宝的关系 编辑:程序博客网 时间:2024/04/29 05:07
Android插件学习
Android插件好处
- 实现热更新操作
- 业务热拔插
- 提高启动速度
基本实现
使用一个宿主APK,即空壳程序,通过动态加载功能跟实现插件包调用,从而实现动态更新的功能。
开篇
对于这一个块的内容学习,我也是刚刚接触,希望从我一步一步学习下去,由浅入深,更好的理解这个动态加载过程,最终目标能够实现一个相对比较完备的插件框架。
å
基础知识
DexClassLoader可以实现对于Dex、jar、Apk加载
入门篇
1. DL(Dynamic-load-apk)
该框架使用代理的方式实现插件框架
由于作者写过相关的文章,这边引用其文章内容作为基础,我对其进行补充。
Android apk动态加载机制的研究
首先根据上面的文章进行第一次的实践,在实践过程中进行理解和分析。
在上述文章中主要讲的是如何实现代理,如何对Activity类进行改造。
代理原理:
1、首先获取到插件包位置,然后调用PackageManger.getPackageArchiveInfo()函数来获取其中PackageInfo
protected void launchTargetActivity() { PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo( mDexPath, PackageManager.GET_ACTIVITIES); if ((packageInfo.activities != null) && (packageInfo.activities.length > 0)) { String activityName = packageInfo.activities[0].name; // 主要是获取打开的Activity名称 mClass = activityName; Log.d("TAG", mClass); launchTargetActivity(mClass); // 作为参数传入 } }
2、主要有三部
a. 通过反射调用获取到代理类
Class<?> localClass = dexClassLoader.loadClass(className);Constructor<?> localConstructor = localClass.getConstructor(new Class[] {});Object instance = localConstructor.newInstance(new Object[] {});
b. 传入当前Activity,代理类保存起来
Method setProxy = localClass.getMethod("setProxy",new Class[] { Activity.class });setProxy.setAccessible(true);setProxy.invoke(instance, new Object[] { this }); // 传入当前Activity
代理类中:
public void setProxy(Activity proxyActivity) { mProxyActivity = proxyActivity;}
c. 使用宿主APP的Activity对象来进行调用相关功能,即onCreate函数
Method onCreate = localClass.getDeclaredMethod("onCreate", new Class[] { Bundle.class });onCreate.setAccessible(true);Bundle bundle = new Bundle();bundle.putInt(FROM, FROM_EXTERNAL);onCreate.invoke(instance, new Object[] { bundle });
3、代理类BaseActivity:
@Override public void setContentView(View view) { if (mProxyActivity == this) { super.setContentView(view); } else { mProxyActivity.setContentView(view); // 主要用传入的Activity类实现相关操作 } }
注意:
为了访问相关路径下的插件包,需要相关的权限
<!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
结尾
对当前学习的一个总结
2017-04-19 16:47:10 更新的基础DL分析,下一步学习资源文件访问
0 0
- Android插件学习汇总(持续更新)
- Android Studio 必备插件汇总(持续更新中......)
- Android学习视频精品课程汇总(持续更新)
- Error汇总之Android学习篇(持续更新)
- Android 学习资源大全集汇总(github持续更新)
- Android 学习资源大全集汇总(github持续更新)
- Android学习资源汇总(持续更新)
- 深度学习资料汇总(持续更新)
- 机器学习资源汇总(持续更新)
- 个人学习资料汇总(持续更新)
- 学习资料汇总(持续更新)
- android FragMent 错误汇总 (持续更新)
- Android技术提高汇总(持续更新)
- Eclipse插件安装地址汇总---持续更新
- Android实用插件,持续更新
- 【我的Android进阶之旅】Realm数据库学习资料汇总(持续更新)
- 问题汇总(持续更新)
- cocos2d-x学习资源汇总(持续更新。。。)
- 一洽客服客户试用转化率100%
- setInterval设置停止和循环
- Web前端——Javascript复习(数组)
- 前端小白进阶Day5-优化卡片
- C++中的头文件(.h)和源文件(.cc)
- Android插件学习汇总(持续更新)
- Android实现手势检测
- 从未如此惊艳!你好,SuperTextView
- ORA-01090: shutdown in progress
- 正则表达式从零开始学习系列(三)
- Docker Swarm架构、特性与基本实践
- 服务器
- APP安全报告第八期:保护用户的隐私数据,网约车你做到了吗?
- Bootstrap ace 中tooltip()与popover()方法demo,亲测