使用 tns 运行 在同一 android 设备上发布 运行 多个 NativeScript 应用程序

Issue running more than one NativeScript application on the same android device with tns run

NativeScript 2.0.0,Windows10

当尝试在同一台 android 设备上 运行 多个 NativeScript 应用程序时,tns 运行 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.4.0 目录中有一个清单模板,其中包含:

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

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

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

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

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

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

"id" 是将安装在 phone 上的应用程序的基础名称。在这种情况下;这是很棒的 "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

这个解决方法对我有用:

在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__" ...>