@author ASCE1885的 Github 簡(jiǎn)書 微博 CSDN
本文由于潛在的商業(yè)目的,不開放全文轉(zhuǎn)載許可,謝謝!

公司的網(wǎng)絡(luò)可能由于防火墻等原因,使用Gradle在線依賴去下載React Native(以下簡(jiǎn)稱RN)的aar包可能一天都下載不下來,而在使用家中的Wi-Fi就幾分鐘的事??,當(dāng)然目前還沒法實(shí)現(xiàn)家中辦公,而且如果讓團(tuán)隊(duì)內(nèi)其他同事也都每次等一天才下載下來,效率將是極其低下的。因此,只能將RN的aar包下載下來,并設(shè)置為本地依賴模式,同時(shí)引入RN依賴的第三方開源庫。
我們先來看看默認(rèn)的在線依賴RN的方式:
compile 'com.facebook.react:react-native:0.14.+'
下載react-native.aar
RN的aar包托管在Bintray上面,因此,我們可以自己將其下載下來,從而將在線依賴+下載 改為 手動(dòng)下載+本地依賴。打開bintray搜索react-native,可以查找到React Native的官方Bintray網(wǎng)址,在這個(gè)主頁中,可以看到RN的一系列版本,最新的是0.15.1:

點(diǎn)擊某個(gè)版本,進(jìn)入特定的版本頁面,選擇Files標(biāo)簽,可以看到如下圖所示的文件列表,在這個(gè)表中可以選擇我們所需要的react-native-0.14.0.aar下載下來即可。

react-native.aar的文件內(nèi)容
aar文件本質(zhì)上是一個(gè)壓縮包,我們可以將其后綴名由.aar修改為.zip,然后解壓得到如下所示目錄:

其中,classes.jar就是ReactAndroid的代碼,使用JD-GUI工具可以一目了然:

而jni目錄中存放的是RN依賴的so庫,可以看到,為了減小使用RN的APK的包大小,只支持了armeabi-v7a和x86兩個(gè)處理器架構(gòu)平臺(tái):

res目錄包含了RN需要的資源,其中包含了很多國(guó)際化的文件:

對(duì)于我們的應(yīng)用而言,一般只需要簡(jiǎn)體中文版本的就夠了,因此,為了減小APK包大小,在我們工程的app/build.gradle文件中增加如下過濾,去掉其他語言的資源:
android {
// 省略其他
defaultConfig {
// 省略其他
resConfigs "zh-rCN"
resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
}
Gradle本地依賴
把下載后的aar文件拷貝到工程的app/libs中,接著修改build.gradle文件,添加本地aar文件依賴如下:
dependencies {
...
compile(name: 'react-native-0.14.0', ext: 'aar')
}
使用本地依賴方式,構(gòu)建后react-native-0.14.0.aar不會(huì)自動(dòng)下載RN所依賴的第三方函數(shù)庫,需要我們手動(dòng)配置,這些第三方函數(shù)庫的下載方式可依法炮制。
那么如何查看react-native-0.14.0.aar依賴的第三方函數(shù)庫呢?這個(gè)可以通過閱讀RN的源碼,打開源碼路徑下面的ReactAndroid/src/build.gradle文件查看其dependencies,如下所示:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.facebook.fresco:fresco:0.8.1'
compile 'com.facebook.fresco:imagepipeline-okhttp:0.8.1'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.3'
compile 'com.google.code.findbugs:jsr305:3.0.0'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.okhttp:okhttp-ws:2.5.0'
compile 'com.squareup.okio:okio:1.6.0'
compile 'org.webkit:android-jsc:r174650'
}
當(dāng)然,完整的依賴項(xiàng)還不止這些,因?yàn)檫@些依賴可能還級(jí)連依賴其他的函數(shù)庫,我們可以通過反編譯AwesomeProject(通過react-native init AwesomeProject命令生成的)生成的apk,或者在Android Studio中查看AwesomeProject的External Libraries,會(huì)發(fā)現(xiàn)事實(shí)上最終打進(jìn)apk包的函數(shù)包如下所示:

因此,最終我們的RN本地依賴完整函數(shù)包如下所示:

對(duì)于.jar包,我們只需要將其拷貝到app/libs目錄中,并在app/build.gradle文件中如下設(shè)置即可正常引用:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
}
對(duì)于.aar包,傳統(tǒng)的做法也是將其拷貝到app/libs目錄中,然后在app/build.gradle目錄中設(shè)置如下:
android {
...
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
...
compile(name: 'react-native-0.14.0', ext: 'aar')
}
但發(fā)現(xiàn)在最新到Android Studio中這樣設(shè)置之后還是提示找不到react-native-0.14.0包,推測(cè)可能是不支持這種老的方式了,那么該如何引入本地.aar依賴呢?目前可行的方式是基于.aar文件新建一個(gè)module,并選擇導(dǎo)入.JAR/.AAR包,如下圖所示:

這種方式每個(gè).aar文件占用一個(gè)module,視覺上比較丑陋。所有的.aar文件都新建成module之后,設(shè)置app module依賴所有這些基于.aar的module即可。最終工程看起來是這樣的:

相關(guān)工程已上傳到我的Github。
將node_modules上傳到svn/git
我們使用react-native init命令得到的RN示例中包含一個(gè)node_modules目錄,這個(gè)目錄是開發(fā)RN必不可少的,如下圖所示,包含了很多內(nèi)容,在網(wǎng)絡(luò)環(huán)境差的時(shí)候很難完整下載下來,因此我們也需要把這個(gè)目錄共享到svn或者git上面,供其他同事使用。

歡迎關(guān)注我的微信公眾號(hào)
