【问题标题】:Issue running more than one NativeScript application on the same android device with tns run使用 tns run 在同一台 android 设备上运行多个 NativeScript 应用程序的问题
【发布时间】:2016-05-16 18:27:38
【问题描述】:

NativeScript 2.0.0,Windows 10

当尝试在同一台安卓设备上运行多个 NativeScript 应用程序时,tns run android 命令会停止并显示以下消息:

Successfully deployed on device with identifier '192.168.99.100:5555'.

应用程序未安装。

经过一番调查,我尝试直接使用 adb 在 android 设备上安装应用程序:

adb "-s" "192.168.99.100:5555" "install" "-r" "<path to apk>.apk"

命令响应如下:

961 KB/s (15394490 bytes in 15.642s)
WARNING: linker: /system/lib/libhoudini.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
        pkg: /data/local/tmp/<app name>-debug.apk
Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]

经过对INSTALL_FAILED_CONFLICTING_PROVIDER的一番调查,发现如下链接:

我可以说这是一个丑陋的问题。

研究了一下,在NativeScript项目中,目录\platforms\android\build\intermediates\exploded-aar\com.google.android.gms\play-services-measurement\8.4.0目录下有一个manifest模板包含:

<provider
      android:authorities="${applicationId}.google_measurement_service"
      android:name="com.google.android.gms.measurement.AppMeasurementContentProvider"
      android:exported="false"/>

但 applicationId 从未定义,因此当添加了多个具有此提供程序的应用时,第二个将无法安装。

【问题讨论】:

  • 这是股票模拟器、精灵还是真机?哪个设备/版本?

标签: android nativescript


【解决方案1】:

我的手机和模拟器上安装了多个 NS 应用程序;但是,当您创建新应用程序时;检查是否以某种方式结束了相同的内部名称。 (如果您复制之前的项目,这很容易发生)

打开位于项目文件夹最外层根目录中的 main/primary package.json 文件。

在这个 package.json 文件中你应该有一个密钥:

"nativescript": {
        "id": "org.nativescript.test3",
        "tns-android": {
            "version": "2.0.0"
        }
    },

“id”是将安装在手机上的应用程序的基础名称。在这种情况下;这是很棒的“org.nativescript.test3”项目。

如果您得到重复的 id,那么应用程序将在部署时相互覆盖。


发生这种情况还有第二个原因,这个问题的真正原因也被问题的作者弄清楚了。但我会留在这里,以供将来可能遇到此问题的任何人使用,以便我们得到有效的答案。

作者使用的是 Google Play Services 插件,它有一个 AppMeasurementContentProvider,如果您没有在配置中设置 applicationId,它将默认为空白 id;这意味着它将与使用 GPS 且未设置 applicationId 的任何其他应用程序发生冲突。

这个错误真正令人讨厌的是,它会与任何其他开发人员的任何应用程序发生冲突,这些开发人员也将他们的 applicationId 留空。因此,只有一个应用程序可以安装;任何其他具有空白 applicationId 的应用都无法安装在该设备上。

解决方案是打开您的 /app/App_Resources/Android/app.gradle 文件,我们将为其添加一个新值。

NativeScript v2.00 的当前版本如下所示:

android {  
  defaultConfig {  
    generatedDensities = []  
  }  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
} 

如果您还记得此答案的第一部分以及关于重复 ID 的内容;我们引用的 package.json 为您提供了您想要使用的名称。所以在我的情况下,我会添加到

defaultConfig {
   applicationId = "org.nativescript.test3"
}

所以最终的文件应该是这样的:

android {  
  defaultConfig {  
    generatedDensities = []  
    applicationId = "org.nativescript.test3"
  }  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
} 

这与: Install shows error in console: INSTALL FAILED CONFLICTING PROVIDER https://code.google.com/p/analytics-issues/issues/detail?id=784

【讨论】:

    【解决方案2】:

    这个解决方法对我有用:

    在app/App_Resources/Android/AndroidManifest.xml文件中添加:

    <provider
       tools:replace="android:authorities"
       android:name="com.google.android.gms.measurement.AppMeasurementContentProvider"
       android:authorities="MY_APPLICATION_ID.gms.measurement.google_measurement_service"  
       android:exported="false" />
    

    其中 MY_APPLICATION_ID 是应用程序的包(手动放置,因为 __PACKAGE__ 不起作用) 不要忘记声明 de tools 命名空间:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="__PACKAGE__" ...>
    

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多