React Native не может найти сервер разработки, интегрируя существующее приложение для Android

Я пытаюсь интегрировать существующее приложение для Android с React Native, следуя руководство. Он компилируется и запускается, но когда я запускаю активность React, происходит сбой:

Причина: java.lang.RuntimeException: не удалось подключиться к серверу разработки.

Я пробовал как в эмуляторе (genymotion), так и на устройстве, подключенном к USB. Я запустил adb reverse tcp:8081 tcp:8081 и проверил с помощью adb reverse --list, а также подтвердил, что могу получить доступ к http://localhost:8081/index.android.bundle из браузера на устройстве, а также с моего ноутбука (поэтому сервер пакетов работает нормально, через npm start).

Примечательно, что я могу нормально запустить учебный пример, поэтому, похоже, что-то вроде запуска RN из моего существующего приложения для Android.

Я на реактивной версии 0.27.2.

идеи?

Обновление: я добавил код для получения пакета непосредственно из одного из моих действий:

public void pingReactServer() {
    Request request = new Request.Builder()
            .url("http://10.0.3.2:8081/index.android.bundle")
            .build();
    OkHttpClient client = OkHttpClientProvider.getOkHttpClient();
    client.newCall(request).enqueue(
            new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.v(TAG, "React ping failed: " + call);
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.v(TAG, "React ping response: " + response.body().string());
                }
            }
    );
}

Это отлично работает, я возвращаю содержимое пакета. Таким образом, http-клиент React может видеть сервер упаковщика, и что-то еще должно вызывать ошибку при извлечении пакета обычным способом (DevServerHelper).


person Adam Berenzweig    schedule 21.06.2016    source источник


Ответы (1)


Разобрался, это была череда досадных событий:

Пример кода в руководстве показывает это:

mReactInstanceManager = ReactInstanceManager.builder()
    ...
    .setUseDeveloperSupport(BuildConfig.DEBUG)

но BuildConfig.DEBUG на самом деле определяется как false, поэтому это отключает поддержку разработчиков (вместо этого он ожидает найти пакет js в качестве актива).

После того, как я это исправил, я столкнулся с другой проблемой, связанной с Proguard; он удалил все классы поддержки разработчиков, поэтому мне нужно было внести их в белый список в моей конфигурации proguard, используя:

# Keep developer support classes.
-keep class com.facebook.react.devsupport.** { *; }

Теперь я добрался до загрузки ReactInstanceManager и получения пакета с сервера разработки, но столкнулся с еще одним скачком скорости:

Ошибка: Требуется неизвестный модуль «реагировать». Если вы уверены, что модуль есть, попробуйте перезапустить упаковщик или запустить «npm install».

Не уверен, почему npm install не загружал это автоматически, но запуск этого вручную исправил:

npm install [email protected]

(используйте конкретную версию, указанную в node_modules/react-native/package.json.)

person Adam Berenzweig    schedule 22.06.2016