NativeScript 开发技巧

解决 NativeScript 模态框中的状态栏覆盖问题

在 NativeScript 中,遇到状态栏覆盖模态框(modal)的问题会让人很困扰。这种状态栏覆盖问题通常是由于你的 styles.xml 文件中的特定属性引起的。以下是如何防止此问题发生的快速指南:

要解决此问题,你需要从 styles.xml 文件中移除 android:windowTranslucentStatus 属性。当此属性设置为 true 时,会使状态栏变为半透明,从而导致它覆盖在你的模态框之上。

请按照以下步骤操作:

  1. 导航至 App_resources/Android/src/main/res/values/styles.xml
  2. 查找这一行:<item name="android:windowTranslucentStatus">true</item>
  3. 从文件中移除这一行。

此外,请确保在任何其他样式文件中也不存在此属性,例如 values21/styles.xml。为此:

  1. 导航至 App_resources/Android/src/main/res/values21/styles.xml
  2. 检查是否存在 android:windowTranslucentStatus 属性。
  3. 如果存在,请将其移除。

通过移除此属性,你可以确保状态栏不会覆盖你的模态对话框,从而在你的 NativeScript 应用中提供更好的用户体验。

解决 NativeScript 项目中的 libc++_shared.so 冲突

Android 开发可能是一项具有挑战性的任务,尤其是在处理原生库和依赖项时。开发者经常遇到的一个常见问题是,由于项目中包含了同一原生库的多个实例而导致的冲突。一个典型的例子就是 libc++_shared.so 冲突。在本文中,我们将探讨这个错误是什么,为什么会发生,以及如何有效地解决它。

错误消息通常看起来像这样:

bash 复制代码
Execution failed for task ':app:mergeDebugNativeLibs'.
2 files found with path 'lib/arm64-v8a/libc++_shared.so' from inputs:
 - /Users/minhnhut/.gradle/caches/transforms-3/cd760d28106a1b4d4e96396bcec235da/transformed/jetified-nativescript-optimized-with-inspector/jni/arm64-v8a/libc++_shared.so
 - /Users/minhnhut/.gradle/caches/transforms-3/5f9aea1bacbd967e47cda037c65bd0e3/transformed/jetified-PdfiumAndroid-1.0.1/jni/arm64-v8a/libc++_shared.so
If you are using jniLibs and CMake IMPORTED targets, see
https://developer.android.com/r/tools/jniLibs-vs-imported-targets

对于上面提到的错误消息,它是由 @nativescript/pdf 插件尝试再次引入 libc++_shared.so 库引起的,而该库已经存在于项目中。要解决此问题,请确保两个 libc++_shared.so 库实例是同一版本。然后,只需将以下指令添加到 App_Resources/Android/app.gradle 中:

gradle 复制代码
android {
    packagingOptions {
        pickFirst 'lib/*/libc++_shared.so'
    }
}

理解这个错误

你看到的错误消息表明你的 Android 项目中存在冲突,特别是关于从两个不同来源引入 libc++_shared.so 库。当你项目中有多个依赖项包含了同一个原生库时,通常会发生这种情况。

以下是错误消息的分解:

  • 同一库的多个实例libc++_shared.so 文件正从你项目中的两个不同路径被引入。这造成了冲突,因为 Android 不知道该使用哪个版本的库。
  • 冲突的来源 :在上面的例子中,冲突来自于两个依赖项:
    • nativescript-optimized-with-inspector
    • PdfiumAndroid-1.0.1
  • JNI 库和 CMake:错误消息提示,如果你正在使用 JNI 库和 CMake IMPORTED targets,你应该参考一个特定的 Android 开发者指南。该指南可以帮助解决 JNI 库和 CMake IMPORTED targets 之间的冲突。

在上面的例子中,当我安装了 @nativescript/pdf 插件后出现了错误消息,该插件引入了 PdfiumAndroid-1.0.1。不幸的是,这个原生依赖项需要 libc++_shared.so 库,而这个库显然已经被其他插件在某处需要了。

解决冲突

要解决此问题,你有几个选项:

  1. 从其中一个依赖项中排除该库 :如果其中一个依赖项并非严格需要 libc++_shared.so,你可以将其排除在打包之外。这通常可以通过 Gradle 配置来完成。
  2. 确保所有依赖项中的版本一致 :如果两个依赖项都需要该库,请确保它们使用的是同一版本。这可能需要更新其中一个依赖项以使 libc++_shared.so 的版本对齐。
  3. 手动解决 :通过确保你的项目中只包含一个 libc++_shared.so 实例来手动解决冲突。这可能涉及自定义的 gradle 脚本或手动操作你的项目构建文件。
  4. 查阅提供的指南 :如错误消息所建议的,查阅关于 JNI 库和 CMake IMPORTED targets 的 Android 开发者指南,获取处理此类冲突的详细说明。

小结

在处理原生库时,仔细考虑项目的依赖关系以及它们之间的交互非常重要。对这些库的管理不当即使在构建过程成功完成的情况下,也可能导致运行时问题。

相关推荐
sp424 小时前
在 NativeScript-Vue 中实现流畅的共享元素转场动画
app·nativescript
sp424 小时前
在 NativeScript 中扩展 Android 原生类
app·nativescript
sp42a9 小时前
将 NativeScript 项目升级到 Android API 35 级别
android·nativescript
Kingexpand_com2 天前
任务分发管理APP开发全解析|技术选型、架构设计与落地实践(旌展技术分享)
app·软件开发·app开发·app定制开发·app定制开发公司
Kingexpand_com4 天前
物联网APP开发实战:如何打造用户真正愿意用的智能硬件伴侣
物联网·小程序·app·智能硬件·物联网app定制开发
summerkissyou19877 天前
Android-view-绘制流程及自定义例子
android·app
aykon13 天前
SparseArray详解,SparseArray和HashMap性能、内存对比
app
Haha_bj19 天前
Flutter——状态管理 Provider 详解
flutter·app
QING61821 天前
使用ADB分析CPU性能 —— 基础指南
android·前端·app