• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
m0_66265031
帮助3

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhchhi
系列文章
更多 icon
同类精品
更多 icon
继续加载