由于套接字超时错误,应用程序将无法安装在物理智能手机或模拟器上

Posted

技术标签:

【中文标题】由于套接字超时错误,应用程序将无法安装在物理智能手机或模拟器上【英文标题】:App will not install on physical smartphone or on emulator due to socket timeout error 【发布时间】:2019-12-29 13:48:57 【问题描述】:

我正在尝试使用 nativescript cli 在我的物理设备和使用 tns run android 命令的 android 模拟上运行我的应用程序。 当我这样做时,我收到以下错误。

我刚刚尝试将我的应用文件添加到一个新的“测试”应用中,看看是否能解决问题。

我在 github 上阅读了许多与我的问题不匹配的类似问题,因此没有提供解决方案。 我还尝试在两台不同的 Windows 10 计算机上运行它。

显示错误

Installing on device ce04171461a2d0fc0d...
Successfully installed on device with identifier 'ce04171461a2d0fc0d'.
Unable to apply changes on device: ce04171461a2d0fc0d. Error is: Socket connection timed out..

我的 package.json 文件如下:


  "nativescript": 
    "id": "org.nativescript.PrototypeAssetSurveyAppDrawer",
    "tns-android": 
      "version": "6.0.0"
    ,
    "tns-ios": 
      "version": "6.0.1"
    
  ,
  "description": "NativeScript Application",
  "license": "SEE LICENSE IN <your-license-filename>",
  "repository": "<fill-your-repository-here>",
  "scripts": 
    "lint": "tslint \"src/**/*.ts\""
  ,
  "dependencies": 
    "@angular/animations": "~8.0.0",
    "@angular/common": "~8.0.0",
    "@angular/compiler": "~8.0.0",
    "@angular/core": "~8.0.0",
    "@angular/forms": "~8.0.0",
    "@angular/http": "~8.0.0-beta.10",
    "@angular/platform-browser": "~8.0.0",
    "@angular/platform-browser-dynamic": "~8.0.0",
    "@angular/router": "~8.0.0",
    "email-validator": "2.0.4",
    "nativescript": "^6.0.3",
    "nativescript-angular": "~8.0.0",
    "nativescript-plugin-firebase": "^9.1.0",
    "nativescript-theme-core": "~1.0.6",
    "nativescript-ui-listview": "7.0.2",
    "nativescript-ui-sidedrawer": "~7.0.0",
    "reflect-metadata": "~0.1.12",
    "rxjs": "~6.5.0",
    "tns-core-modules": "~6.0.0",
    "zone.js": "~0.9.1"
  ,
  "devDependencies": 
    "@angular/compiler-cli": "~8.0.0",
    "@ngtools/webpack": "~8.0.0",
    "codelyzer": "~4.5.0",
    "nativescript-dev-webpack": "~1.0.0",
    "node-sass": "^4.7.1",
    "tslint": "~5.11.0",
    "typescript": "~3.4.0"
  ,
  "gitHead": "f28dbc60d74dd2cef4b645afd8fdd63bbb12c73e",
  "readme": "NativeScript Application"

这是我的 app.gradle 文件以允许多索引支持

def settingsGradlePath

if(project.hasProperty("appResourcesPath"))
    settingsGradlePath = "$project.appResourcesPath/Android/settings.gradle";
 else 
    settingsGradlePath = "$rootDir/../../app/App_Resources/Android/settings.gradle";


def settingsGradleFile = new File(settingsGradlePath);

if(settingsGradleFile.exists())

    apply from: settingsGradleFile;


android 
  defaultConfig 
    minSdkVersion 17
    generatedDensities = []
    multiDexEnabled = true
  
  dependencies 
      implementation 'com.android.support:multidex:1.0.3'
  

这是我的 build.gradle 代码

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript 

    repositories 
        google()
        jcenter()
        maven  url "https://maven.fabric.io/public" 
        maven  url "https://dl.bintray.com/android/android-tools" 
 
    dependencies 
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath "com.google.gms:google-services:4.3.0"
        classpath "io.fabric.tools:gradle:1.26.1"
 


allprojects 
    repositories 
        google()
        jcenter()
    


task clean(type: Delete) 
    delete rootProject.buildDir

这是我的 androidmanifest.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.nativescript.PrototypeAssetSurveyAppDrawer"
    android:versionCode="10000"
    android:versionName="1.0">

    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"/>

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name="android.support.multidex.MultiDexApplication"
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.tns.NativeScriptActivity"
            android:label="@string/title_activity_kimera"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode"
            android:theme="@style/LaunchScreenTheme">

            <meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.tns.ErrorReportActivity"/>
    </application>
</manifest>

我希望应用程序能够正确安装,然后应用程序可以在设备上运行。

【问题讨论】:

尝试用相同的安卓镜像重新安装模拟器。 @Nitish 我尝试使用新的虚拟机,结果相同 检查你的插件需要来自 android 清单文件的权限,有时它们会创建一个套接字错误。另外,请检查您的项目中 package.json 中的应用名称是否相同,项目文件夹名称和 app.gradle 文件是否匹配。 一个新的空应用程序与热更新正常工作没有问题。 @Rakoc001 @Nitish,我将整个存储库复制到“空白”测试应用程序中是否犯了错误?我应该将代码单独复制到文件中吗?如何在 android manifest 文件中判断哪些应用需要权限? 【参考方案1】:

结果证明这是我尝试在我的应用中实现多索引支持的一个问题。

根据 Android 的 multidex 说明,您需要更改“

但是 NativeScript 不支持此更改,这会导致此套接字超时问题。

【讨论】:

以上是关于由于套接字超时错误,应用程序将无法安装在物理智能手机或模拟器上的主要内容,如果未能解决你的问题,请参考以下文章

由于在应用程序安装期间超时而无法运行排毒测试

Apache HttpClient 4.0 无法在 Android 上的套接字超时

为啥智能手机在网络变化期间一直连接到服务器

unix / linux中的keepalive超时

Gsutil 错误“捕获套接字错误,重试:超时”

HTTP 503 错误 – 服务不可用 (Service unavailable)