android资源的热更新(替换 AssetManager+LoadedApk中的资源路径)
设置LoadedApk中的mResDir
创建AssetManager, 设置资源包路径
替换AssetManager
AssetManager newAssetManager = (AssetManager) AssetManager.class.getConstructor(new Class[0]).newInstance(new Object[0]);
Method mAddAssetPath = AssetManager.class.getDeclaredMethod("addAssetPath",new Class[] {String.class});
mAddAssetPath.setAccessible(true);
if (((Integer) mAddAssetPath.invoke(newAssetManager, new Object[] {externalResourceFile
})).intValue() == 0) {throw new IllegalStateException("Could not create new AssetManager");
}Method mEnsureStringBlocks = AssetManager.class.getDeclaredMethod("ensureStringBlocks",new Class[0]);
mEnsureStringBlocks.setAccessible(true);
mEnsureStringBlocks.invoke(newAssetManager, new Object[0]);if (activities != null)for (Activity activity : activities) {Resources resources = activity.getResources();try {Field mAssets = Resources.class.getDeclaredField("mAssets");mAssets.setAccessible(true);mAssets.set(resources, newAssetManager);} catch (Throwable ignore) {Field mResourcesImpl = Resources.class.getDeclaredField("mResourcesImpl");mResourcesImpl.setAccessible(true);Object resourceImpl = mResourcesImpl.get(resources);Field implAssets = resourceImpl.getClass().getDeclaredField("mAssets");implAssets.setAccessible(true);implAssets.set(resourceImpl, newAssetManager);}Resources.Theme theme = activity.getTheme();try {try {Field ma = Resources.Theme.class.getDeclaredField("mAssets");ma.setAccessible(true);ma.set(theme, newAssetManager);} catch (NoSuchFieldException ignore) {Field themeField = Resources.Theme.class.getDeclaredField("mThemeImpl");themeField.setAccessible(true);Object impl = themeField.get(theme);Field ma = impl.getClass().getDeclaredField("mAssets");ma.setAccessible(true);ma.set(impl, newAssetManager);}Field mt = ContextThemeWrapper.class.getDeclaredField("mTheme");mt.setAccessible(true);mt.set(activity, null);Method mtm = ContextThemeWrapper.class.getDeclaredMethod("initializeTheme",new Class[0]);mtm.setAccessible(true);mtm.invoke(activity, new Object[0]);Method mCreateTheme = AssetManager.class.getDeclaredMethod("createTheme",new Class[0]);mCreateTheme.setAccessible(true);Object internalTheme = mCreateTheme.invoke(newAssetManager, new Object[0]);Field mTheme = Resources.Theme.class.getDeclaredField("mTheme");mTheme.setAccessible(true);mTheme.set(theme, internalTheme);} catch (Throwable e) {Log.e("InstantRun","Failed to update existing theme for activity " + activity, e);}pruneResourceCaches(resources);}Collection references;
if (Build.VERSION.SDK_INT >= 19) {Class resourcesManagerClass = Class.forName("android.app.ResourcesManager");Method mGetInstance = resourcesManagerClass.getDeclaredMethod("getInstance",new Class[0]);mGetInstance.setAccessible(true);Object resourcesManager = mGetInstance.invoke(null, new Object[0]);try {Field fMActiveResources = resourcesManagerClass.getDeclaredField("mActiveResources");fMActiveResources.setAccessible(true);ArrayMap arrayMap = (ArrayMap) fMActiveResources.get(resourcesManager);references = arrayMap.values();} catch (NoSuchFieldException ignore) {Field mResourceReferences = resourcesManagerClass.getDeclaredField("mResourceReferences");mResourceReferences.setAccessible(true);Collection references = (Collection) mResourceReferences.get(resourcesManager);}
} else {Class activityThread = Class.forName("android.app.ActivityThread");Field fMActiveResources = activityThread.getDeclaredField("mActiveResources");fMActiveResources.setAccessible(true);Object thread = getActivityThread(context, activityThread);HashMap map = (HashMap) fMActiveResources.get(thread);references = map.values();
}for (WeakReference wr : references) {Resources resources = (Resources) wr.get();if (resources != null) {try {Field mAssets = Resources.class.getDeclaredField("mAssets");mAssets.setAccessible(true);mAssets.set(resources, newAssetManager);} catch (Throwable ignore) {Field mResourcesImpl = Resources.class.getDeclaredField("mResourcesImpl");mResourcesImpl.setAccessible(true);Object resourceImpl = mResourcesImpl.get(resources);Field implAssets = resourceImpl.getClass().getDeclaredField("mAssets");implAssets.setAccessible(true);implAssets.set(resourceImpl, newAssetManager);}resources.updateConfiguration(resources.getConfiguration(),resources.getDisplayMetrics());}
}
android资源的热更新(替换 AssetManager+LoadedApk中的资源路径)相关推荐
- HBuilderX使用uniapp框架开发Android应用实现热更新
目录 实现热更新功能的思路 准备工作 实现代码 细节问题!!! 实现热更新功能的思路 1.打开应用时就能立马从manifest.json获取本机应用的版本号version1. 2.拿到版本号versi ...
- 阿里热更新android,阿里最新热更新使用采坑记录
1.必须在AndroidManifest.xml中配置 android:name="com.taobao.android.hotfix.IDSECRET" android:valu ...
- flutter已经支持安卓热更新_flutter 在 android 上的热更新
热更新是一种需求吧. 自然会想到flutter 是否支持热更新. 然后一些群里问了问普遍反映不可以热更新,还说咸鱼的文章写了不支持热更新. 然后我表示很怀疑. 我的结论可以做到热更新 1.你需要把fl ...
- Android 美团Robust热更新 使用入门
Android热更新方案Robust 相信很多人都认识了解过 热修复.热更新.热补丁(对于这个技术也没有特别标准的一种叫法,下面我统一叫热更新),之后的一年里,各种热更新方案如雨后春笋般出现,比较耳熟 ...
- uniapp-wgt热更新WGT安装包中manifest.json文件不存在或者unexpected EOF
UNIAPP官方给出了一个wgt热更新功能,通过热更新我们可以进行小部分功能的更新热更新官方地址 通过官方给出的教程进行前端搭建 export const updateWgt = () => { ...
- React Native 实现热更新方案CodePush过程中遇到的问题 ( 搭建自己的CodePush服务器 )
前言 CodePush官方: https://github.com/Microsoft/react-native-code-push 自搭建CodePushServer: https://github ...
- Android 热补丁技术——资源的热修复
前言 今年真是热补丁框架的洪荒之力爆发的一年,短短几个月内,已经出现了好几个热修复的框架了,基本上都是大同小异,这里我就不过多的去评论这些框架.只有自己真正的去经历过,你才会发现其中的 大写的坑 事实 ...
- Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex
一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...
- Android热更新
Android热更新 组件化 组件化和模块化其实一回事,都是拆分多个 module 进行开发,组件化的叫法更偏向封装系统功能,比如统一对话框封装,网络封装等,而模块化叫法更偏向业务方面,比如登录模块等 ...
最新文章
- Transformer又出新变体∞-former:无限长期记忆,任意长度上下文
- Windows8 解决VMware与Hyper-V不兼容共存方法
- tomcat war java_java – 启动Tomcat WAR
- 请确定指定的驱动器中是否有盘_百格拉伺服驱动器维修常见故障现象及处理方法...
- 控制ASP.NET Web API 调用频率与限流
- Linux入门基础分享[一]
- 大话数据结构 : 二叉排序树
- Web前端开发CSS基础(2)
- plsql轻量版记录类型2
- Apache CXF实战之二 集成Sping与Web容器
- 力扣-83 删除排序链表中的重复元素
- Vue项目中使用eslint的笔录,编辑器采用sublime3
- python微服务开发pdf_微服务架构实战 中文pdf完整版[207MB]
- 计算机专业论文周记20篇,毕业论文工作周记6篇
- python读取excel中数据绘制柱状图_Python的Excel操作及数据可视化
- warpaffine 旋转有一部分消失_OpenCV warpAffine的天坑
- 计算机课程进制的转换,计算机课程设计 进制转换
- Git本地版本回退与远端版本回退(回滚)
- phpnow下安装cmstop大众版需要注意的地方
- PANGU 生态乐园 NFT 系列上线 The Sandbox 市场平台
热门文章
- zabbix 监控 Esxi
- Unity内置的三套消息发送机制的应用实例
- 积跬步,聚小流------Bootstrap学习记录(3)
- oracle性能调整的九大要点:四诊断latch竞争
- WebSphere Application Server v6中的问题诊断以及日志策略
- MySQL之常用函数
- [UOJ #167]【UR #11】元旦老人与汉诺塔
- 每个zone的low memory是怎么计算出来的
- 2018第九届蓝桥杯省赛真题 C语言B组 第一题
- Hardcoded string 下一步, should use @string resource警告 (转载)