转自: https://segmentfault.com/a/1190000002919135


之前看到简书Android客户端使用的编辑器,甚是喜欢,它的优雅以及高性能的特点让我爱不释手,很想自己也去做一个。此前实现过一个在Android上的Markdown编辑器但是界面以及所见即所得的效果非常不好看,所以一直耿耿于怀。

然后冒昧看了下简书的布局系统,看见了几个奇怪的类,包括类似XWalkContentView,于是Google了下,就查到了CrossWalk这个hybrid框架了。第一眼并不觉得它有啥不一样,以为是一个Cordova的轮子。后来细看,发现是自个儿编辑了整个Chrominum,屌屌屌!

运行个demo,wrapper了一个http://sf.gg 发现体验真的是不错啊,webview性能到这个水平内心都宽慰了,但是为何安装速度那么慢呢?一看apk大小,足足有40M+,感觉天都要塌了。SegmentFault for Android 客户端才3.03M,我要是包上这玩意,估计就没多少人下了吧。。。然后又看看简书,整个apk大小才8M,在启动编辑器的时候,提示需要下载编辑器,下载了一会,然后再打开。顿时就明白了,看来它的库是从外部载入的,记得以前看到过从外部加载动态链接库想想很是简单,于是入坑了。

DavlikDexClassLoader Unsatisfied Link library['/xxxx/xxx.apk', '/vendor/lib', '/system/lib']

一看这个路径,泪奔了,原来library path只有三个路径下去检查,算了,我们不是有System.load和System.loadLibrary函数么,直接调用呗,于是我就先暂时把绝对路径给写了下来,直接调用System.load函数。

再次启动,发现CrossWalk报Shared Library should use SharedXWalkView。但是使用SharedXWalkView有许多的限制,比如需要安装一个CrossWalk Runtime的apk,奇怪了,它怎么知道我是用Shared Library的呢?而且简书也没有说要安装apk啊。

于是我继续研究,开始看CrossWalk的源码,找到ReflectionHelper这个类里面有一行代码shouldUseLibrary(),它会去调用System.loadLibrary()如果没有报异常,则返回false,否则返回true。

我们知道System.loadLibrary这个函数,会去java.library.path这个环境变量的路径下面寻找库,而Android是不允许我们更改这个环境变量的值的,就导致CrossWalk认为并没有加载它的runtime而去开启Shared模式。

OK,知道怎么解决就方便了,首先,我们要把so文件放入到/data/data//下的任意路径,因为我们的apk有这个权限在这里放东西,然后使用System.load加载这个so库,最后使用反射的方式欺骗CrossWalk框架,告诉它我们的类库已经加载完毕。

我们仔细研究下它的源码,发现有几个标志位需要更改,具体代码如下:

System.load(libPath);
try {LibraryLoader loader = LibraryLoader.get(1);Class c = Class.forName("org.xwalk.core.internal.XWalkViewDelegate");Field field = c.getDeclaredField("sLibraryLoaded");field.setAccessible(true);field.setBoolean(null, true);field.setAccessible(false);field = LibraryLoader.class.getDeclaredField("mLoaded");field.setAccessible(true);field.setBoolean(loader, true);field.setAccessible(false);PathUtils.setPrivateDataDirectorySuffix("xwalkcore");} catch (NoSuchFieldException e) {e.printStackTrace();
} catch (IllegalAccessException e) {e.printStackTrace();
} catch (ClassNotFoundException e) {e.printStackTrace();
} catch (ProcessInitException e) {e.printStackTrace();
}

只要把以上的类中的标志位更改掉,那么CrossWalk就认为库已经加载成功了。

本人最近做一个的项目,大概逻辑是需要使用CrossWalk浏览的APP,但是CrossWalk的so文件比较大,所以不能与apk包一起发布,需要安装完以后从网络下载动态加载,但是用系统System.load(pathName)加载完毕后使用XWalkInitializer初始化还是失败,期间也考虑过使用官方的共享模式,但需要下载安装apk(CrossWalk的运行库),体验较差。最终阅读楼主的博客完美解决动态加载so文件的问题。

CrossWalk - Android 动态加载so库文件相关推荐

  1. android 加载三方so的方法_Android开发教程之动态加载so库文件的方法

    Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...

  2. QLibrary 动态加载外部库文件

    /*转载请注明出处,谢谢*/ 背景:想搭一个软件系统,包含一个主模块,一堆子模块(用于扩展功能).主模块是一个可执行程序,子模块为动态库,可以加载在主模块中. 问题:每添加一个扩展功能就要修改一下主模 ...

  3. android 动态加载sdk,LiteAVSDK集成,因此可以动态加载库

    在Android开发中,Android Studio用于集成第三方SDK(例如,腾讯视频云移动直播,播放器,短视频以及实时音频和视频). 通常有两种集成方法: aar集成和jar + so集成. An ...

  4. android 动态库获取路径问题,一种Android App在Native层动态加载so库的方案

    这篇文章通过实战案例,介绍了一种有条理的组织Native层代码层级结构的方法.并且,在良好的代码层级.作用分工的基础上,实现了动态的按需加载.卸载so库.文章的最后,还介绍了实践过程中遇到的困难以及对 ...

  5. ANDROID动态加载 使用SO库时要注意的一些问题

    转载自:http://blog.csdn.net/qq_23331691/article/details/51699888 基本信息 作者:kaedea 项目:android-dynamical-lo ...

  6. Android基础——动态加载so库

    Android中动态加载so 原因:如果把so文件直接放在libs目录下,在android程序启动的时候会默认加载libs目录下的所有so库,但这些so库可能会在某些地方存在冲突,使用动态加载so库, ...

  7. android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件

    Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...

  8. Android动态加载进阶 代理Activity模式

    基本信息 作者:kaedea 项目:android-dynamical-loading 技术背景 简单模式中,使用ClassLoader加载外部的Dex或Apk文件,可以加载一些本地APP不存在的类, ...

  9. Android动态加载技术

    基本信息 Author:kaedea GitHub:android-dynamical-loading 我们很早开始就在Android项目中采用了动态加载技术,主要目的是为了达到让用户不用重新安装AP ...

最新文章

  1. [python][jupyter notebook]之菜鸟安装[pyecharts]中Geo或Map显示问题
  2. 一个简单RPC框架是怎样炼成的(II)——制定RPC消息
  3. C++内联函数学习总结
  4. Rhel6.0升级内核到3.0.4
  5. java.lang.IllegalArgumentException: Can not set XXX to com.sun.proxy.$Proxy28
  6. 松下a6伺服驱动连接光栅尺_FANUC常见伺服报警及故障解决方法
  7. 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程
  8. 2-1-XML和约束文档
  9. cardBattle游戏启动场景设计
  10. Rust学习:13.1_返回值和错误处理之panic 深入剖析
  11. unity3D 自定义显示中文
  12. 微服务-高并发-思路
  13. 【学习生涯】预科学习笔记
  14. Commons Collections
  15. 【萌新向】c语言求解八数字(华容道)问题
  16. win10服务器 稳定性,如何检测Win10系统稳定性?
  17. AE图片跨软件复制粘贴扩展脚本 Copy Pasta for Mac 破解版
  18. java缓存读写文件小例子
  19. java#python#c#技术交流QQ群
  20. 百天记忆-数字编码记忆

热门文章

  1. 什么是金手指,金手指的设计要求有哪些?
  2. l7sa008b故障代码_华硕主板故障维代码指南
  3. java-net-php-python-jspm人力外包服务公司招聘管理系统计算机毕业设计程序
  4. 麒麟服务器v10系统安装时报错,银河麒麟V10服务器版本编译安装php7.2.12
  5. 多测师_Python(re 模块)
  6. “好奇号”的火星发展观
  7. Dynamic CRM9.0 环境安装部署手册步骤和遇到的一些问题解决方案(包含ADFS部署)
  8. 增量式PID控制算法及仿真
  9. Window程序设计(一)
  10. Delphi 中 FireDAC 数据库连接(多线程)