Como posso gerar um apk que pode ser executado sem servidor com react-native?

210

Eu construí meu aplicativo, posso executá-lo no meu emulador local (e também no meu dispositivo Android na mesma rede, alterando o servidor de depuração).

No entanto, desejo criar um APK que possa ser enviado a alguém sem acesso ao servidor de desenvolvimento e que ele possa testar o aplicativo.

Vejo que há uma seção Usando o pacote offline na seção iOS da documentação. Mas não consegui descobrir como fazer o mesmo no Android. Isso é possível? Se sim, como?

ATUALIZAÇÃO: Na resposta a esta pergunta (o Android não conseguiu carregar o pacote JS ), diz-se que o pacote offline pode ser baixado do servidor de desenvolvimento. Mas quando obtenho o pacote no servidor de desenvolvimento, os arquivos de imagem não podem ser carregados.

Gokhan Sari
fonte
verificar este exemplo simples para gerar apk file: Reagir Native Gerar lançamento APK através do Windows Command Prompt Android
Sumit Kumar Pradhan

Respostas:

203

Após a resposta de Aditya Singh, o apk gerado (não assinado) não seria instalado no meu telefone. Eu tive que gerar um apk assinado usando as instruções aqui .

O seguinte funcionou para mim:

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Coloque o my-release-key.keystorearquivo no android/app diretório em sua pasta do projeto. Em seguida, edite o arquivo ~/.gradle/gradle.propertiese adicione o seguinte (substitua **** pela senha correta do keystore, alias e senha da chave)

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=****
MYAPP_RELEASE_KEY_PASSWORD=****

Se você estiver usando o MacOS, poderá armazenar sua senha no chaveiro usando as instruções aqui, em vez de armazená-la em texto sem formatação.

Em seguida, edite app / build.gradle e verifique se o seguinte está lá (as seções com signatureConfigs signatureConfig podem precisar ser adicionadas):

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...

Em seguida, executar o comando cd android && ./gradlew assembleRelease,

Para o Windows 'cd android', execute o gradlew assembleReleasecomando e encontre seu apk assinado emandroid/app/build/outputs/apk/app-release.apk

Pedram
fonte
10
Essa é a resposta mais atualizada e precisa. Obrigado.
Gokhan Sari
2
app-release.apk não está instalando. qual seria o problema?
precisa
1
Crio o apk, carrego no google play, mas ele não está funcionando ... alguma dica?
Rodrigo Rodrigo
2
Não consigo encontrar a pasta android / app, onde está localizada?
DHLopez 15/02
6
Obrigado, não foi, mas descobri que estava usando o expo para testes, e o npm de aplicativo nativo de criação tem uma estrutura diferente. Portanto, para referência futura, se alguém tiver esse problema, basta ejetar seu projeto e você obtém essas pastas, engraçado como o tutorial diz para você usar o npm para criar o aplicativo e, em seguida, fala sobre uma estrutura que não existe quando você o usa.
DHLopez
194

Você precisará criar uma chave para assinar o apk. Use abaixo para criar sua chave:

 keytool -genkey -v -keystore my-app-key.keystore -alias my-app-alias -keyalg RSA -keysize 2048 -validity 10000

Use uma senha quando solicitado

Depois que a chave for gerada, use-a para gerar a compilação instalável:

 react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

Gere a construção usando gradle

 cd android && ./gradlew assembleRelease

Faça o upload do APK para o seu telefone. O -rsinalizador substituirá o aplicativo existente (se existir)

adb install -r ./app/build/outputs/apk/app-release-unsigned.apk

Uma descrição mais detalhada é mencionada aqui: https://facebook.github.io/react-native/docs/signed-apk-android.html

ATUALIZAÇÃO : Baseado nos comentários de @shashuec e @Fallen

se você receber um erro

ENOENT: não existe esse arquivo ou diretório, abra 'android / app / src / main / assets / index.android.bundle'

execute mkdir android / app / src / main / assets

Aditya Singh
fonte
4
Muito obrigado por isso, funcionou para mim. O único problema que tivemos foi a mensagem: "Faltando argumentos necessários: bundle-output" en parte nativo-bundle reagir, mas é resolvido, excluindo o 2 "\" símbolos
guinunez
59
Estou impressionado com a pobre documentação do Facebook, onde eles omitiram totalmente a react-native bundleparte. Obrigado pela sua resposta!
technophyle
2
Estou trabalhando com o windows, funciona com isso gradlew.bat assembleReleasetambém.
Tabares
12
Eu recebo esse erro Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] . quando tento instalar o apk.
developernaren
18
se você ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle' executar um erromkdir android/app/src/main/assets
shashuec 22/03
31

Você deve usar o android studio para esse processo. É apenas mais simples. Mas primeiro execute este comando no diretório do aplicativo nativo do react:

Para a versão mais recente do react-native (por exemplo, react native 0.49.0 e assim por diante ...)

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

Para versão mais antiga do react-native (0.49.0 e inferior)

react-native bundle --platform android --dev false --entry-file index.android.js   --bundle-output android/app/src/main/assets/index.android.bundle   --assets-dest android/app/src/main/res/

Em seguida, use o android studio para abrir a pasta 'android' em seu diretório de aplicativos nativo, ele solicitará a atualização do gradle e de outras coisas. vá para build-> Generate APK assinado e siga as instruções de lá. É realmente simples.

Mike Axle
fonte
Eu também uso Studio e Xcode Android para versões de lançamento de compilação para o meu Reagir aplicativos nativos ... mas a geração android poderia ser feito com um script como descrito por @Aditya Singh
Wira
Isso não é mais necessário proandroiddev.com/…
onmyway133
30

Execute este comando:

react-native run-android --variant=release

Observe que --variant=releasesó está disponível se você configurou a assinatura com cd android && ./gradlew assembleRelease.

Ahmed Ashraf
fonte
@jasan eu encontrei um outro problema como a sua aqui: github.com/facebook/react-native/issues/11586 Isto pode corrigir o problema: cd android && ./gradlew installRelease
Ahmed Ashraf
Eu tentei cd android && ./gradlew installReleasee tenho esse erroTask 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'.
ThomasReggi
Sim, você precisa gerar o arquivo Keystore. e edite o arquivo gradle. Siga estas instruções para corrigir esse problema. facebook.github.io/react-native/docs/signed-apk-android.html
Ahmed Ashraf
21

para React Native 0.49 e superior

você deve ir para o diretório do projeto no terminal e executar esse comando

1 - mkdir android/app/src/main/assets
2 - react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

se abaixo de 0,49

  1 - mkdir android/app/src/main/assets
  2 - react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

Em seguida, use o android studio para abrir a pasta 'android' em seu diretório de aplicativos nativo, ele solicitará a atualização do gradle e de outras coisas. vá para build-> Generate APK assinado e siga as instruções de lá. Aquele idiota.

Yasin Ugurlu
fonte
Essa é uma maneira fácil de fazer isso se você tiver o Android Studio instalado (que cuidará do uso ou da criação do Keystore). Obrigado.
leosok
Ei ... faça uma pergunta rápida .. são necessárias as etapas acima? O reagir doc nativa não mencioná-lo em qualquer lugar ..
Pravin
1
@pravin não é necessário, é um dos métodos do apk de geração.
Yasin Ugurlu
12

Se você conseguir Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES].

Tentei usar o método do @ Aditya de gerar um arquivo APK não assinado e instalá-lo, mas quando fui instalá-lo no meu tablet Android, ocorreu um erro de Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] .

Imagino que isso ocorra porque o arquivo APK não foi assinado e o tablet não ficou satisfeito com isso. Portanto, depois de gerar o arquivo do pacote React Native, consegui gerar um arquivo APK assinado, normalmente, via Android Studio.

A propósito, nosso aplicativo é um aplicativo Android totalmente funcional que já existe na Play Store e estamos adicionando o React Native a ele em pedaços pequenos, porque é incrível.

Então, para resumir, aqui estão meus passos:

1) Gere o pacote React Native:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/<your-package-name>/src/main/assets/index.android.bu‌​ndle --assets-dest android/<your-package-name>/src/main/res/ 

2) Gere um arquivo APK assinado do Android Studio.

3) Instale o arquivo APK assinado no dispositivo USB:

adb -d install -r <path_to_signed_apk> 

A -dbandeira diz apenas adbpara instalar no dispositivo USB conectado, caso você também tenha um emulador em execução. Se você deseja instalar em qualquer emulador, solte a -dbandeira.

4) Lucro!

Joshua Pinter
fonte
11

Experimente abaixo, ele irá gerar um app-debug.apk na sua pasta root / android / app / build / outputs / apk / debug

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

então vá para a pasta android e execute

./gradlew assembleDebug

Mano
fonte
O APK gerado aqui precisa do Metro para rodar ... então acho que ainda está usando o servidor de desenvolvimento
nerdlinger
11

Se alguém quiser construir sem as chaves do playstore, esse comando será muito útil.

# react-native run-android --variant=release

Após a compilação concluída, você pode encontrar o apk no arquivo de compilação da versão.

Akash Golui
fonte
7

Vá para o diretório do projeto e execute o comando:

cd android && ./gradlew assembleRelease
Sidharth Taneja
fonte
Isso gerará um apk não assinado se você não fez a configuração necessária (como Pedram disse).
Gokhan Sari 23/10
Ele criará depuração, liberação e apk não assinado na pasta gerada. Minha intenção era compartilhar o apk de lançamento.
Sidharth Taneja
6

Se você receber um erro envolvendo o index.android.js. Isso ocorre porque você está usando a nova versão nativa do React (estou usando 0.55.4). Apenas substitua "index.android.js" por "index.js"

react-native bundle --platform android --dev false --entry-file index.js   --bundle-output android/app/src/main/assets/index.android.bundle   --assets-dest android/app/src/main/res/
Usman Kazmi
fonte
5

Tenho outra solução: - Gerando uma chave de assinatura Você pode gerar uma chave de assinatura privada usando o keytool. No Windows, a ferramenta de chaves deve ser executada em C: \ Arquivos de Programas \ Java \ jdkx.x.x_x \ bin.

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

Coloque o arquivo my-release-key.keystore no diretório android / app na sua pasta do projeto.

Edite o arquivo android / app / build.gradle na pasta do seu projeto e adicione a configuração de assinatura,

android {
....
signingConfigs { 
  release { 

      storeFile file('my-release-key.keystore') 
      storePassword 'yourpassword' 
      keyAlias 'my-key-alias' 
      keyPassword 'yourpassword' 

  } 
}}}


buildTypes {release {signingConfig signingConfigs.release}}

e corra

gradlew assembleRelease

Isso fornecerá dois arquivos em android \ app \ build \ outputs \ apk app-release.apk e app-release-unsigned.apk agora instale o app-release.apk no seu dispositivo Android.

Raman Bhasker
fonte
Onde está a pasta android \ app? Eu não vê-lo debaixo do meu projeto (eu só vejo node_modules, e dentro dele, não há / app android)
DHLopez
1
@DHLopez, você precisa usar o projeto React Native puro para ter acesso à pasta android. Se você estiver usando o Expo, precisará desanexar o projeto Expo usando o epo expo.
Fxbayuanggara
5

Espero que ajude novos iniciantes

Doc oficial aqui

Se você não possui o armazenamento de chaves, use o comando before

Gerando uma chave de assinatura / arquivo Keystore Você pode gerar uma chave de assinatura privada usando o keytool. No Windows, a ferramenta de chaves deve ser executada em C: \ Arquivos de Programas \ Java \ jdkx.x.x_x \ bin.

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

você receberá um arquivo como my-release-key.keystore

Configurando variáveis ​​gradle Coloque o arquivo my-release-key.keystore no diretório android / app na sua pasta do projeto. Editar o arquivo android / gradle.properties e adicione o seguinte (substitua ***** com a senha correta de armazenamento de chaves, alias e senha de chave), enableAapt2 set falso é solução alternativa, como a versão Gradle android 3.0 problema

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

android.enableAapt2=false

adicione estes app / buid.gradle (app)

abaixo da configuração padrão

signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }

e versão do tipo Build interno {}

 signingConfig signingConfigs.release

simplesmente execute este comando no terminal do android studio comandos abaixo serão automatizados acima de todas as respostas

se janelas

cd android
gradlew assembleRelease

se linux / mac

$ cd android
$ ./gradlew assembleRelease

se você tiver algum erro, exclua todas as pastas de compilação e execute o comando

gradlew clean

que de novo

gradlew assembleRelease
Abhishek Garg
fonte
1
omg gradle clean... Estou lutando com isso há um tempo para obter esses erros de compilação, muito obrigado por esta resposta!
nerdlinger
5

Para obter as versões nativas de reação mais recentes para agrupar o projeto

Android

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

iOS

react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ios/main.jsbundle --assets-dest ios

Phani Sai
fonte
3

A maneira da GUI no Android Studio

  • Faça com que o aplicativo Android faça parte do aplicativo React Native aberto no Android Studio (isso significa apenas abrir a pasta android do seu projeto react-native com o Android Studio)
  • Vá para a guia "Build" na parte superior
  • Vá para "Criar bundles / APK (s)"
  • Em seguida, selecione "Criar APK (s)"
  • Isso guiará você pelo processo de localizar suas chaves para assinar o APK ou criar suas chaves, se você ainda não as possui, o que é muito simples. Se você está praticando, pode gerar essas chaves e salvá-las na área de trabalho.
  • Quando esse processo estiver concluído e se a compilação tiver sido bem-sucedida, haverá um pop-up abaixo no Android Studio. Clique no link dentro dele que diz "localizar" (o APK)
  • Isso o levará ao arquivo apk, mova-o para o seu dispositivo Android. Em seguida, navegue até esse arquivo no dispositivo Android e instale-o.
David Hudman
fonte
0

Usar o android studio para gerar apk assinado para o projeto android da react também é uma opção boa e fácil, abrir o projeto android da react no android studio e gerar pressionamento de tecla e apk assinado.

Ahmad Sadiq
fonte
-2

Consulte a documentação oficial nativa de reação em Generating Signed APK

Gerar assinatura nativa de reação APK

Codemaker
fonte
Esta não é uma boa resposta, mesmo que tenha respondido à pergunta do usuário e não respondida. Eles querem criar um APK de depuração independente, não um de lançamento.
user37309 20/04