【问题标题】:Can you deploy to a device via Gradle from the command line您可以从命令行通过 Gradle 部署到设备吗
【发布时间】:2013-06-23 22:50:34
【问题描述】:

问题的真正含义是什么——你可以通过命令行直接向 gradlew 发出任何命令来构建、打包和部署到设备吗?

【问题讨论】:

  • gradle tasks 有助于查看开箱即用的任务 - 包括安装(但不是如下所述开始)
  • 命令行不是 IDE 特定的,即这种方式适用于 Android Studio 或基于 Eclipse 的 IDE

标签: android gradle android-studio gradlew


【解决方案1】:
$ gradle installDebug

这会将调试构建 apk 推送到设备,但您必须手动启动应用程序。

【讨论】:

  • 如下,改名为“gradle installDefaultFlavorDebug”
  • @durka42 仅当您使用风味时才会出现这种情况
  • 我会说 ./gradlew iD 而不是 gradle iD
  • 是否可以在 Eclipse 上安装的 Gradle 插件中运行此命令?我收到此错误:在根项目“blahblah”中找不到任务“installDebug”。
【解决方案2】:

由于您使用的是 Gradle,您可以简单地在 build.gradle 中添加自己的任务

task appStart(type: Exec, dependsOn: 'installDebug') {
    // linux 
    commandLine 'adb', 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'

    // windows
    // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'      
}

然后在你的项目根目录中调用它

$ gradle appStart

更新:

如果您使用的是applicationIdSuffix ".debug",请将.debug 添加到appId only,但保持活动不变:

'com.example.debug/com.example.MyActivity'

【讨论】:

  • 另外,如果你的Activity不在你的包的根目录下,最后一个参数应该是'com.your.packagename/.path.relative.to.your.packagename.MyActivity'而不是'com.example/.MyActivity'
【解决方案3】:

1.构建项目,将生成的 apk 安装到设备

# at the root dir of project
$ gradle installDebug

2。在设备上打开应用

$ adb shell am start -n yourpackagename/.activityname

【讨论】:

  • 别名 arun="gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
  • 我无法在 gradle 中选择 installDebug。没有合适的任务。改名了吗?
  • @JonasGröger 似乎已重命名为 installDefaultFlavorDebug
  • @rps_deepan 您能否重命名该任务,因为它已被重命名?
  • alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity" #Runs step2 只有当第1步成功时
【解决方案4】:

一行句:

构建项目并安装生成的 apk 并在设备上打开应用

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity

【讨论】:

    【解决方案5】:

    有三个命令可以做到这一点:

    1. ./gradlew assembleDebug #To build the project

    2. adb install -r ./app/build/outputs/apk/app-debug.apk #To install it to the device

    3. adb shell am start -n $PACKAGE/$PACKAGE.$ACTIVITY #To launch the application in the device,其中 $PACKAGE 是开发包,$ACTIVITY 是要启动的活动(启动器活动)。

    我一直在写bash script to do this,还有其他一些功能。

    【讨论】:

      【解决方案6】:

      更灵活的方法是使用猴子:

      task runDebug (type: Exec, dependsOn: 'installDebug') {
          commandLine android.getAdbExe().toString(), "shell",
              "monkey",
              "-p", "your.package.name.debugsuffix",
              "-c", "android.intent.category.LAUNCHER", "1"
      }
      

      这种方法的一些优点:

      • getAdbExe 不需要 adb 在路径上,而是使用 local.properties 中指向的 sdk 中的 adb 版本。
      • monkey 工具允许您发送启动器意图,因此您无需知道活动的名称。

      【讨论】:

      • 你可以改为执行adb shell am start your.package.name.debugsuffix\.Activity
      • 但如果您不知道活动名称怎么办?
      • 那么你不应该编写构建文件。
      • 我认为构建文件明确知道要运行哪个 Activity 是一个非常糟糕的主意......似乎与关注点分离相违背。一个简单的原因 - 如果您重命名/移动 Activity 文件,现在需要更改构建文件。此外,意图似乎比文件更适合运行 api - 我可以编写一个 gradle 扩展,添加默认意图和运行它们的方法,对其进行版本化,并且永远不需要知道任何人的类名。硬编码永远不是正确的答案。
      • 这个答案也缺少找到根包的方法——我也想去掉包名——例如而是从清单中发现它。
      【解决方案7】:

      构建 -> 卸载旧版本 -> 安装新版本 -> 运行应用程序。

      echo "Build application" && ./gradlew clean build && 
      echo "Uninstall application" && adb uninstall [application package] && 
      echo "Install application" && adb -d install app/build/outputs/apk/<build type>/[apk name].apk echo "Run application" && 
      adb shell am start -n [application package]/.[application name]
      

      或者如果您想以调试类型安装和运行应用程序。

      ./gradlew installDebug && adb shell am start -n [application package]/.[application name]
      

      【讨论】:

      • 谢谢。 @alexander-polomodov
      【解决方案8】:

      我编写此任务是为了能够在设备上安装和打开应用程序。由于我有多个具有不同应用程序 ID 的 buildTypesflavors,因此对包名称进行硬编码是不可行的。所以我改为这样写:

      android.applicationVariants.all { variant ->
          task "open${variant.name.capitalize()}" {
              dependsOn "install${variant.name.capitalize()}"
      
              doLast {
                  exec {
                      commandLine "adb shell monkey -p ${variant.applicationId} -c android.intent.category.LAUNCHER 1".split(" ")
                  }
              }
          }
      }
      

      这将为您已经拥有的每个install{variant} 任务提供open{variant}

      【讨论】:

        【解决方案9】:
        task appStart(type: Exec, dependsOn: 'installDebug') {
            commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
        }
        

        【讨论】:

        • 运行的最佳方案
        猜你喜欢
        • 2020-01-16
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多