如果只想看解決步驟,請查看第7小段。
如果只想看解決步驟,請查看第7小段。
如果只想看解決步驟,請查看第7小段。
1: React-native 引入到Android開發環境中需要修改的gradle腳本,包含以下兩部分:
allprojects {
repositories {
jcenter()
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
maven { url "$rootDir/node_modules/react-native/android" }
}
}
dependencies {
compile 'com.facebook.react:react-native:+'
}
2:引入react-native到android項目時會引入一個aar,由于沒有明確指定react-native的版本(只是一個+
號,表示最新版本),所以引入項目aar的版本由npm install
控制;
npm install
命令會根據根據項目目錄下的package.json進行下載相關文件;例如:
{
"name": "RentFive",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"bundle-android": "react-native bundle –platform android –dev true –entry-file index.android.js –bundle-output app/src/main/assets/index.android.bundle –sourcemap-output app/src/main/assets/index.android.map –assets-dest app/src/main/res/"
},
"author": "",
"license": "ISC",
"dependencies": {
"eslint": "^3.7.1",
"eslint-plugin-react": "^6.4.0",
"react": "15.3.2",
"react-native": "^0.35.0"
},
"devDependencies": {
"babel-jest": "16.0.0",
"babel-preset-react-native": "1.9.0",
"jest": "16.0.2",
"jest-react-native": "16.0.0",
"react-test-renderer": "15.3.2"
}
}
上方文本中控制的 -->"react-native": "^0.35.0"
<-- 語句控制了react-native引入android項目的reacti-native aar版本;
3:react-native生成aar的源碼在npm install
命令下載生成的
'$項目根目錄'\node_modules\react-native\ReactAndroid
中;
aar中關于對于CPU限制在
'$項目根目錄'\node_modules\react-native\ReactAndroid\src\main\jni\Application.mk
,
在這個文件中,我們可以到:
APP_BUILD_SCRIPT := Android.mk
APP_ABI := armeabi-v7a x86
APP_PLATFORM := android-9
APP_MK_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_MODULE_PATH := $(APP_MK_DIR)$(HOST_DIRSEP)$(THIRD_PARTY_NDK_DIR)$(HOST_DIRSEP)$(REACT_COMMON_DIR)$(HOST_DIRSEP)$(APP_MK_DIR)first-party
APP_STL := gnustl_shared
# Make sure every shared lib includes a .note.gnu.build-id header
APP_LDFLAGS := -Wl,--build-id
NDK_TOOLCHAIN_VERSION := 4.8
說明了CPU的類型限定在了armeabi-v7a
和x86
上
4: 所以在android編譯打包的時候,要正確運行react-native項目,需要對CPU的編譯環境進行限制,如下
ndk {
abiFilters "armeabi-v7a", 'x86' // 指定要ndk需要兼容的架構
}
和
packagingOptions {
exclude "lib/arm64-v8a/librealm-jni.so"
}
這樣可以保證android在項目編譯時,只引入需要的so文件(只生成CPU限定好的so文件 )
5: 以上步驟的操作決定了react-native的aar版本和所支持的CPU環境,一般情況下就能夠實現項目的正常運行,但是在另外一些情況下,比如有其他的功能引入也需要引入so文件,這樣同時會現在CPU的環境,這樣就可能會存在沖突;
比如高德地圖,只支持armeabi
環境(由于高德的在線說明文檔更新延遲,其實高德SDK已經支持arm64-v8a,不過這個支持無法解決CPU環境沖突的問題)
高德地圖CPU支持環境說明:
http://lbs.amap.com/dev/ticket#/faq/291
和
http://lbs.amap.com/api/android-navi-sdk/guide/create-project/android-studio/#add-so;
由于高德地圖和react-native環境的沖突,導致項目無法正常運行,要么react-native頁面運行正常,需要使用到高德地圖的模塊進入就崩潰,要么高德地圖的模塊正常,進入react-native相關頁面就崩潰。
6: 有存在沖突,為解決沖突,除了各自引入相對應的CPU環境so包,如果沒有相關so包供我們引入,就需要分析各種CPU環境的兼容情況;
首先android支持的CPU環境情況如下:
https://developer.android.com/ndk/guides/application_mk.html
各種CPU結構中的兼容情況如下(后續會使用自有鏈接):
http://blog.csdn.net/u011688880/article/details/46984547
總之可以得到一個結論,armeabi-v7a
的so包能夠兼容的使用到armebai
環境下,由此可以出現一個解決方案;
7: 解決react-native和高德地圖等需要引入so文件的項目而導致的CPU環境沖突問題。
- 使用
armeabi-v7a
環境生成 app_xxx.apk 文件; - 解壓 app_xxx.apk 文件(可以重命名rar或者zip,然后再解壓),得到
$解壓目錄\lib\armeabi-v7a
的所有libxxxx.so文件; - 把得到的所有libxxxx.so文件全部放入到android的本地項目中(不要問我放到哪個文件夾);
- 使用
armebi
重新編譯生成 app_yyy.apk文件; - app_yyy.apk 文件就是一個只支持armebai環境的包,但是同時也支持了react-native環境的包,解決了因為編譯環境導致的so文件沖突;
8: 對于其他CPU環境的沖突,請參考第6和第7兩小段的內容,可以解決沖突(獲取可以,我沒有一個個去試)