[Mac][React Native][Android] 疑難雜症 各種疑難雜症

  • 391
  • 0
  • 2017-03-03
adb reverse tcp:8081 tcp:8081

記錄了Ryan進行Android Studio +React Native + WebSeorm + 實體機的過程中,踩到的坑,希望客官遇到這些坑,可以順利跳過去

錯誤訊息:Duplicate file ?

好不容易,app寫好了,當然要他打包起來,變成Apk,在終端機模式下

gradlew assembleRelease

但在Build的時候報錯了,這時候需要更完整的資訊,就輸入

gradlew assembleRelease --debug

參數 --debug 可以取得更完整的錯誤資訊
參數 --stacktract 可以取得錯誤的堆疊資訊

紅色圈選處,Duplicate file ?

這到底是啥坑阿??爬了一下Goog 大神,github有解,快點這裡

主要原因是專案在開發過程中,rn的版本有經過升級,留下的餘孽

就直接到 $(rn_project)\android\app\src\main\res\ 下,把drawable-xxxx都砍了吧!

砍掉就可以收工囉~~




錯誤訊息:android.app.Application cannot be cast to com.facebook.react.ReactApplication

在其他開發工具,將React Native的前置作業完成之後,當然要透過Android Studio來編譯,試試看是否順利的Build起來。

出現了

android.app.Application cannot be cast to com.facebook.react.ReactApplication

08-14 07:30:22.631 32594-32594/com.ryanfactory E/AndroidRuntime: FATAL EXCEPTION: 
main Process: com.ryanfactory, PID: 32594
java.lang.RuntimeException: 
Unable to start activity ComponentInfo{com.ryanfactory/com.ryanfactory.MainActivity}: 
java.lang.ClassCastException: android.app.Application cannot be cast to com.facebook.react.ReactApplication
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2499)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2563)
at android.app.ActivityThread.access$800(ActivityThread.java:162)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1438)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:209)
at android.app.ActivityThread.main(ActivityThread.java:5900)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1005)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:800)

主要的原因是在開發的過程中,有將React Native進行升級的作業,不過RN升級不會去異動你的AndroidManfest.xm.

既然都報錯了,就調整吧!!新增『.MainApplication』

新增上去就可以收工囉




錯誤訊息:App doesn't hava the permission to access location

部署到實體設備時,出現


依照Android 官網有提到,在你的APP中,需要存取Geolocation,那就加給他吧

在AndroidManfest.xml加上

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



實體測試機對應之主機網路設定

爬了網路文章,知道RN的技術,是在啟動APP時,先啟動一台虛擬伺服器,讓你的RN的APP可以透過該伺服器,存取APP所需的資源。若在模擬器裡面,因為是『假的』,所以不用去設定主機IP,不過當你將程式部署到實體設備的時候,該需要告訴你的手機,主機的IP在那邊,這樣APP可以透過該設定回你啟動的伺服器來存取資源。

 

若出現無法連到實體設備上是正常的,這邊提供兩個方法

方法一:在實體設備上,把手機抓起來搖一搖,就可以看到開發者選單,點選Dev Setting確認一下你的IP與Port,這就搞定囉

 

方法二:直接在command line 視窗下執行

adb reverse tcp:8081 tcp:8081

透過這個方式,可以把告訴實體設備使用你pc的8081 port


設定實體機來進行開發

有一效能超棒的Mac與手機,我想沒有人不喜歡吧!不過要是設備不優,那還要跑模擬器,我想那種效能真的沒幾個開發者等的下去的。

打一開始就希望收集可以擔任測試的作業,這樣才會快。

所以必須在Android Studio上做點設定。

以實體手機為測試對象

設定為USB Device
請注意,若避免一次插了多支手機的狀況,可以避免掉一些不必要的問題。




啟動伺服器

我們有提過,RN再開發階段,在RUN的時候需要存取一台虛擬伺服器,所以必須將他啟動,在Xcode開啟程式後,進行Debug,程式對自動開啟虛擬伺服器。
但在Android Studio上,沒有特別去設定,伺服器是不會自己啟動的。所以要進行底下作業:

1.進入到你的專案的RN資料夾
2.react-native start

就可以把伺服器跑起來了


關閉與開啟隱藏的檔案

在安裝過程中,需要設定 ANDROID_HOME 所以要把隱藏檔案打開。

顯示隱藏檔案:defaults write com.apple.finder AppleShowAllFiles TRUE;\killall Finder

不顯示隱藏檔案:defaults write com.apple.finder AppleShowAllFiles FALSE;\killall Finder




 

 

以上文章由Ryan整理,若有侵犯版權、勘誤,請來信告知