React-native集成到Android時由編譯CPU類型限制所產生的問題

如果只想看解決步驟,請查看第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-v7ax86

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兩小段的內容,可以解決沖突(獲取可以,我沒有一個個去試)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評論 25 708
  • 持續更新中...... 一套企業級的 UI 設計語言和 React 實現。 https://mobile.ant....
    日不落000閱讀 5,786評論 0 35
  • It is safe to embed user input in JSX: 像這樣在JSX中嵌入用戶輸入是安全的...
    人頭原子彈閱讀 949評論 0 0
  • 《圓桌派》有一集對“師徒”進行的討論,裡面提到諸如郭德綱師徒等社會事件,不由得對此進行了思考。第一次接觸到師徒這...
    鳥琴y閱讀 176評論 2 0
  • 重聽了馮淑仙老師的《情緒控制》講座,找到了綻放讀書會的某一次筆記,貼出來讓更多人受益。 情緒本來不是問題,可是過度...
    含羞的紅顏閱讀 1,099評論 0 0