http://www.jianshu.com/p/f751be55d1fb

字数549 阅读177 评论0 喜欢0
  • 需求很简单 ,就是加载指定文件夹下的.so。
  • 原因:android在程序运行的状态下 ,无法在 data/data/packageName/lib 下写文件,但可读。
  • 还有一个引申的问题:data/app-lib/packageName/ 下的.so 和 data/data/packageName/lib 的.so 是什么关系

1 . 获取全局的classloader

PathClassLoader pathClassLoader = (PathClassLoader)context.getClassLoader();
DexClassLoader myDexClassLoader = new DexClassLoader(str, context.getDir("dex", 0).getAbsolutePath(), str, context.getClassLoader().getParent());

2 . 获取pathList

Object pathList = getPathList(pathClassLoader);

3 . 添加路径

File[] file = new File[]{
new File("/data/app-lib/pakageName-1"),
new File("/data/app-lib/pakageName-2"), new File("/data/data/pakageName/files"), new File("/vendor/lib"), new File("/system/lib") } ;

4 . 获取当前类的属性

Object nativeLibraryDirectories=pathList.getClass().getDeclaredField("nativeLibraryDirectories");
((Field)nativeLibraryDirectories).setAccessible(true);

5 . 设置新的路径

((Field)nativeLibraryDirectories).set(pathList, file);

6 . 对classloader的操作,对应于BaseDexClassLoader:

public BaseDexClassLoader(String dexPath,File optimizedDirectory,String libraryPath,ClassLoader parent){ super(parent); this.pathList=new DexPathList(this,dexPath,libraryPath,optimizedDirectory); }

7 . dex,library路径对应于DexPathList, 这部分和热补丁密切相关,有兴趣可以搜下hotfix ,很多开源项目。

privatefinalElement[]dexElements;  //这部分就是dex分包的了,热补丁,热补丁,热补丁
privatefinalFile[]nativeLibraryDirectories;//这部分就是 libs 加载路径了,默认有 /vendor/lib  system/lib  data/app-lib/packageName

最后给下代码:

    public static void initNativeDirectory(Application application) { if (hasDexClassLoader()) { try { createNewNativeDir(application); } catch (Exception e) { e.printStackTrace(); } } } private static void createNewNativeDir(Context context) throws Exception{ PathClassLoader pathClassLoader = (PathClassLoader) context.getClassLoader(); Object pathList = getPathList(pathClassLoader); //获取当前类的属性 Object nativeLibraryDirectories = pathList.getClass().getDeclaredField("nativeLibraryDirectories"); ((Field) nativeLibraryDirectories).setAccessible(true); //获取 DEXPATHList中的属性值 File[] files1 = (File[])((Field) nativeLibraryDirectories).get(pathList); Object filesss = Array.newInstance(File.class, files1.length + 1); //添加自定义.so路径 Array.set(filesss, 0, new File(context.getFilesDir().getAbsolutePath())); //将系统自己的追加上 for(int i = 1;i<files1.length+1;i++){ Array.set(filesss,i,files1[i-1]); } // File[] filesss = new File[file.length+ files1.length]; // filesss[0] = file[0]; // for(int i = 1;i < files1.length+1;i++){ // filesss[i] = files1[i]; // } ((Field) nativeLibraryDirectories).set(pathList, filesss); } private static Object getPathList(Object obj) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { return getField(obj, Class.forName("dalvik.system.BaseDexClassLoader"), "pathList"); } private static Object getField(Object obj, Class cls, String str) throws NoSuchFieldException, IllegalAccessException { Field declaredField = cls.getDeclaredField(str); declaredField.setAccessible(true); return declaredField.get(obj); } /** * 仅对4.0以上做支持 * @return */ private static boolean hasDexClassLoader() { try { Class.forName("dalvik.system.BaseDexClassLoader"); return true; } catch (ClassNotFoundException var1) { return false; } }

参考链接

  • BaseDexClassLoader 实现

  • DexPathList 实现

  • Java中System.loadLibrary() 的执行过程

android loadlibrary 更改libPath 路径,指定路径加载.so相关推荐

  1. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )

    文章目录 前言 一.查找 DexFile 对应的 C++ 代码 1.根据 Native 文件命名惯例查找 C++ 代码 2.根据方法名查找 二.dalvik_system_DexFile.cpp 源码 ...

  2. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )

    文章目录 前言 一.DexFile.loadDexFile 函数分析 二.DexFile 构造函数分析 三.DexFile.openDexFile 函数分析 前言 上一篇博客 [Android 逆向] ...

  3. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  4. [Android] 输入系统(三):加载按键映射

    映射表基本概念 由于Android调用getEvents得到的key是linux发送过来的scan code,而Android处理的是类似于KEY_UP这种统一类型的key code,因此需要有映射表 ...

  5. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 )

    文章目录 前言 一.根据 File 加载 DexFile 二.DexPathList.loadDexFile 函数分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DexClassLo ...

  6. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )

    文章目录 前言 一.DexPathList 构造函数分析 二.DexPathList.makeDexElements 函数分析 三.Element 类分析 前言 上一篇博客 [Android 逆向]整 ...

  7. android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

    今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...

  8. android 加载条封装,Android基于JsBridge封装的高效带加载进度的WebView

    图片发自简书App 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,<Android JsBridge实战 打造专属你的Hybrid APP ...

  9. Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤

    第一步.先制做一个有我们需要的图片资源的APK 如下图,这里有个about_log.png,我们需要生成apk文件. 生成的apk文件如果你不到项目的文件夹里面去取apk,想通过命令放到手机里面去可以 ...

最新文章

  1. 雷林鹏分享:MySQL 及 SQL 注入
  2. 更新登录SAP后的LOGO
  3. linux下camera驱动分析_《Linux设备驱动程序》(五)——字符设备驱动(下)
  4. 本地java【动态监听】zk集群节点变化
  5. 在Grails战争中添加“精简” Groovy Web控制台
  6. linux中权限765啥意思,Linux中的文件权限
  7. 将数据库表导入到solr索引
  8. (五)使用模型单元测试进行MLOps持续交付
  9. php ai,php能做AI智能吗
  10. 电脑的发展史_苹果都使用自研芯片了,你还记得你的第一台电脑吗?
  11. JMeter安装详细教程
  12. 电脑护眼,老司机教你电脑护眼设置怎么开
  13. WRF Output Fields描述
  14. 书名带冒号_书名号、引号、括号和冒号如何套用
  15. JAVA工具类——身份证校验
  16. 计算机毕业设计抄袭,学生毕业设计抄袭他人纪录片,只算“侵权”? 西安工程大学称属学术不端...
  17. HPatches A benchmark and evaluation of handcrafted and learned local descriptors——2017.04
  18. 2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解
  19. 大数据 - 指标 - 流量
  20. 国内众多云桌面你更中意谁

热门文章

  1. javascript中变量
  2. hive工作记录-20180513
  3. ueditor百度编辑器中,多图上传后,图片顺序乱掉的处理方法
  4. jq的ajax和模块引擎
  5. easyUI的combobox是否可用
  6. Windows 2008远程桌面多用户登陆的配置方法 - z
  7. 图像的打开、修改、显示和保存示例(OpenCV 2.0)
  8. [caffe]深度学习之CNN检测object detection方法摘要介绍
  9. caffe读书笔记1 CIFAR-10在caffe上进行训练与学习
  10. 全新版本仿网易云音乐来啦