设置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中的资源路径)相关推荐

  1. HBuilderX使用uniapp框架开发Android应用实现热更新

    目录 实现热更新功能的思路 准备工作 实现代码 细节问题!!! 实现热更新功能的思路 1.打开应用时就能立马从manifest.json获取本机应用的版本号version1. 2.拿到版本号versi ...

  2. 阿里热更新android,阿里最新热更新使用采坑记录

    1.必须在AndroidManifest.xml中配置 android:name="com.taobao.android.hotfix.IDSECRET" android:valu ...

  3. flutter已经支持安卓热更新_flutter 在 android 上的热更新

    热更新是一种需求吧. 自然会想到flutter 是否支持热更新. 然后一些群里问了问普遍反映不可以热更新,还说咸鱼的文章写了不支持热更新. 然后我表示很怀疑. 我的结论可以做到热更新 1.你需要把fl ...

  4. Android 美团Robust热更新 使用入门

    Android热更新方案Robust 相信很多人都认识了解过 热修复.热更新.热补丁(对于这个技术也没有特别标准的一种叫法,下面我统一叫热更新),之后的一年里,各种热更新方案如雨后春笋般出现,比较耳熟 ...

  5. uniapp-wgt热更新WGT安装包中manifest.json文件不存在或者unexpected EOF

    UNIAPP官方给出了一个wgt热更新功能,通过热更新我们可以进行小部分功能的更新热更新官方地址 通过官方给出的教程进行前端搭建 export const updateWgt = () => { ...

  6. React Native 实现热更新方案CodePush过程中遇到的问题 ( 搭建自己的CodePush服务器 )

    前言 CodePush官方: https://github.com/Microsoft/react-native-code-push 自搭建CodePushServer: https://github ...

  7. Android 热补丁技术——资源的热修复

    前言 今年真是热补丁框架的洪荒之力爆发的一年,短短几个月内,已经出现了好几个热修复的框架了,基本上都是大同小异,这里我就不过多的去评论这些框架.只有自己真正的去经历过,你才会发现其中的 大写的坑 事实 ...

  8. Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex

    一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...

  9. Android热更新

    Android热更新 组件化 组件化和模块化其实一回事,都是拆分多个 module 进行开发,组件化的叫法更偏向封装系统功能,比如统一对话框封装,网络封装等,而模块化叫法更偏向业务方面,比如登录模块等 ...

最新文章

  1. Transformer又出新变体∞-former:无限长期记忆,任意长度上下文
  2. Windows8 解决VMware与Hyper-V不兼容共存方法
  3. tomcat war java_java – 启动Tomcat WAR
  4. 请确定指定的驱动器中是否有盘_百格拉伺服驱动器维修常见故障现象及处理方法...
  5. 控制ASP.NET Web API 调用频率与限流
  6. Linux入门基础分享[一]
  7. 大话数据结构 : 二叉排序树
  8. Web前端开发CSS基础(2)
  9. plsql轻量版记录类型2
  10. Apache CXF实战之二 集成Sping与Web容器
  11. 力扣-83 删除排序链表中的重复元素
  12. Vue项目中使用eslint的笔录,编辑器采用sublime3
  13. python微服务开发pdf_微服务架构实战 中文pdf完整版[207MB]
  14. 计算机专业论文周记20篇,毕业论文工作周记6篇
  15. python读取excel中数据绘制柱状图_Python的Excel操作及数据可视化
  16. warpaffine 旋转有一部分消失_OpenCV warpAffine的天坑
  17. 计算机课程进制的转换,计算机课程设计 进制转换
  18. Git本地版本回退与远端版本回退(回滚)
  19. phpnow下安装cmstop大众版需要注意的地方
  20. PANGU 生态乐园 NFT 系列上线 The Sandbox 市场平台

热门文章

  1. zabbix 监控 Esxi
  2. Unity内置的三套消息发送机制的应用实例
  3. 积跬步,聚小流------Bootstrap学习记录(3)
  4. oracle性能调整的九大要点:四诊断latch竞争
  5. WebSphere Application Server v6中的问题诊断以及日志策略
  6. MySQL之常用函数
  7. [UOJ #167]【UR #11】元旦老人与汉诺塔
  8. 每个zone的low memory是怎么计算出来的
  9. 2018第九届蓝桥杯省赛真题 C语言B组 第一题
  10. Hardcoded string 下一步, should use @string resource警告 (转载)