Android không tải được gói JS


201

Tôi đang cố chạy AwesomeProject trên Nexus5 (android 5.1.1).

Tôi có thể xây dựng dự án và cài đặt nó trên thiết bị. Nhưng khi tôi chạy nó, tôi thấy một màn hình màu đỏ nói

Không thể tải xuống gói JS. Bạn đã quên khởi động máy chủ phát triển hoặc kết nối thiết bị của mình?

Trong phản ứng iOS gốc, tôi có thể chọn tải jsbundle ngoại tuyến. Làm thế nào tôi có thể làm điều tương tự cho Android? (Hoặc ít nhất, tôi có thể định cấu hình địa chỉ máy chủ ở đâu?)

Cập nhật

Để chạy với máy chủ cục bộ, hãy chạy các lệnh sau trong thư mục gốc của dự án gốc

  1. react-native start > /dev/null 2>&1 &
  2. adb reverse tcp:8081 tcp:8081

vui lòng xem câu trả lời của DSissitka để biết thêm chi tiết.

Để chạy mà không cần máy chủ, hãy đóng gói jsfile vào apk bằng cách chạy:

  1. tạo một thư mục tài sản dưới android/app/src/main
  2. curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

vui lòng xem câu trả lời của kzzzf để biết thêm chi tiết.


Stll chưa tìm ra vấn đề nào. Nhưng trong khi đó, bạn có thể thử nó trên trình giả lập của mình. Nó hoạt động hoàn toàn tốt trên genymotion của tôi.
Bryan

Khi tôi cố gắng gõ hai lệnh để chạy với máy chủ cục bộ, tôi gặp lỗi trong powershell với nội dung: "Ký tự dấu và (&) không được phép". Tôi giả sử tôi nên ở trong thư mục gốc của ứng dụng khi chạy lệnh?
dùng2236165

1
Điều này có nghĩa là không thể gỡ lỗi qua USB trên Android 4.1 vì adb reversekhông được hỗ trợ?
bonh

Tôi muốn đề cập rằng để có thể thực thi, adb reverse tcp:8081 tcp:8081bạn cần phiên bản ADB 1.0.32, reversetùy chọn không có trong 1.0.31
jvalen

Câu trả lời:


110

Để gói tệp JS vào apk của bạn trong khi máy chủ của bạn đang chạy ( react-native start) tải xuống gói vào thư mục tài sản của ứng dụng của bạn:

curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"

Với phiên bản tiếp theo (0.12), chúng tôi sẽ sửa react-native bundlelệnh để làm việc với các dự án Android như mong đợi.


cảm ơn bạn! Làm cách nào để tôi bảo ReacInstanceManager sử dụng tài sản đi kèm? Hay phép màu chỉ tự động xảy ra?
Matthew

9
Không thể tạo tệp Cảnh báo: android / app / src / main / nội dung / index.android.bundle: Không có tệp nào như vậy hoặc Cảnh báo: thư mục
almeynman

2
Cảnh báo: Không thể tạo tệp Cảnh báo: android / app / src / main / nội dung / index.android.bundle: Không có tệp nào như vậy hoặc Cảnh báo: thư mục curl: (23) Thân viết không thành công (0! = 16167)
Shivang

3
@Shivang: Tạo tài sản thư mục trong android / app / src / main. Tôi đã có lỗi này vì nó chưa tồn tại.
piscator

1
Đây là cách tốt nhất và đơn giản khi chúng tôi phân phối ứng dụng cục bộ cho mục đích thử nghiệm. (qua vải) cảm ơn
Dinesh Anuruddha

90

Sau đây làm cho nó hoạt động với tôi trên Ubuntu 14.04:

cd (App Dir)
react-native start > /dev/null 2>&1 &
adb reverse tcp:8081 tcp:8081

Cập nhật : Xem

Cập nhật 2 : @scgough Chúng tôi đã gặp lỗi này vì React Native (RN) không thể tìm nạp JavaScript từ máy chủ dev chạy trên máy trạm của chúng tôi. Bạn có thể thấy tại sao điều này xảy ra ở đây:

https://github.com/facebook/react-native/blob/42eb5464fd8a65ed84b799de5d4dc225349449be/ReactAndroid/src/main/java/com/facebook/react/dev/

Nếu ứng dụng RN của bạn phát hiện ra rằng bạn đang sử dụng Genymotion hoặc trình giả lập, nó sẽ cố gắng tìm nạp JavaScript từ GENYMOTION_LOCALHOST (10.0.3.2) hoặc EMULATOR_LOCALHOST (10.0.2.2). Mặt khác, nó giả định rằng bạn đang sử dụng một thiết bị và nó cố gắng tìm nạp JavaScript từ DEVICE_LOCALHOST (localhost). Vấn đề là máy chủ dev chạy trên localhost của máy trạm của bạn chứ không phải của thiết bị, vì vậy để làm cho nó hoạt động, bạn cần phải:


5
chạy adb đảo ngược tcp: 8081 tcp: 8081 trên osx cũng hoạt động
shyamal

Nó hoạt động! cảm ơn rất nhiều. Bạn có biết liệu có cách nào để trỏ jscodelocation vào tài nguyên apk, giống như main.jsbundle của iOS không?
Matthew

@dsissitka tôi chỉ có thể hỏi để nó được ghi lại ở đây trong chuỗi - điều đó làm gì chính xác?
scgough

@Matthew Sợ không. Lấy làm tiếc!
DSissitka

Điều gì xảy ra nếu chúng tôi đang chạy trên Android 4.2 và gặp phải lỗi này: stackoverflow.com/questions/31525431/iêu
Augustin Riedinger

39

Ok, tôi nghĩ rằng tôi đã tìm ra vấn đề ở đây. Đó là để làm với phiên bản củawatchman tôi đang chạy.

Trong một vỏ mới, chạy brew update sau đó: brew unlink watchman sau đó:brew install watchman

bây giờ, bạn có thể chạy react-native start từ thư mục dự án của bạn

Tôi để cái vỏ này mở ra, tạo một cửa sổ shell mới và chạy: react-native run-android từ thư mục dự án của tôi. Tất cả là đúng với thế giới.

ps. Tôi ban đầu trên phiên bản 3.2 của watchman. Điều này nâng cấp tôi lên 3.7.

pps. Tôi chưa quen với điều này vì vậy có thể không phải là con đường nhanh nhất cho giải pháp nhưng nó đã có hiệu quả với tôi.

* THÔNG TIN THÊM CHO RUNNING / DEBUGGING TRÊN THIẾT BỊ *

Bạn có thể thấy rằng nếu bạn triển khai ứng dụng của mình lên thiết bị Android chứ không phải là trình giả lập, bạn sẽ nhận được màn hình màu đỏ với lỗi báo lỗi Unable to load JS Bundle. Bạn cần đặt máy chủ gỡ lỗi cho thiết bị của mình để máy tính của bạn chạy phản ứng ... tên của nó HOẶC địa chỉ IP.

  1. Nhấn Menunút thiết bị
  2. Lựa chọn Dev Settings
  3. Chọn Debug server host for devicehoặcChange Bundle Location
  4. Nhập IP của máy và Tải lại JS cùng với cổng phản ứng, vd 192.168.1.10:8081

Thông tin thêm: http://facebook.github.io/react-native/docs/rasty-on-device-android.html


@ jacobross85 Vui mừng vì nó đã giúp! Hãy cho tôi một upvote nếu bạn cảm thấy thích nó ;-)
scgough

1
Phải chạy brew uninstall watchmantrước khi nó cài đặt phiên bản mới nhất cho tôi.
Amozoss

Tôi đã thêm một chút thông tin cho những người gỡ lỗi cho thiết bị Android thay vì trình giả lập.
scgough

Đã chạy phiên bản mới nhất của watchman nhưng điều này đã sửa nó cho tôi. Cuối tuần
pfac

1
Cảm ơn vì người anh em này thật sự hữu ích. Đó là lý do tại sao tôi sẽ cung cấp cho bạn upvote.
Priyank Jotangiya

17

Từ thư mục dự án của bạn, chạy

react-native start

Nó xuất ra như sau:

$ react-native start
 ┌────────────────────────────────────────────────────────────────────────────┐ 
   Running packager on port 8081.                                             
                                                                              
   Keep this packager running while developing on any JS projects. Feel       
   free to close this tab and run your own packager instance if you           
   prefer.                                                                    
                                                                              
   https://github.com/facebook/react-native                                  │ 
                                                                              
 └────────────────────────────────────────────────────────────────────────────┘ 
Looking for JS files in
   /home/user/AwesomeProject 


React packager ready.

[11:30:10 PM] <START> Building Dependency Graph
[11:30:10 PM] <START> Crawling File System
[11:30:16 PM] <END>   Crawling File System (5869ms)
[11:30:16 PM] <START> Building in-memory fs for JavaScript
[11:30:17 PM] <END>   Building in-memory fs for JavaScript (852ms)
[11:30:17 PM] <START> Building in-memory fs for Assets
[11:30:17 PM] <END>   Building in-memory fs for Assets (838ms)
[11:30:17 PM] <START> Building Haste Map
[11:30:18 PM] <START> Building (deprecated) Asset Map
[11:30:18 PM] <END>   Building (deprecated) Asset Map (220ms)
[11:30:18 PM] <END>   Building Haste Map (759ms)
[11:30:18 PM] <END>   Building Dependency Graph (8319ms)

1
Tôi cũng gặp vấn đề mà OP đã báo cáo. Tôi chạy dự án bằng cách sử dụng react-native run-androidtừ thư mục dự án. Nó xây dựng OK trong thiết bị đầu cuối nhưng ngay khi ứng dụng mở trên thiết bị của tôi, tôi nhận được màn hình màu đỏ nóiUnable to download JS bundle
scgough

6
bạn cần chạy adb đảo ngược tcp: 8081 tcp: 8081
Matthew

1
Tôi đã chạy adb đảo ngược tcp: 8081 tcp: 8081 và tôi gặp lỗi: lỗi đóng: đã đóng
JacobRossDev

1
Tôi có cùng một vấn đề, lỗi: đã đóng. Bất kỳ giúp đỡ, xin vui lòng?
Eusthace

Đảm bảo địa chỉ IP của bạn là chính xác trong "Cài đặt dev" nếu bạn đang ở trên Android. Nếu bạn đang làm việc với một IP động, điều này có thể thay đổi qua đêm.
Sam Purcell

13

Một giải pháp dễ dàng phù hợp với tôi với Ubuntu 14.04.

react-native run-android

Trình giả lập (đã được khởi chạy) sẽ trở lại: Không thể tải xuống Gói Bundle; bắt đầu lại máy chủ JS:

react-native start

Nhấn Tải lại JS trên trình giả lập. Nó làm việc cho tôi. Hy vọng nó sẽ giúp


Thực tế hoạt động. Trong số tất cả các câu trả lời, đây là giải pháp đơn giản nhất. Không thể tin rằng điều này không có trong tài liệu chính thức.
bluecollarcoder

OP là về chạy trên một thiết bị, không phải trình giả lập. Các bước này không hoạt động trên thiết bị mà không cần thiết lập bổ sung. Xem câu trả lời được chấp nhận.
davidgoli

8

Trong ứng dụng trên Android, tôi đã mở Menu (Command + M trong Genymotion) -> Dev Settings -> Gỡ lỗi máy chủ & cổng máy chủ cho thiết bị

đặt giá trị thành: localhost: 8081

Nó làm việc cho tôi.


Cảm ơn! Làm việc cho tôi
Howard

7

Sau khi thử kết hợp các câu trả lời ở đây, đây là những gì đang làm việc cho tôi.

Tôi đang sử dụng Genymotion làm trình giả lập.

1 Khởi động trình giả lập Genymotion.

2 Từ một thiết bị đầu cuối

cd AwesomeProject
react-native run-android # it loads in genymotion and fails with bundle error
react-native start > /dev/null 2>&1 & # from dsissitka
adb reverse tcp:8081 tcp:8081 # from dsissitka

3 Tải lại từ trình giả lập.

Nó tải!

Bây giờ tôi có thể bắt đầu phát triển.


nhận được "lỗi: đóng" hai lần vào "adb đảo ngược"
almeynman

FYI: Tôi hiện đang làm như trên với câu trả lời "Daniel Masarin" về việc đặt máy chủ gỡ lỗi thành địa chỉ WiFi của tôi với cổng 8081, nó đang hoạt động với RN v 0.17.0
ooolala

cảm ơn bạn rất nhiều điều này hoạt động với tôi :) trên API 21+ ở trên chỉ hoạt động này
Ashwini Bhat

4

Xóa ứng dụng khỏi điện thoại của bạn! Tôi đã thử một vài bước, nhưng cuối cùng đã làm được.

  1. Nếu bạn đã cố chạy ứng dụng của mình trước đó nhưng không thành công, hãy xóa nó khỏi thiết bị Android của bạn.
  2. Chạy $ react-native run-android
  3. Mở Menu React Rage Shake từ trong ứng dụng của bạn trên thiết bị Android, đi tới Dev Settingsvà sau đó đến Debug server host & port for device. Ở đó nhập IP máy chủ của bạn (IP của máy tính của bạn) và máy chủ 8081, ví dụ 192.168.50.35:8081. Trên máy mac, bạn có thể tìm thấy IP của máy tính của mình tại System Preferences -> Network -> Advanced... -> TCP/IP -> IPv4 Address.
  4. Mở Menu Rage Shake một lần nữa và nhấp Reload JS.


2

Tôi không có đủ danh tiếng để bình luận, nhưng điều này đề cập đến câu trả lời của DSissitka. Nó cũng hoạt động trên Windows 10.

Để nhắc lại, các lệnh là:

cd (App Dir)
react-native start > /dev/null 2>&1 &
adb reverse tcp:8081 tcp:8081

2

Dưới đây là các bước đơn giản để chạy ứng dụng của bạn trên Android (phát hành):

1. Đi đến ứng dụng gốc của bạn.

2. Chạy lệnh này.

gói phản ứng gốc - nền tảng android --dev false --entry-file index.android.js --bundle-output android / app / src / main / property / index.android.bundle --assets-Dest android / app / src / chính / res

Tất cả các tập tin của bạn được sao chép.

3. Tạo APK đã ký.

Mở studio android.

Xây dựng> Tạo APK đã ký> [Điền chi tiết cần thiết, tổ hợp phím phải được tạo trước bước này]

APK của bạn phải được tạo mà không có bất kỳ lỗi nào. Cài đặt trên thiết bị của bạn và điều này sẽ hoạt động mà không có bất kỳ vấn đề.

Bạn cũng có thể kết nối thiết bị của mình và nhấn trực tiếp biểu tượng Run trên studio android để thử nghiệm.


Tạo tổ hợp phím:

  1. Goto C: \ Tệp chương trình \ Java \ jdkx.x.x_x \ bin

  2. Chạy

keytool -genkey -v -keystore d: \ my_private_key.keystore -alias my-key-alias -keyache RSA -keyize 2048 -valid 10000

Nó có thể sẽ yêu cầu bạn điền vào một số chi tiết. Làm điều đó và bạn có tệp tổ hợp phím của bạn ( my_private_key.keystore ) có thể được sử dụng để ký apk của bạn.


sau khi react-native bundletôi gặp Lỗi: Tài nguyên trùng lặp
Amir Shabani

1

Tôi đã nhận được điều này trên Linux sau khi ngừng react-native run-android quá trình. Có vẻ như máy chủ nút vẫn đang chạy nên lần sau khi bạn chạy nó, nó sẽ không chạy đúng và ứng dụng của bạn không thể kết nối.

Cách khắc phục ở đây là để giết tiến trình nút đang chạy trong Xterm mà bạn có thể giết bằng ctrl-ccách sử dụng cửa sổ đó (dễ dàng hơn) hoặc bạn có thể tìm thấy nó bằng cách sử dụng lsof -n -i4TCP:8081sau đókill -9 PID .

Sau đó chạy react-native run-androidlại.


1

Kiểm tra kết nối wifi của bạn.

Một khả năng khác có thể là bạn không được kết nối với wifi, kết nối với mạng sai hoặc địa chỉ IP bị sai trong cài đặt dev của bạn. Vì một số lý do, android của tôi bị ngắt kết nối với wifi và tôi vô tình bắt đầu gặp lỗi này.


Cảm ơn, đó là nó. Theo mặc định, máy chủ Debug được truy cập trên mạng cục bộ. Do đó, nếu bạn không có quyền truy cập wifi, bạn không thể truy cập nó.
Paul

1

Chạy trên thiết bị

Tôi đã tìm thấy một câu trả lời khác.

  • adb đảo ngược: chỉ hoạt động trên Android 5.0+ (API 21).
  • Cách khác: Mở menu Nhà phát triển bằng cách lắc thiết bị, đi đến Cài đặt Dev , Chuyển đến máy chủ gỡ lỗi cho thiết bị , nhập địa chỉ IP của máy của bạn và cổng của máy chủ dev cục bộ

1

Một bản cập nhật

Bây giờ trên windows không cần phải khởi động Reac -igen. Trình đóng gói sẽ tự động chạy.



0

Tôi chỉ sử dụng Ubuntu và Android và tôi không thể chạy nó. Tôi đã tìm thấy một giải pháp thực sự đơn giản đó là cập nhật tệp pack.json, thay đổi dòng này:

"scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },

đến

"scripts": {
    "start": "adb reverse tcp:8081 tcp:8081 && node node_modules/react-native/local-cli/cli.js start"
  },

Và sau đó bạn chạy máy chủ bằng cách gõ

npm run start

Điều này đảm bảo thiết bị Android tìm kiếm máy chủ nút trên máy tính của bạn thay vì cục bộ trên điện thoại.


0

Câu hỏi ban đầu là về việc tải lại ứng dụng trong một thiết bị phyisical.

Khi bạn gỡ lỗi ứng dụng trong một thiết bị vật lý (tức là qua adb), bạn có thể tải lại gói JS bằng cách nhấp vào nút "hành động" trên cùng bên trái của thiết bị. Điều này sẽ mở menu tùy chọn (Tải lại, gỡ lỗi JS từ xa ...).

Hi vọng điêu nay co ich.


0

Lỗi này có thể dễ dàng giải quyết bằng các bước sau:

    //run the command at /android sdk / platforms-tool folder
        adb reverse tcp:8081 tcp:8081

    //now come to root folder of your app
    1. npm start
    2. create 'assets' folder inside rootApp/android/app/src/main/
    3. curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
    4. make sure anyone physical or virtual device attached is running.
    5. react-native run-android

1
Tôi có thể chạy adb reverse tcp:8081 tcp:8081trong thư mục gốc của ứng dụng không?
Marson Mao

tìm thư mục adb trong hệ điều hành của bạn. trong SDK Android / công cụ nền tảng /
Atif Hussain

1
nhưng tôi thấy nhiều nơi đề cập rằng lệnh này có thể được chạy trong thư mục gốc của ứng dụng, cũng là câu trả lời của dsissitka cho thấy rằng chạy nó trong thư mục ứng dụng gốc, vì vậy tôi thực sự bối rối.
Marson Mao

có thể lệnh này được xử lý bằng phản ứng gốc. tôi không chắc về điều này. nhưng adb được hỗ trợ bởi các công cụ sdk Android. bạn có thể tìm thêm chi tiết tại đây facebook.github.io/react-native/docs/
Kẻ

1
@MarsonMao Tùy thuộc vào thiết lập hệ thống của bạn, bạn có thể chạy adb từ thư mục ứng dụng của mình. Đọc về biến PATH và gói toàn cầu so với gói địa phương để biết thêm thông tin.
m Vendleraz

0

Bạn có thể làm theo hướng dẫn được đề cập trên trang chính thức để khắc phục vấn đề này. Sự cố này xảy ra trên thiết bị thực do gói JS nằm trên hệ thống phát triển của bạn và ứng dụng bên trong thiết bị thực của bạn không biết vị trí của nó.


0

Trong cấu hình gỡ lỗi React Native (chắc chắn 0,59) nằm bên trong android/app/src/debug/res/xml/react_native_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

0

Bắt đầu hai thiết bị đầu cuối trên cùng một thiết bị đầu cuối và thiết bị đầu cuối chạy phản ứng gốc khởi động và thiết bị đầu cuối thứ hai phản ứng chạy gốc android, vấn đề này được giải quyết theo cách đơn giản. Và may mắn nhất


0

Này, tôi đã phải đối mặt với vấn đề này với dự án trần phản ứng của mình, trình giả lập IOS hoạt động tốt nhưng Android vẫn gây ra lỗi này. đây là một giải pháp khả thi cho tôi

Bước 1, kiểm tra xem thiết bị adb có được phép hay không bằng cách chạy trong thiết bị đầu cuối của bạn: thiết bị adb

nếu nó là trái phép chạy các lệnh sau

bước 2, sudo adb kill-server bước 3, sudo adb start-server

sau đó kiểm tra xem lệnh thiết bị adb có hiển thị danh sách các thiết bị được gắn trình giả lập-thiết bị 5554 không

thay vì trái phép nếu đó là thiết bị thay vì trái phép

Bước 4, chạy npx Reac -igen run-android

điều này đã làm việc trong ví dụ của tôi, tôi hy vọng điều này sẽ giải quyết vấn đề của bạn.


0

Tôi thấy điều này là kỳ lạ nhưng tôi đã có một giải pháp. Tôi nhận thấy rằng thỉnh thoảng thư mục dự án của tôi chỉ đọc và tôi không thể lưu nó từ VS. Vì vậy, tôi đã đọc một đề xuất để chuyển NPM từ PATH của người dùng cục bộ sang biến toàn cục PATH trên toàn hệ thống và nó hoạt động như một cơ duyên.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.