| ±-- com.facebook.fresco:fbcore:0.11.0
| — com.facebook.fresco:imagepipeline-base:0.11.0
| ±-- com.android.support:support-v4:23.2.1
| | — LOCAL: internal_impl-23.2.1.jar
| — com.facebook.fresco:fbcore:0.11.0
±-- com.android.support:recyclerview-v7:23.0.1
| — com.android.support:support-v4:23.2.1
| — LOCAL: internal_impl-23.2.1.jar
— com.android.support:appcompat-v7:23.0.1
— com.android.support:support-v4:23.2.1
— LOCAL: internal_impl-23.2.1.jar
查看完依赖冲突关系以后在项目中解除即可,如下:
//build.gradle中各种姿势的exclude掉依赖就行了
compile (“com.facebook.react:react-native:+”){ // From node_modules.
exclude module: ‘cglib’ //by artifact name
exclude group: ‘org.jmock’ //by group
exclude group: ‘org.unwanted’, module: ‘iAmBuggy’ //by both name and group
}
当然啦,如果你是修改过 RN 源码工程然后将源码引入的模式,依赖摘除也类似,这都是 Android 开发的必备技术了,不再多提了。不过如果你想裁剪优化 RN 则这里的依赖可以不摘除,直接想办法替换为自己项目共用已有优质 lib 即可,只不过这个过程依据团队规模和投入慎重考虑,因为 RN 版本太快,合并代码很苦逼。
3-3 动态 so 库加载策略问题
现有项目中为了安装包体积和 CPU 兼容性问题,所有 so 动态库都是放在 armeabi 目录下的,没有其他目录,而 RN 却只支持编译如下 so:
//RN 的 Application.mk
APP_ABI := armeabi-v7a x86
APP_PLATFORM := android-9
这他妈就尴尬了,你提供 SDK 竟然不考虑提供完整的 ABI 编译支持。那我只能自己想办法了,首先想到的就是你不提供我就自己编译呗(前提是将 RN 以源码形式集成进项目),于是在 RN 的 Application.mk 的 APP_ABI 多添加了一个armeabi(别问我为何加在这里,后面等我写 RN 编译链分析你就明白了,别问我这是啥语法,这是 Android 开发应该必备的技能,和 RN 无关),在 build.gradle 中也对应只添加过滤 armeabi,然后编译了一把报错了,坑爹啊,依据错误信息一查看发现是有一处 Android.mk 执行时找不到一个文件,具体如下:
//编译报错的Android.mk文件路径
//react-native\ReactAndroid\src\main\jni\third-party\jsc
//Android.mk内容
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= jsc
LOCAL_SRC_FILES := jni/$(TARGET_ARCH_ABI)/libjsc.so //编译真实报错地方
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_SHARED_LIBRARY)
TARGET_ARCH_ABI 这玩意已经很明显了,做过 Android 都知道,指定是编译 armeabi ABI 时找不到 libjsc.so 文件,那就看看这个 so 是哪儿来的吧,通过 RN 源码自己的 build.gradle 可以看见如下:
// Create Android.mk library module based on so files from mvn + include headers fetched from webkit.org
task prepareJSC(dependsOn: downloadJSCHeaders) << {
copy {
from zipTree(configurations.compile.fileCollection { dep -> dep.name == ‘android-jsc’ }.singleFile)
from {downloadJSCHeaders.dest}
from ‘src/main/jni/third-party/jsc/Android.mk’
include ‘jni/**/.so’, '.h’, ‘Android.mk’
filesMatc