【问题标题】:How to retrieve path to ADB in build.gradle如何在 build.gradle 中检索 ADB 的路径
【发布时间】:2014-02-12 20:04:53
【问题描述】:

我试图通过gradletask 启动应用程序。


task runDebug(dependsOn: ['installDebug', 'run']) {
}

task run(type: Exec) {
commandLine 'adb', 'shell', 'am', 'start', '-n', 'com.example.myexample/.ui.SplashScreenActivity'
}

但是这段代码不起作用,我得到错误:
a problem occurred starting process 'command 'adb''

但是,当我明确指定 adb 的路径时,应用程序就会启动。


task run(type: Exec) {
    commandLine 'D:\\android\\android-studio\\sdk\\platform-tools\\adb', 'shell', 'am', 'start', '-n', 'com.example.myexample/.ui.SplashScreenActivity'
}

那么我怎样才能得到一个包含路径的变量并将其传输到commandLine

【问题讨论】:

    标签: android gradle android-studio adb gradlew


    【解决方案1】:

    在 Windows 中,您只需使用以下 .reg 文件为 adb.exe 注册一个 application path

    REGEDIT4
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\adb.exe]
    @="D:\\android\\android-studio\\sdk\\platform-tools\\adb.exe"
    "Path"="D:\\android\\android-studio\\sdk\\platform-tools"
    

    只保留你原来的命令行

    【讨论】:

    • 它有效。您可能只是在编辑注册表后没有重新启动系统。
    • 我试过重启和不重启。也许我做错了,但没关系。我需要一种更通用的方式,以便更轻松地与版本控制系统一起使用。
    【解决方案2】:

    问题解决了。
    变量必须包含

    def adb = "$System.env.ANDROID_HOME/platform-tools/adb"
    

    完成任务的样子

    
    task run(type: Exec) {
        def adb = "$System.env.ANDROID_HOME/platform-tools/adb"
        commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.example.myexample/.ui.SplashScreenActivity'
    }
    

    UPD
    不使用ANDROID_HOME的另一种方法

    
    task run(type: Exec) {
        def rootDir = project.rootDir
        def localProperties = new File(rootDir, "local.properties")
        if (localProperties.exists()) {
            Properties properties = new Properties()
            localProperties.withInputStream { 
                instr -> properties.load(instr)
            }
            def sdkDir = properties.getProperty('sdk.dir')
            def adb = "$sdkDir/platform-tools/adb"
            commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.example.myexample/.ui.SplashScreenActivity'
        }
    }
    

    【讨论】:

    • Kevin 和 Tapemaster 在下面的回答提出了更简单的方法,这些方法也很有效。
    • 这个答案的关键点是“$adb”。 SO 上的语法突出显示没有显示它,但 Gradle 认识到 adb 是一个变量,允许“命令行”函数正常工作。将这一点与 Kevin Brotcke 的答案结合起来,获得通往亚行的道路是一个很好的解决方案。 def adb = android.getAdbExe().toString()commandLine "$adb", 'shell', 'am', 'start', 'com.example.app
    • $System.env.ANDROID_HOME 在我的计算机上为我提供 null,而您的更新版本适用于我,但不适用于我的构建服务器。
    • 这最终对我有用,而且也更简单:def adb = android.sdkDirectory.path + "/platform-tools/adb"
    【解决方案3】:

    您应该使用 Android Gradle 插件已有的逻辑来查找 SDK 和 adb 位置,以确保您的脚本使用相同的位置。

    # Android Gradle >= 1.1.0
    File sdk = android.getSdkDirectory()
    File adb = android.getAdbExe()
    
    # Android Gradle < 1.1.0
    File sdk = android.plugin.getSdkFolder()
    File adb = android.plugin.extension.getAdbExe()
    

    【讨论】:

    • 另外一种方法是通过android.plugin.getSdkInfo().getAdb().toString()(正如我刚刚了解到的那样,getAdbExe() 在内部就是这样做的)。
    • 我在浏览源代码时发现了三四种不同的方式,并选择了一种看起来最简洁的方式。它们看起来都引用了相同的核心逻辑,因此这些示例中的任何一个都应该没问题。
    • 这在 gradle android 插件 1.1.0 之前一直很好用,但现在不行了(我得到 gradle errorCould not find property 'plugin' on com.android.build.gradle.AppExtension_Decorated@1f6dc928.)。 Tapemaster 的回答仍然有效。
    • @Denis 感谢您指出这一点。我已针对最新版本的 Android Gradle 更新了答案。
    • getAdb 已弃用,我正在使用android.getAdbExecutable().absolutePath
    【解决方案4】:
    def androidPlugin = project.plugins.findPlugin("android")
    def adb = androidPlugin.sdkHandler.sdkInfo?.adb
    

    【讨论】:

    • 使用 gradle android 插件 1.1.2 为我工作
    • 上述方法比依赖平台/操作系统依赖关系来解析正在使用的实际 ADB 可执行文件的位置要好得多。它对我来说就像一种魅力。
    • 对我不起作用:错误:(404, 0) 没有这样的属性:sdkHandler 类:com.android.build.gradle.AppPlugin
    【解决方案5】:

    我对这个问题的默认解决方案是将 adb 添加到您的路径变量中,以便您可以在每个路径中使用 adb 命令。
    您可以设置它,例如从这样的控制台:

    set path=%path%;x:\path\to\adb
    

    您也可以通过 UI 进行设置。另请参阅java.com 上的此说明。

    【讨论】:

      【解决方案6】:

      我们可以从 android 扩展中获取 if。

      android.adbExe

      【讨论】:

        猜你喜欢
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2012-07-31
        • 2011-05-09
        • 1970-01-01
        相关资源
        最近更新 更多