您可以从命令行通过Gradle部署到设备吗


89

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


1
gradle tasks有助于了解开箱即用的任务-包括安装(但不能按如下所述开始)
Dori

命令行不是特定于IDE的,.ie这种方式可以在Android Studio或基于Eclipse的IDE中使用
Paul Verest 2014年

在cmd中gradlew installdebug-根文件夹应该是路径
c49

Answers:


97
$ gradle installDebug

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


2
如下所示,它已重命名为“ gradle installDefaultFlavorDebug”
durka42

2
@ durka42只有当您使用调味料时,情况才如此
Mathijs Segers 2014年

3
我会说./gradlew iD而不是gradle iD
irudyak

1
是否可以在Eclipse上已安装的Gradle插件中运行此命令?我收到此错误:在根项目“ blahblah”中找不到任务“ installDebug”。
Dr.jacky '16

75

由于使用的是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中,但不要更改活动:

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


1
此外,如果您的活动不在包的根目录中,则应使用last参数'com.your.packagename/.path.relative.to.your.packagename.MyActivity'代替'com.example/.MyActivity'
2015年

66

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

# at the root dir of project
$ gradle installDebug

2.在设备上打开应用

$ adb shell am start -n yourpackagename/.activityname

6
别名arun =“ gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity”
Dominic Bartl 2013年

我无法在gradle中选择installDebug。没有合适的任务。它被重命名了吗?
JonasGröger2013年

1
@JonasGröger,它似乎已重命名为installDefaultFlavorDebug
durka42

@rps_deepan您可以重命名该任务,因为它已经被重命名了吗?
JonasGröger2013年

6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"#仅在第1步成功时才运行step2
Thamme Gowda

7

一句:

在设备上构建项目并安装生成的APK和Open app

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

7

有以下三个命令可以完成此操作:

  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脚本来完成此任务,并具有其他一些功能。


4

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

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放在路径上,并使用指向sdk中的adb版本local.properties
  • monkey工具允许您发送启动器意图,因此您无需知道活动的名称。

您可以改为执行adb shell am start your.package.name.debugsuffix\.Activity
Vikram Bodicherla

但是,如果您不知道活动的名称怎么办?
0xcaff 2016年

1
然后,您不应该编写构建文件。
kevr '16

3
我认为对于构建文件而言,明确知道要运行哪个活动是一个非常糟糕的主意……似乎有些顾虑分离。一个简单的原因-如果您重命名/移动“活动”文件,则现在需要更改构建文件。此外,意图似乎比文件更适合运行api-我可以编写gradle扩展来添加默认意图和运行它们的方式,对其进行版本化,而无需知道任何人的类名。硬编码永远不是正确的答案。
smaudet

1
这个答案也没有找到根包的方法-我也想摆脱包名-例如,从清单中找到它。
smaudet

3

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

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
Goffity

2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}

最佳跑步解决方案
Orgatres '16

1

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

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(" ")
            }
        }
    }
}

这将为您open{variant}完成所有install{variant}任务。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.