Nativescript 6.1.1 应用程序在 --release 模式下崩溃,在调试中工作

Posted

技术标签:

【中文标题】Nativescript 6.1.1 应用程序在 --release 模式下崩溃,在调试中工作【英文标题】:Nativescript 6.1.1 Application crashes in --release mode, works in debug 【发布时间】:2020-01-26 23:54:55 【问题描述】:

我有一个 Nativescript Vue 应用程序将不再在发布模式下运行。

我最近将应用程序从 5.3.0 迁移到 6.1.1,一切似乎都很好。我做了一些更新,包括添加nativescript-admobnativescript-purchase 以及相应的功能。同样,在 iosandroid 中调试应用程序时一切正常。

我还能够成功地为 android 构建 --release 模式并使用 iOS 存档。但是,当我运行在 android 上生成的应用程序时,它会在启动时立即崩溃。

这是一个包含我的 package.json 的要点,其中更改了应用程序 ID 等:https://gist.github.com/wpatter6/3575e029572eaedb03e723d5fba19e10

这是一个包含每次应用尝试启动时抛出的 logcat 堆栈跟踪的要点: https://gist.github.com/wpatter6/3ec8def984e5e0ef532653c149020804

这是我正在运行构建的脚本:

rm -rf platforms/android
rm -rf node_modules

npm i

tns build android --env.snapshot --env.sourceMap --bundle --clean --release --key-store-*

我不知道如何继续进行故障排除或此堆栈跟踪可能指向什么。

如果有人对如何从日志中获取更多信息或可能存在什么问题有任何建议,我将不胜感激。提前致谢!

编辑:

我尝试使用--env.snapshot 标志构建它,现在抛出一个错误,上面写着The file ./app.css couldn't be loaded! You may need to register it inside ./app/vendor.ts。这个项目使用了scss,也许那里有问题?奇怪的是这只是发布模式下的问题,样式在调试中效果很好......

【问题讨论】:

您是否使用安卓设备监视器查看日志?如果不能,您可以使用它并尝试显示整个崩溃日志。您附加的似乎是调试日志,不包含有关错误/异常的任何详细信息。 我发布的日志是使用在模拟设备上运行的 Android Studio 中的 logcat 查看器捕获的。我不熟悉 Android 设备监视器,但谷歌文档说它已被弃用(developer.android.com/studio/profile/monitor)。您能否提供有关该工具的更多信息,以便从 @Manoj 的日志中获取更多信息? @Manoj 这是更新后的堆栈跟踪,可能包含更多信息:gist.github.com/wpatter6/3ec8def984e5e0ef532653c149020804 nativescript-purchase 现在是 proplugins 的一部分。在readme 中,它声明它只支持 pre-Nativescript 6。不过我不确定这是否会导致您的错误。 我希望我能帮助你,因为我遇到了类似的问题。就我而言,我使用的是 nativescript angular,而 --env.aot 解决了我的问题。您可以尝试在 nativescript 6 上创建一个新项目,并寻找与您的项目(AndroidManifest、Gradle 等)的结构差异。祝你好运!找到答案后,您应该发布答案。 【参考方案1】:

所以我在这里缩小了问题的范围。这是我正在做的缩小/混淆,详细介绍了 Android here。

这是我app.gradle 中的当前版本,带有 明显导致问题的 buildTypes 属性已注释掉:

android 
  defaultConfig 
    minSdkVersion 21
    generatedDensities = []
    applicationId = "com.willweb.clicker"
  
  aaptOptions   
    additionalParameters "--no-version-vectors"  
    
  /* buildTypes  // THIS CAUSES RELEASE MODE ERROR ON APP LAUNCH
    release 
      // Enables code shrinking, obfuscation, and optimization for only
      // your project's release build type.
      minifyEnabled true

      // Enables resource shrinking, which is performed by the
      // Android Gradle plugin.
      shrinkResources true

      // Includes the default ProGuard rules files that are packaged with
      // the Android Gradle plugin. To learn more, go to the section about
      // R8 configuration files.
      proguardFiles getDefaultProguardFile(
        'proguard-android-optimize.txt'),
        'proguard-rules.pro'
    
   */

幸运的是,删除它确实允许我在发布模式下构建和运行应用程序,但不幸的是文件大小要大得多。

关于几年前的 proguard 存在 this question,但没有关于此的更新。

根据他们在 github 中的团队介绍,NativeScript 提供了优化应用程序大小和代码的工具,例如 Uglifing、AOT(用于 Angular)、Snapshots(仅适用于 MAC 上的 Android 版本)和 Webpack(默认启用)。此构建的一个示例是:

tns run android --env.uglify --env.aot --env.snapshot --releae <release-params-follows-here>

【讨论】:

以上是关于Nativescript 6.1.1 应用程序在 --release 模式下崩溃,在调试中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nativescript-Vue 中使用 nativescript-drawingpad?

NativeScript官方书籍:1.为什么选择nativescript

如何在 NativeScript Vue 中设置“nativescript-stripe”

Nativescript 在设备 IOS 上运行 - dyld 库未加载 @rpath/Nativescript.framework

无法在 nativescript vue 中导入 @nota/nativescript-webview-ext/vue

在 NativeScript 移动应用程序之间共享数据的方法