你能否通过Gradle命令行将应用部署到设备上?

93

这个问题的意思是:您是否可以通过命令行直接向gradlew发出任何命令来构建、打包和部署到设备?


1
gradle tasks 命令有助于查看开箱即用的任务,其中包括安装(但不启动,如下所述)。 - Dori
命令行不是特定于IDE的,即这种方式可以在Android Studio或基于Eclipse的IDE中使用。 - Paul Verest
9个回答

101
$ gradle installDebug

这将把debug版本的apk推送到设备上,但您必须手动启动应用程序。


2
如下,它已被重命名为“gradle installDefaultFlavorDebug”。 - durka42
2
@durka42 只有在使用不同的版本时才会出现这种情况。 - Mathijs Segers
3
我建议使用"./gradlew iD" 而不是 "gradle iD"。 - irudyak
1
能否在Eclipse上安装的Gradle插件中运行此命令?我收到了以下错误信息:“在根项目'blahblah'中找不到任务'installDebug'”。 - Dr.jacky

76

既然您正在使用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中,但不要更改activity:

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


1
另外,如果你的Activity不是在包的根目录下,最后一个参数应该是'com.your.packagename/.path.relative.to.your.packagename.MyActivity',而不是'com.example/.MyActivity' - Light

68

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

# at the root dir of project
$ gradle installDebug

2. 在设备上打开应用

$ adb shell am start -n yourpackagename/.activityname

7
别名 arun="gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity" 可以用来快速安装并启动 Android 应用程序。 - Dominic
我无法在Gradle中选择installDebug。没有适当的任务。它已被重命名了吗? - Jonas Gröger
1
@JonasGröger,它似乎已被重命名为installDefaultFlavorDebug。 - durka42
@rps_deepan你可以重新命名任务吗?因为它已经被重命名了。 - Jonas Gröger
7
别名 arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity" #只有在步骤1成功时才运行步骤2 - Thamme Gowda
值得注意的是,如果您有构建变体(如Android Studio左下角所示),则任务可能会有所不同。对我来说,命令是./gradlew installDevDebug。这也可能会改变包名:am start -n com.example.example_dev/com.example.example.MainActivity。这让我困惑了一段时间。 - bmaddy

7
有三个命令可以完成这个操作:
  1. ./gradlew assembleDebug #构建项目

  2. adb install -r ./app/build/outputs/apk/app-debug.apk #将其安装到设备上

  3. adb shell am start -n $PACKAGE/$PACKAGE.$ACTIVITY #在设备中启动应用程序,其中$PACKAGE是开发包,$ACTIVITY是要启动的活动(启动器活动)。

我已经编写了一个bash脚本来完成这个操作,并添加了其他一些功能。 点击此处查看。

7

一句话概括:

构建项目 & 安装生成的apk文件 & 在设备上打开应用程序

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

4

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

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

4
更灵活的方法是使用monkey:
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 - Vikram Bodicherla
但是如果您不知道您的活动名称呢? - 0xcaff
1
那么你就不应该编写构建文件。 - kevr
3
我认为在构建文件内明确指定要运行的Activity是个糟糕的想法...这似乎违背了关注点分离的原则。一个简单的原因是,如果你重命名或移动了你的Activity文件,那么这就需要更改构建文件。此外,意图(intents)似乎是比文件更好的API来运行程序——我可以编写一个Gradle扩展来添加默认的意图以及运行它们的方式,对其进行版本控制,而无需知道任何人的类名。硬编码从来都不是正确答案。 - smaudet
1
这个答案也缺少找到根包的方法 - 我想摆脱包名 - 例如从清单中发现它。 - smaudet
使用android.intent.category.LAUNCHER 1,@0xcaff,你不需要知道活动。 - m3nda

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

最佳运行解决方案 - Orgatres

2

我编写了这个任务以便能够在设备上安装并打开应用程序。由于我有多个buildTypesflavors,每个都有不同的应用程序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(" ")
            }
        }
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接