React Native Android 从学车到补胎和成功发车经历,kotlin静态方法

| ±-- 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值