在没有开发服务器的设备上构建和安装未签名的 apk?

Posted

技术标签:

【中文标题】在没有开发服务器的设备上构建和安装未签名的 apk?【英文标题】:Build and Install unsigned apk on device without the development server? 【发布时间】:2016-05-18 23:03:19 【问题描述】:

由于我是 react-native 的新手,所以如果步骤有任何问题,请告诉我。

我已经按照文档使用命令构建了一个 react native android 应用程序

反应原生安卓

在设备上运行时使用了以下命令

react-native run-android

这给了我 projectfolder/android/app/build/outputs/apk

中 2 个 apk 文件的输出

现在,当我在安装后安装此 apk 时,它会要求开发服务器连接以捆绑 JS。但我的要求是用户不必为开发服务器而苦恼,只需要安装 apk 就可以了。

经历了一些*** Questions,但对构建不需要开发服务器的未签名apk没有帮助。

你们能帮我找到如何在 react native 中构建和未签名的 apk 的方法吗?

【问题讨论】:

运行'react-native start',它将在开发模式下为你的js包提供服务。目的是让您可以即时编辑 js 文件。使用发布模式不需要任何服务器,因为它将包含必要的捆绑包。请参阅下面的答案 【参考方案1】:

您需要为调试构建手动创建捆绑包。

捆绑调试构建:

#React-Native 0.59
react-native bundle --dev false --platform android --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 --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

#React-Native 0-0.49.0
react-native bundle --dev false --platform android --entry-file index.android.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

然后在打包后构建APK:

$ cd android
#Create debug build:
$ ./gradlew assembleDebug
#Create release build:
$ ./gradlew assembleRelease #Generated `apk` will be located at `android/app/build/outputs/apk`

附:另一种方法可能是修改 gradle 脚本。

【讨论】:

如果有人丢失资产:这对我有用--assets-dest ./android/app/src/main/res/ 如果这样做会在我启动应用程序时给我一个大红屏? (注:我是在弹出后直接运行这个) 由于我们没有 index.android.js,如何构建最新版本? 有最新版本的朋友,请将入口点改为--entry-file index.js,谢谢。 react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets /debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug 用于新的 reactnative 版本,其中 index.js 与 ios 统一和安卓【参考方案2】:

请按照这些步骤操作。

捆绑你的js:

如果你在项目根目录中有 index.android.js 然后运行

react-native bundle --dev false --platform android --entry-file index.android.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

如果项目根目录中有 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

创建调试apk:

cd android/
./gradlew assembleDebug

然后你可以在这里找到你的apk:

cd app/build/outputs/apk/

【讨论】:

如果这样做会在我启动应用程序时给我一个大红屏? (注:我是在弹出后直接运行这个) @SimonForsberg 如果您使用的是 react ^0.5,请将入口点更改为 index.js 而不是 App.js 或 index.android.js,react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug 不工作,此命令构建一个 apk 但该 apk 在没有打包服务器的情况下无法运行。 这行不通,因为它需要一个开发服务器 我也有同样的问题,在生成调试APK时,我可以安装它,但我需要开发服务器,当我使用发布APK时,我无法安装它手机,不知道怎么回事【参考方案3】:

反应版本 0.62.1

在你的项目根目录中

确保你已经有目录android/app/src/main/assets/,如果没有创建目录,然后创建新文件并保存为index.android.bundle并把你的文件像这样android/app/src/main/assets/index.android.bundle

然后运行这个

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/

cd android && ./gradlew assembleDebug

然后你可以在app/build/outputs/apk/debug/app-debug.apk

中获取apk

【讨论】:

这个答案真的很有效,非常感谢, 这个答案真的很有效,非常感谢, @jeeva : 如何将应用程序连接回 react native 的开发服务器? 创建index.android.bundle的点对于不在主机中使用开发服务器非常重要。 @Mayur Balha:您可以通过 USB 或 wifi 连接回来(连接在同一网络上)。对于 WiFi 在您的反应应用程序中连接回服务器 在模拟器上摇动您的手机按 Win+R 然后单击开发设置向下滚动“调试服务器主机和端口”输入您的 IP 地址和端口(在 Windows 打开 cmd 输入“ipconfig”或 Mac 打开终端输入“ifconfig”),如 192.168.1.1:8080 然后再次按 ok 摇动或按 Win+R 进行模拟器按重新加载现在您可以看到应用程序连接回开发(它仅适用于 Debug 不适用于 Release Apk)。跨度> 【参考方案4】:

和我一起,在项目目录中运行以下命令。

对于 react native 旧版本(你会在 root 中看到 index.android.js):

mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew clean assembleRelease && cd ../

对于 react native 新版本(你只在 root 中看到 index.js):

mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew clean assembleRelease && cd ../

apk 文件将在以下位置生成:

Gradle android/app/build/outputs/apk/ Gradle 3.0+:android/app/build/outputs/apk/release/

【讨论】:

您能否详细说明一下,它是如何解决问题的? 我在 index.android.bundle 中打开时出错,并通过您的建议解决了它。谢谢... :) 对我来说是$ mkdir -p android/app/src/main/assets && rm -rf android/app/build && 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 && cd android && ./gradlew assembleDebug 找不到文件:任何项目根目录中的 index.android.js 请注意,对于项目目录根目录中具有index.js 而不是index.android.js 的较新项目,需要将--entry-file index.android.js 替换为--entry-file index.js【参考方案5】:

关注first response后,您可以使用

运行您的应用
react-native run-android --variant=debug

您的应用无需打包程序即可运行

【讨论】:

最简单的答案一直是最有效的,它完美无缺,花了几天时间测试不同的命令行和大量的 js 配置,一切都在此恢复【参考方案6】:

从 react-native 0.57 开始,之前提供的答案都不再有效,因为 gradle 期望在其中找到捆绑包和资产的目录已更改。

没有 react-native bundle 的简单方法

构建调试版本的最简单方法是完全不使用react-native bundle 命令,而只需修改您的app/build.gradle 文件。

app/build.gradle 文件的project.ext.react 映射内,添加bundleInDebug: true 条目。 如果您希望它不是 --dev 构建(没有警告和缩小的捆绑包),那么您还应该将 devDisabledInDebug: true 条目添加到同一个映射中。

使用 react-native 包

如果由于某种原因您需要或想要使用 react-native bundle 命令创建捆绑包,然后使用 ./gradlew assembleDebug 创建包含捆绑包和资产的 APK,您必须确保将捆绑包和正确路径中的资产,gradle 可以在其中找到它们。

从 react-native 0.57 开始,这些路径是 android/app/build/generated/assets/react/debug/index.android.js 用于捆绑

android/app/build/generated/res/react/debug 用于资产。因此,使用捆绑包和资产手动捆绑和构建 APK 的完整命令是:

react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/generated/assets/react/debug/index.android.bundle --assets-dest ./android/app/build/res/react/debug

然后

./gradlew assembleDebug

捆绑和资产路径

请注意,gradle 查找捆绑包和资产的路径可能会发生变化。要找出这些路径的位置,请查看node_modules/react-native 目录中的react.gradle 文件。以def jsBundleDir =def resourcesDir = 开头的行分别指定了gradle 查找bundle 和assets 的目录。

【讨论】:

建议的路径与生成的react-native bundle 命令不匹配。并且没有一个变体最终以 bundle 成为 React Native 0.63 的 APK 的一部分。请参阅bug reported to React Native CLI docs 中的说明。 但是感谢bundleInDebug 的建议。这是正确的方法。当有 Gradle 脚本处理所有事情时,使用 react-native bundle 毫无意义。 路径可能从 react native 0.57 到现在已经改变,所以我不知道路径是否仍然是最新的。 是的,they've changed dramatically。您的答案仍然是最接近最佳解决方案的答案。我只想添加一个注释,这些路径都不再起作用了。【参考方案7】:

对于 Windows 用户,如果所有步骤都正确执行:https://facebook.github.io/react-native/docs/signed-apk-android.html

你只需要运行: gradlew assembleRelease

你的文件将是:

app-release.apk app-release-unaligned.apk

位置:E:\YourProjectName\android\app\build\outputs\apk

【讨论】:

您可以将 app-release.apk 安装/共享到任何设备 通常,调试版本的配置与发布版本不同(例如,它使用暂存 API)。如果您想要一个使用与发行版不同的构建配置的独立 APK,这将无济于事 此 APK 仅用于开发/测试目的。【参考方案8】:

在没有开发服务器的情况下生成调试 APK

如果您真的想生成一个调试 APK(用于测试目的),可以在没有开发服务器的情况下运行,恭喜!我来帮你。 :) 每个人都说我们需要运行两个命令react-native bundle ... 然后gradlew assembleDebug 但生成的 APK 仍然无法在没有开发服务器的情况下运行。经过多次研究和尝试,我发现我们需要更改 gradle 文件(如步骤 2 所示)。只需按照以下步骤操作:

    在你的 react native 项目中去/android/app/src/main创建一个文件夹assets 编辑android > app > build.gradle
project.ext.react = [
    ...
    bundleInDebug: true, // add this line
]
    在你的 react native 项目的根目录下运行这个命令
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 文件夹:cd android 然后,运行以下命令:gradlew assembleDebug (如果构建失败,请尝试从 android studio 构建 assembleDebug)

这将在android/app/build/outputs/apk/debug 目录中创建app-debug.apk 文件,您可以在没有开发服务器的情况下安装和运行该文件。

【讨论】:

复制资产后,我遇到了重复资源问题。【参考方案9】:

可以生成未签名的 apk 版本用于测试目的,以便您可以在手机上运行。

最初我得到了这里提到的红屏错误。但我遵循了这里提到的相同方法,它对我有用。

在工作目录的控制台上,运行这四个命令

react-native bundle --dev false --platform android --entry-file index.js --bundle-output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets-dest ./android/app/build/intermediates/res/merged/debug

cd android

gradlew assembleDebug

gradlew assembleRelease

然后APK文件将在:android\app\build\outputs\apk\debug\app-debug.apk上产生

【讨论】:

【参考方案10】:

以防其他人最近遇到同样的问题,我使用的是 React Native 0.59.8(也使用 RN 0.60 进行了测试),我可以确认其他一些答案,步骤如下:

    卸载您在设备上安装的应用的最新编译版本

    运行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

    运行cd android/ && ./gradlew assembleDebug

    在文件夹 android/app/build/outputs/apk/debug 中获取您的 app-debug.apk

祝你好运!

【讨论】:

不行!!!,它会生成调试APK,但应用仍然需要开发服务器 这在 react-native 0.59.8 中无法工作,因为 gradle 期望捆绑包在 android/app/build/generated/assets/react/debug/index.android.js 中,而资产在 react-native 0.57 中位于 android/app/build/generated/res/react/debug 中。跨度> 适用于 react native 0.60 >【参考方案11】:

您可以为此使用两个扩展程序。这被添加到 react-native 以设置这些:

    disableDevInDebug: true: 在调试 buildType 中禁用开发服务器 bundleInDebug: true:添加 jsbundle 以调试 buildType。

所以,android/app/build.gradle 中的最终 project.ext.react 应该如下所示

project.ext.react = [
    enableHermes: false,  // clean and rebuild if changing
    devDisabledInDev: true, // Disable dev server in dev release
    bundleInDebug: true, // add bundle to dev apk
]

【讨论】:

在你的代码中应该是 bundleInDebug 而不是 bundleInDev 这应该是公认的答案。 devDisabledInDevbundleInDebug 都应该设置为 true!【参考方案12】:

我在 react native 0.55.4,基本上我必须手动捆绑:

react-native bundle --dev false --platform android --entry-file index.js --bundle- 
output ./android/app/build/intermediates/assets/debug/index.android.bundle --assets- 
dest ./android/app/build/intermediates/res/merged/debug

然后通过usb连接你的设备,启用usb调试。使用adb devices 验证连接的设备。

最后运行react-native run-android,它将在您的手机上安装调试apk,您可以使用开发服务器正常运行它

注意:

从 0.49.0 开始,入口点是单个 index.js gradlew assembleRelease 只生成无法安装的未签名发布的apk

【讨论】:

【参考方案13】:

聚会迟到了,但at least on page 1 的所有解决方案都不适合我。因此,我对 react 注册的成绩任务进行了更深入的研究;

只需添加bundleInDebug : true,如@Er Suman G's answer所示

根据您在 android 文件夹中的环境运行 ./gradlew assembleDebuggradle.bat assembleDebug

这将在android/app/build/outputs/apk/debug 中生成可调试的非服务器必需应用程序

【讨论】:

【参考方案14】:

我找到了一个像这样改变 buildTypes 的解决方案:

buildTypes 
  release 
    signingConfig signingConfigs.release
  

【讨论】:

【参考方案15】:

在 build.gradle 文件中将 devDisabledInDebug: true 添加到 project.ext.react

【讨论】:

【参考方案16】:

在没有开发服务器的情况下生成调试 APK

如果您想生成可以在没有开发服务器的情况下运行的调试 APK(用于测试目的)。

    在你的 react native 项目中去/android/app/src/main创建一个文件夹assets 编辑android > app > build.gradle
universalApk true  // If true, also generate a universal APK
    在你的 react native 项目的根目录下运行这个命令
npx 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 文件夹:cd android 然后,运行以下命令:gradlew assembleDebug (如果构建失败,请尝试从 android studio 构建 assembleDebug)

就做这些吧。

如果您想在设备中安装应用程序,只需运行 cmd

adb install 'path/add-debug.apk'

【讨论】:

【参考方案17】:

按照 Aditya Singh 的回答,生成的(未签名的)apk 不会安装在我的手机上。我必须使用指令here 生成一个签名的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=****

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

...
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' 然后 run gradlew assembleRelease 命令 , 并在 android/app/build/outputs/apk/app-release.apk,**android/app/build/outputs/apk/release/app-release.apk**

下找到您的 signed apk

【讨论】:

以上是关于在没有开发服务器的设备上构建和安装未签名的 apk?的主要内容,如果未能解决你的问题,请参考以下文章

“未安装应用程序”,试图安装签名apk

签名的 apk 不工作,但未签名的 apk 工作

在没有市场的 Android 上安装 APK 应用程序

“App not not installed”在一台设备上

Android - 如何在设备上安装签名的 APK?

AdMob 广告未与 MobFox SDK 在签名的 APK 中一起显示