我如何生成一个可以在不带react-native的服务器的情况下运行的apk?


210

我已经构建了我的应用程序,可以在本地仿真器上运行它,也可以通过更改调试服务器在同一网络中的android设备上运行它。

但是,我想构建一个可以发送给某人的APK,而无需访问开发服务器,我希望他们能够测试应用程序。

我看到文档中有一节在iOS上使用脱机捆绑包。但是我不知道如何为android实现相同的功能。这可能吗?如果是这样,怎么办?

更新:关于这个问题的答案(Android无法加载JS bundle),据说可以从开发服务器下载脱机捆绑包。但是,当我从开发服务器获取捆绑软件时,无法加载图像文件。


Answers:


202

按照Aditya Singh的回答,生成的(未签名)apk将不会安装在我的手机上。我必须按照此处的说明生成签名的apk 。

以下为我工作:

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

my-release-key.keystore文件放在android/app 项目文件夹中的目录下。然后编辑文件 ~/.gradle/gradle.properties并添加以下内容(用正确的密钥库密码,别名和密钥密码替换****)

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

如果您使用的是MacOS,则可以按照此处的说明将密码存储在钥匙串中,而不必以纯文本格式存储。

然后编辑app / build.gradle并确保存在以下内容(可能需要添加具有signingConfigs signingConfig的部分):

...
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
        }
    }
}
...

然后运行命令cd android && ./gradlew assembleRelease

对于 Windows'cd android',然后运行gradlew assembleReleasecommand,然后在下面找到您签名的 apkandroid/app/build/outputs/apk/app-release.apk


10
这是最新,最准确的答案。谢谢。
Gokhan Sari

2
app-release.apk未安装。这是什么问题?
Balasubramanian

1
我创建了apk,上传到Google Play,但是它不起作用...一些提示?
Italo Rodrigo

2
我找不到android / app文件夹,它在哪里?
DHLopez '18

6
谢谢,不是,但是我发现这是因为我正在使用expo进行测试,并且创建本机应用程序npm具有不同的结构,因此,如果有人遇到此问题,请弹出您的项目,然后您会得到供以后参考,以供将来参考这些文件夹,有趣的是,本教程告诉您如何使用npm创建应用程序,然后讨论了使用它时不存在的结构
DHLopez

193

您将必须创建一个密钥来对apk进行签名。使用以下内容创建密钥:

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

出现提示时使用密码

生成密钥后,使用它来生成可安装的内部版本:

 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/

使用gradle生成构建

 cd android && ./gradlew assembleRelease

将APK上传到您的手机。该-r标志将替换现有应用(如果存在)

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

这里提到了更详细的描述:https : //facebook.github.io/react-native/docs/signed-apk-android.html

更新:基于@shashuec和@Fallen的评论

如果您遇到错误

ENOENT:没有此类文件或目录,请打开“ android / app / src / main / assets / index.android.bundle”

运行mkdir android / app / src / main / assets


4
非常感谢,它对我有用。我得到的唯一问题是以下消息:“缺少必需的参数:bundle-output”在react-native-bundle部分,但是通过删除2个“ \”符号来解决
guinunez,2016年

58
我为Facebook糟糕的文档感到惊讶,他们完全省略了该react-native bundle部分。感谢您的回答!
technophyle

2
我正在使用Windows,也可以使用它gradlew.bat assembleRelease
塔巴雷斯

12
我得到这个错误Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 。当我尝试安装apk时。
developernaren

18
如果您ENOENT: no such file or directory, open 'android/app/src/main/assets/index.android.bundle' 运行错误mkdir android/app/src/main/assets
shashuec

31

您应该只使用android studio来完成此过程。这只是更简单。但是首先在您的本机应用程序目录中运行以下命令:

对于较新版本的react-native(例如react native 0.49.0等...)

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

对于旧版本的react-native(0.49.0及以下)

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/

然后使用android studio在您的本机应用程序目录中打开“ android”文件夹,它将要求升级gradle和其他一些东西。转到构建->生成签名的APK并按照那里的说明进行操作。这真的很简单。


我还使用Android Studio和Xcode为我的React Native应用程序构建发行版本...但是,可以使用@Aditya Singh
WiRa


30

运行以下命令:

react-native run-android --variant=release

请注意,--variant=release仅当您使用设置了签名时才可用cd android && ./gradlew assembleRelease


@jasan我在这里发现了另一个类似您的问题:github.com/facebook/react-native/issues/11586 这可能会解决问题:cd android && ./gradlew installRelease
Ahmed Ashraf

我尝试过cd android && ./gradlew installRelease并遇到此错误Task 'assembleRelease.' not found in root project 'project'. Some candidates are: 'assembleRelease'.
ThomasReggi

是的,您必须生成密钥库文件。然后编辑gradle文件。请按照以下说明解决此问题。facebook.github.io/react-native/docs/signed-apk-android.html
艾哈迈德·阿什拉夫

21

适用于React Native 0.49及更高版本

您应该转到终端上的项目目录并运行该命令

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

如果低于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

然后使用android studio在您的本机应用目录中打开“ android”文件夹,它将要求升级gradle和其他一些东西。转到构建->生成签名的APK并按照那里的说明进行操作。没关系。


如果您安装了Android Studio(这将使用或创建密钥库),这是一种简单的方法。谢谢。
leosok '18 -10-31

嘿..有一个快速的问题..是否需要上述步骤?react本地文档在任何地方都没有提及它
。– pravin

1
@pravin不是必需的,它是生成apk的方法之一。
Yasin Ugurlu

12

如果得到Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

我尝试使用@Aditya的方法来生成未签名的APK文件并进行安装,但是当我将其安装到Android平板电脑上时,出现了错误Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

我想这是因为APK文件未签名,平板电脑对此不满意。因此,生成React Native捆绑包文件后,我能够正常通过Android Studio生成一个签名的APK文件。

顺便说一句,我们的应用程序是一个功能齐全的Android应用程序,已经存在于Play商店中,我们只是以小巧的大小在其中添加了React Native,因为它很棒。

总结一下,这是我的步骤:

1)生成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)从Android Studio生成一个Signed APK文件。

3)将签名的APK文件安装到USB设备:

adb -d install -r <path_to_signed_apk> 

如果您还运行了模拟器,则该-d标志仅adb指示安装在连接的USB设备上。如果要安装在任何仿真器上,请删除该-d标志。

4)利润!


11

尝试以下操作,它将在您的root / android / app / build / outputs / apk / debug文件夹中生成一个app-debug.apk

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

然后转到android文件夹并运行

./gradlew assembleDebug


这里产生的APK需要地铁跑......所以我认为这仍然使用开发服务器
nerdlinger

11

如果任何人都想在没有Playstore Key的情况下进行构建,那么此命令将非常有帮助。

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

构建完成后,您可以在发布构建文件中找到apk。



6

如果遇到涉及index.android.js的错误。这是因为您使用的是新的React-native版本(我使用的是0.55.4),只需将“ index.android.js”替换为“ 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/

5

我有另一个解决方案:-生成签名密钥您可以使用keytool生成一个私有签名密钥。在Windows上,必须从C:\ Program Files \ Java \ jdkx.x.x_x \ bin运行keytool。

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

将my-release-key.keystore文件放置在项目文件夹中的android / app目录下。

在您的项目文件夹中编辑文件android / app / build.gradle并添加签名配置,

android {
....
signingConfigs { 
  release { 

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

  } 
}}}


buildTypes {release {signingConfig signingConfigs.release}}

并运行

gradlew assembleRelease

这将在android \ app \ build \ outputs \ apk中为您提供两个文件app-release.apk和app-release-unsigned.apk现在将app-release.apk安装在您的android设备中。


android \ app文件夹在哪里?我没有在我的项目下看到它(我只看到node_modules,并且在它的内部,没有android / app)
DHLopez

1
@DHLopez,您必须使用纯React Native项目才能访问android文件夹。如果您使用的是Expo,则必须使用expo弹出来分离Expo项目。
fxbayuanggara

5

希望它将对新手有所帮助

官方文件在这里

如果您没有密钥库而不是在命令之前使用,则跳过

生成签名密钥/密钥库文件 您可以使用keytool生成私有签名密钥。在Windows上,必须从C:\ Program Files \ Java \ jdkx.x.x_x \ bin运行keytool。

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

您将获得像my-release-key.keystore这样的文件

设置gradle变量 将my-release-key.keystore文件放置在项目文件夹中android / app目录下。编辑文件android / gradle.properties并添加以下内容(用正确的密钥库密码,别名和密钥密码替换*****),enableAapt2 set false是解决方法,因为android gradle 3.0版问题

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

然后添加这些app / buid.gradle(app)

低于默认配置

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
            }
        }

和内部构建类型发布{}

 signingConfig signingConfigs.release

然后只需在android studio终端中运行此命令, 下面的命令将自动执行所有答案

如果窗户

cd android
gradlew assembleRelease

如果是linux / mac

$ cd android
$ ./gradlew assembleRelease

如果遇到任何错误,请删除所有构建文件夹并运行命令

gradlew clean

不止一次

gradlew assembleRelease

1
OMG gradle clean......我一直在为此而努力了一段时间得到这些构建错误,非常感谢你对这个答案!
nerdlinger

5

对于最新的反应本机版本以捆绑项目

安卓系统

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


3

Android Studio中的GUI方式

  • 在Android Studio中打开React Native应用程序的Android应用程序部分(这仅意味着使用Android Studio打开react-native项目的android文件夹)
  • 转到顶部的“构建”标签
  • 转到“构建捆绑包/ APK”
  • 然后选择“构建APK”
  • 这将引导您完成查找密钥以签名APK或创建密钥(如果您还没有密钥)的过程,这非常简单。如果您只是在练习,则可以生成这些密钥并将其保存到桌面。
  • 完成该过程后,如果构建成功,Android Studio下面将弹出一个对话框。点击其中的“定位”链接(APK)
  • 那将带您到apk文件,将其移至您的android设备。然后在Android设备上导航到该文件并安装。


-2

请参阅有关生成签名APK的react-native官方文档

React-Native生成签名APK


即使它确实解决了用户的问题,但不是一个好的答案,这不是一个好答案。他们想构建一个独立的调试APK,而不是发行版。
user37309
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.