导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    在Android中使用ROS

    技术交流
    ros rosjava android
    4
    11
    12234
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • weijiz
      weijiz 最后由 weijiz 编辑

      由于ROS提供了Android的对应的开发库,我们可以方便的在Android中开发相应的ROS客户端程序。下面介绍一下在Android中使用ROS库的方法。

      1. 开发环境配置

      Android的开发一般使用Android Studio. 其ROS相关的配置方式可以有两种。一种是在ROS环境中使用,另一种是给普通的Android App添加上ROS的依赖库。第二种方式可以在开发机器没有安装ROS的条件下进行开发。由于我使用Windows系统开发Android,所以这里使用第二种方式。

      1.创建Android App项目

      首先在Android Studio中创建一个普通的Android App

      0_1539307156811_6d22da70-2962-4ef5-888b-726e23b5998f-image.png

      设置好项目名称后点击Next

      0_1539307220238_1f5381be-cd02-4833-afee-b459c48e2f85-image.png

      继续点击Next

      0_1539307249051_27ffcaed-e645-4778-af68-15fa883817b3-image.png

      选择Empty Activity后点击Next

      0_1539307281775_256bf658-2614-45f1-92d1-e880741183d1-image.png

      然后点击Finish

      等待项目Sync完成。

      2.修改build.gradle文件

      项目Sync完成之后,在项目左侧的文件列表内会有两个build.gradle文件。其中一个是Project的,另一个是Module的。

      0_1539307502506_ff9ec153-eba0-4e7b-a3a3-d6d4613f010b-image.png

      首先修改Project的build.gradle文件

      把文件中的

      buildscript {
          repositories {
              jcenter()
          }
          dependencies {
              classpath 'com.android.tools.build:gradle:2.2.3'
      
              // NOTE: Do not place your application dependencies here; they belong
              // in the individual module build.gradle files
          }
      }
      

      修改为

      buildscript {
        apply from: "https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle"
      }
      

      然后在文件中添加

      subprojects {
          apply plugin: 'ros-android'
      
          afterEvaluate { project ->
              android {
                  // Exclude a few files that are duplicated across our dependencies and
                  // prevent packaging Android applications.
                  packagingOptions {
                      exclude "META-INF/LICENSE.txt"
                      exclude "META-INF/NOTICE.txt"
                  }
              }
          }
      }
      

      然后修改Module的build.gradle,在dependencies 中添加ros依赖

      ...
      dependencies {
          ...
          // You now now add any rosjava dependencies, like so:
          compile 'org.ros.android_core:android_10:[0.3,0.4)'
      }
      ...
      

      同时把dependencies 中的 全部implementation修改为compile。注意修改时的大小写。

      把文件中的compileSdkVersion版本设置为25
      targetSdkVersion也设置为25
      把 com.android.support:appcompat-v7:27.1.1也修改成25的版本

      最后修改完成的文件如下面所示

      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion 25
          defaultConfig {
              applicationId "org.bwbot.rostest"
              minSdkVersion 15
              targetSdkVersion 25
              versionCode 1
              versionName "1.0"
              testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
          }
          buildTypes {
              release {
                  minifyEnabled false
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              }
          }
      }
      
      dependencies {
          compile fileTree(dir: 'libs', include: ['*.jar'])
          compile 'com.android.support:appcompat-v7:25.4.0'
          compile 'com.android.support.constraint:constraint-layout:1.1.3'
          testCompile 'junit:junit:4.12'
          androidTestCompile 'com.android.support.test:runner:1.0.2'
          androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.2'
          compile 'org.ros.android_core:android_10:[0.3,0.4)'
      }
      

      3.修改AndroidManifest.xml文件

      此时如果编译项目会出现下面的错误

      Manifest merger failed : Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest.xml:7:9-43
      	is also present at [org.ros.android_core:android_10:0.3.3] AndroidManifest.xml:19:9-36 value=(@mipmap/icon).
      	Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:5:5-19:19 to override.
      

      此时需要修改AndroidManifest.xml文件在application项目中做如下修改

      <application xmlns:tools="http://schemas.android.com/tools"
              tools:replace="android:icon"
              ...
      

      为了能够正常使用还需要给app添加网络权限。在AndroidManifest.xml文件中添加

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

      最后的AndroidManifest.xml文件如下

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.bwbot.rostest">
          <uses-permission android:name="android.permission.INTERNET"/>
          <application
              xmlns:tools="http://schemas.android.com/tools"
              tools:replace="android:icon"
              android:allowBackup="true"
              android:icon="@mipmap/ic_launcher"
              android:label="@string/app_name"
              android:roundIcon="@mipmap/ic_launcher_round"
              android:supportsRtl="true"
              android:theme="@style/AppTheme">
              <activity android:name=".MainActivity">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
      
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
          </application>
      </manifest>
      

      此时项目已经可以成功编译了。

      2. 写一个简单的消息发布程序

      MainActivity.java内容如下

      package org.bwbot.rostest;
      
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      
      import org.ros.android.RosActivity;
      import org.ros.concurrent.CancellableLoop;
      import org.ros.namespace.GraphName;
      import org.ros.node.ConnectedNode;
      import org.ros.node.Node;
      import org.ros.node.NodeConfiguration;
      import org.ros.node.NodeMain;
      import org.ros.node.NodeMainExecutor;
      import org.ros.node.topic.Publisher;
      
      import java.net.URI;
      
      import std_msgs.String;
      
      public class MainActivity extends RosActivity {
      
          protected MainActivity() {
              super("ros_test", "ros_test", URI.create("http://192.168.0.23:11311")); // 这里是ROS_MASTER_URI
          }
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
          }
      
          @Override
          protected void init(NodeMainExecutor nodeMainExecutor) {
              NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(getRosHostname());
              nodeConfiguration.setMasterUri(getMasterUri());
              nodeMainExecutor.execute(new NodeMain() {
                  @Override
                  public GraphName getDefaultNodeName() {
                      return GraphName.of("ros_test");
                  }
      
                  @Override
                  public void onStart(ConnectedNode connectedNode) {
                      final Publisher<std_msgs.String> pub =  connectedNode.newPublisher("/test", String._TYPE);
                      connectedNode.executeCancellableLoop(new CancellableLoop() {
                          @Override
                          protected void loop() throws InterruptedException {
                              std_msgs.String msg = pub.newMessage();
                              msg.setData("hello world");
                              pub.publish(msg);
                              Thread.sleep(1000);
                          }
                      });
                  }
      
                  @Override
                  public void onShutdown(Node node) {
      
                  }
      
                  @Override
                  public void onShutdownComplete(Node node) {
      
                  }
      
                  @Override
                  public void onError(Node node, Throwable throwable) {
      
                  }
              }, nodeConfiguration);
          }
      }
      
      

      编译后,在手机上运行App。然后再运行的ROS的主机上打印/test话题

      0_1539309423828_6d76f7f8-7323-4eb0-af7f-25ecf8e92acd-image.png

      可以看到消息已经成功发送出来了。

      本项目已经发布到 Github

      3. 注意事项

      1. compileSdkVersion 版本问题
        由于在新版本的Android中,com.android.support:appcompat-v7软件包移除了一些组件。而这些组件ROS的库使用到了。所以在Android SDK > 25的版本中无法使用Android ROS. 所以我们要在配置文件中修改SDK版本。

      2. Android模拟器网络
        Android模拟器默认是有NAT转换,所以使用虚拟机是无法访问到局域网内的ROS Master的。开发时建议使用实际的手机。

      4. 如何使用自定义的消息类型

      使用自己定义的消息需要首先生成消息的jar库文件,然后导入项目依赖。

      下面以小强的galileo_serial_server里面的消息为例。

      首先安装rosjava相关的依赖包

      sudo apt-get install ros-kinetic-genjava
      sudo apt-get install ros-kinetic-rosjava*
      

      然后catkin_make具有相关消息的软件包

      catkin_make -DCATKIN_WHITELIST_PACKAGES="galileo_serial_server"
      

      可以看到其输出如下

      WARNING: Package name "NLlinepatrol_planner" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes.
      [ 73%] Built target galileo_serial_server_generate_messages_java
      Scanning dependencies of target galileo_serial_server_node
      [ 78%] Building CXX object galileo_serial_server/CMakeFiles/galileo_serial_server_node.dir/src/galileo_serial_server_node.cpp.o
      [ 84%] Building CXX object galileo_serial_server/CMakeFiles/galileo_serial_server_node.dir/src/galileo_serial_server.cpp.o
      [ 89%] Building CXX object galileo_serial_server/CMakeFiles/galileo_serial_server_node.dir/src/AsyncSerial.cpp.o
      [ 94%] Compiling Java code for galileo_serial_server
      [100%] Linking CXX executable /home/xiaoqiang/Documents/ros/devel/lib/galileo_serial_server/galileo_serial_server_node
      [100%] Built target galileo_serial_server_node
      warning: [options] bootstrap class path not set in conjunction with -source 1.7
      1 warning
      Uploading: org/ros/rosjava_messages/galileo_serial_server/1.0.0/galileo_serial_server-1.0.0.jar to repository remote at file:/home/xiaoqiang/Documents/ros/devel/share/maven/
      Transferring 2K from remote
      Uploaded 2K
      [100%] Built target galileo_serial_server_generate_messages_java_gradle
      Scanning dependencies of target galileo_serial_server_generate_messages
      [100%] Built target galileo_serial_server_generate_messages
      

      从输出中可以看出,消息的jar包已经生成到了/home/xiaoqiang/Documents/ros/devel/share/maven/文件夹中

      0_1539311040223_4410be69-f46d-4f19-9622-c91dc1da7fa8-image.png

      把此jar文件复制到Android项目中的 app\libs文件夹中。

      右键点击app,在弹出的菜单中点击Open Module Settings

      0_1539311262707_927ba11a-1a93-4994-a662-d4ff2997a67f-image.png

      0_1539311306670_c41eb533-ad59-43f9-b98d-5724913526c0-image.png

      选择dependencies页面,然后点击右侧加号

      选择jar dependencies,然后选择jar文件点击确认就可以了

      0_1539311384074_13a799a9-3aff-448a-a5b4-61fad7960cf3-image.png

      这样就可以在程序中使用自定义的消息了。

      5. ROS Android的程序设计模式

      在ROS Android库中,ROS的相关操作都是异步的(通过回调的方式),比如创建节点,发布和订阅消息。这个在使用中会比较麻烦。比如我们需要实现点击一个按钮就发布一个消息的功能。就需要把这个发布消息的程序封装成一个类,然后继承CancellableLoop。在loop中发布消息。同时提供一个发布消息的方法给别人调用。
      比如下面的方法

      
      public class GalileoCommander extends CancellableLoop {
      
          private Publisher<galileo_serial_server.GalileoNativeCmds> pub;
          private ConnectedNode node;
          private Queue<byte[]> cmdList;
      
          public GalileoCommander(ConnectedNode connectedNode){
              node = connectedNode;
              cmdList = new LinkedBlockingQueue<>(100);
              pub = connectedNode.newPublisher("/test", GalileoNativeCmds._TYPE);
          }
      
          public void sendCmds(byte[] cmds){
              if(!cmdList.offer(cmds)){
                  cmdList.poll();
                  cmdList.offer(cmds);
              }
          }
      
          @Override
          protected void loop() throws InterruptedException {
              byte[] cmd = cmdList.poll();
              if(cmd == null){
                  Thread.sleep(1);
              }else{
                  galileo_serial_server.GalileoNativeCmds galileo_cmd =  pub.newMessage();
                  galileo_cmd.setLength(cmd.length);
                  pub.publish(galileo_cmd);
              }
          }
      }
      

      使用时

      nodeMainExecutor.execute(new NodeMain() {
          @Override
          public GraphName getDefaultNodeName() {
              return GraphName.of("test_node");
          }
      
          @Override
          public void onStart(ConnectedNode connectedNode) {
              galileoCommander = new GalileoCommander(connectedNode);
              connectedNode.executeCancellableLoop(galileoCommander);
          }
      }, nodeConfiguration)
      

      这是我目前想到的比较好的模式,如果有其他更好的方法也欢迎交流。

      1 条回复 最后回复 回复 引用 0
      • BITLiuYu
        BITLiuYu 最后由 weijiz 编辑

        我的系统是Ubuntu,所有的设置也是按照您的教程做的,但是run的时候就立即闪退。
        其中,修改app的build.gradle时出现错误:

        Error:Conflict with dependency 'com.google.code.findbugs:jsr305' in project ':app'. Resolved versions for app (1.3.9) and test app (2.0.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
        

        按照网上的方式,进行修改,在Android节点下添加:

        configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
        }
        

        不知道是否会影响

        我的build.gradle为:

        apply plugin: 'com.android.application'
        
        android {
        compileSdkVersion 25
        //buildToolsVersion '25.0.0'
        defaultConfig {
        applicationId "com.example.rostest"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
        release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        }
        productFlavors {
        }
        
        configurations.all {
            resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
        }
        
        }
        
        dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.+'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
        
        //androidTestCompile 'com.android.support.test:runner:1.0.2'
        //androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
        
        compile 'org.ros.android_core:android_10:[0.3,0.4)'
        
        }
        
        
        weijiz 1 条回复 最后回复 回复 引用 0
        • weijiz
          weijiz @BITLiuYu 最后由 编辑

          @bitliuyu 在 在Android中使用ROS 中说:

          versionName

          可以运行例子的Android项目吗?
          闪退后Logcat里面的错误是什么?
          是不是没有设置网络权限?

          BITLiuYu 1 条回复 最后回复 回复 引用 0
          • BITLiuYu
            BITLiuYu @weijiz 最后由 编辑

            @weijiz 可以运行自带的HelloWorld,但是改为您写的MainActivity就会闪退,URI.create我已经改为自己的ip地址了。logcat错误信息为:
            10-15 17:16:56.627 32148-32148/org.bwbot.rostest E/AndroidRuntime: FATAL EXCEPTION: main
            Process: org.bwbot.rostest, PID: 32148
            java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.bwbot.rostest/org.bwbot.rostest.MainActivity}: java.lang.IllegalAccessException: void org.bwbot.rostest.MainActivity.() is not accessible from java.lang.Class<android.app.AppComponentFactory>
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6669)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
            Caused by: java.lang.IllegalAccessException: void org.bwbot.rostest.MainActivity.() is not accessible from java.lang.Class<android.app.AppComponentFactory>
            at java.lang.Class.newInstance(Native Method)
            at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loop(Looper.java:193) 
            at android.app.ActivityThread.main(ActivityThread.java:6669) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

            weijiz 1 条回复 最后回复 回复 引用 0
            • weijiz
              weijiz @BITLiuYu 最后由 编辑

              @bitliuyu 在 在Android中使用ROS 中说:

              lass<android.app.AppComponentFactory>

              从错误看不像是gradle的设置问题。你可以把你的代码发github上,我给你看看。

              BITLiuYu 1 条回复 最后回复 回复 引用 0
              • BITLiuYu
                BITLiuYu @weijiz 最后由 编辑

                @weijiz 这是我上传到github上的代码
                https://github.com/BITLiuYu/ROSTest.git
                多谢您能帮我看一下

                weijiz 1 条回复 最后回复 回复 引用 0
                • weijiz
                  weijiz @BITLiuYu 最后由 weijiz 编辑

                  @bitliuyu 你的程序我可以正常运行额

                  0_1539598709253_424f26be-ce25-4643-95d6-ed09d0b2b5f8-image.png

                  用的是这个配置
                  0_1539598792004_e3effb8e-02a4-4b50-9e42-97b5e018da13-image.png

                  BITLiuYu 1 条回复 最后回复 回复 引用 0
                  • BITLiuYu
                    BITLiuYu @weijiz 最后由 编辑

                    @weijiz 我的程序也跑通了,是一个设置出了问题,修改过程是:
                    打开IDE,进入File—>Setting—>Build,Execution,Deployment—>Instant Run
                    将将enable instant run to hot swap code/resource changes on deploy勾上!
                    0_1539602762564_Screenshot from 2018-10-15 19-25-14.png

                    1 条回复 最后回复 回复 引用 0
                    • gongyue666
                      gongyue666 最后由 编辑

                      请问导入的自建消息,如何在jni中调用呢?

                      gongyue666 1 条回复 最后回复 回复 引用 0
                      • gongyue666
                        gongyue666 @gongyue666 最后由 编辑

                        @gongyue666 好像是给java用的,如果是给c++用的自建消息应该如何导入呢?

                        1 条回复 最后回复 回复 引用 0
                        • 几何木偶
                          几何木偶 最后由 编辑

                          为什么编译总是这个错误?是依赖错了吗?

                          Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle'.
                          	at org.gradle.internal.resource.ResourceExceptions.failure(ResourceExceptions.java:74)
                          	at org.gradle.internal.resource.ResourceExceptions.getFailed(ResourceExceptions.java:57)
                          	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceAccessor.resolve(DefaultExternalResourceAccessor.java:67)
                          	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceAccessor.resolveUri(DefaultExternalResourceAccessor.java:47)
                          	at org.gradle.internal.resource.transfer.DefaultUriTextResourceLoader.loadUri(DefaultUriTextResourceLoader.java:43)
                          	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyScript(DefaultObjectConfigurationAction.java:103)
                          	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$000(DefaultObjectConfigurationAction.java:38)
                          	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$1.run(DefaultObjectConfigurationAction.java:68)
                          	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:143)
                          	at org.gradle.api.internal.project.AbstractPluginAware.apply(AbstractPluginAware.java:46)
                          	at org.gradle.api.internal.project.ProjectScript.apply(ProjectScript.java:34)
                          	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                          	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                          	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                          	at java.lang.reflect.Method.invoke(Method.java:498)
                          	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
                          	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
                          	at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:479)
                          	at org.gradle.internal.metaobject.BeanDynamicObject.tryInvokeMethod(BeanDynamicObject.java:191)
                          	at org.gradle.groovy.scripts.BasicScript$ScriptDynamicObject.tryInvokeMethod(BasicScript.java:130)
                          	at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:78)
                          	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:430)
                          	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:369)
                          	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
                          	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
                          
                          Caused by: org.gradle.internal.resource.transport.http.HttpRequestException: Could not HEAD 'https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle'.
                          	at org.gradle.internal.resource.transport.http.HttpClientHelper.performRequest(HttpClientHelper.java:96)
                          	at org.gradle.internal.resource.transport.http.HttpClientHelper.performRawHead(HttpClientHelper.java:72)
                          	at org.gradle.internal.resource.transport.http.HttpClientHelper.performHead(HttpClientHelper.java:76)
                          	at org.gradle.internal.resource.transport.http.HttpResourceAccessor.getMetaData(HttpResourceAccessor.java:65)
                          	at org.gradle.internal.resource.transfer.DefaultExternalResourceConnector.getMetaData(DefaultExternalResourceConnector.java:63)
                          	at org.gradle.internal.resource.transfer.AccessorBackedExternalResource.getMetaData(AccessorBackedExternalResource.java:201)
                          	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$1.call(BuildOperationFiringExternalResourceDecorator.java:61)
                          	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$1.call(BuildOperationFiringExternalResourceDecorator.java:58)
                          	at org.gradle.internal.progress.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:350)
                          	at org.gradle.internal.progress.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:340)
                          	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
                          	at org.gradle.internal.progress.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:120)
                          	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator.getMetaData(BuildOperationFiringExternalResourceDecorator.java:58)
                          	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:102)
                          	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:82)
                          	at org.gradle.cache.internal.ProducerGuard$AdaptiveProducerGuard.guardByKey(ProducerGuard.java:97)
                          	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.getResource(DefaultCacheAwareExternalResourceAccessor.java:82)
                          
                          1 条回复 最后回复 回复 引用 0
                          • 1 / 1
                          • First post
                            Last post
                          Copyright © 2015-2023 BlueWhale community