原文:http://mrhaki.blogspot.com/2017/04/gradle-goodness-enable-build-cache-for.html

Gradle 3.5 引入了构建缓存特性。通过构建缓存,我们可以在不同的电脑之间,不同的builds之间,共享Task输出结果。举个例子,持续集成服务器上构建的输出,可以在开发者的电脑上复用。要启用这项特性,我们只需要添加命令行选项--build-cache。或者,我们还可以我们工程下的gradle.properties文件中,将org.gradle.caching属性设置为true。为了对所有工程都启用构建缓存特性,我们可以在Gradle主目录下的gradle.properties文件( USER_HOME/.gradle/gradle.properties)中设置这个属性。

在下面的例子中,我们在~/.gradle/gradle.properties文件中设置org.gradle.caching属性:

1
2
# File: ~/.gradle/gradle.properties
org.gradle.caching=true

如果我们想禁用这项特性,我们可以添加命令行选项--no-build-cache

基于 Gradle 3.5 编写。

联系方式

sn0wdr1am

原文:http://mrhaki.blogspot.com/2016/12/gradle-goodness-run-task-ignoring-up-to.html

Gradle构建很快,是因为支持增量任务。简单来说,Gradle可以在运行Task前,就知道Task的输入和输出是否改变。如果什么都没有改变,那么这个Task将会被标记为up-to-date,并且不会被执行,否则则会被执行。如果不管一个Task是否是up-to-date,我们都希望能够运行它,此时我们需要增加一个命令行选项--rerun-tasks

在下面的例子中,我们为一个简单的Java工程,运行assemble任务,可以看到所有的task都运行了。当我们再次运行此Task的时候,我们看到所有的task都提示“up-to-date”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ gradle assemble
:compileJava
:processResources
:classes
:jar
:assemble
BUILD SUCCESSFUL
Total time: 1.765 secs
$ gradle assemble
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
BUILD SUCCESSFUL
Total time: 0.715 secs
$

为了忽略up-to-date检查,强制执行所有task,我们需要添加这个选项 –rerun-tasks:

1
2
3
4
5
6
7
8
9
10
11
$ gradle --rerun-tasks assemble
:compileJava
:processResources
:classes
:jar
:assemble
BUILD SUCCESSFUL
Total time: 1.037 secs
$

基于Gradle 3.2.1编写。

联系方式

sn0wdr1am

原文: http://mrhaki.blogspot.com/2017/02/gradle-goodness-check-operating-system.html

有时候,我们想检测下构建脚本在哪个操作系统上执行。举个例子,比如我们有一些Task,需要在Windows操作系统上执行,但是不在其他操作系统上执行。Gradle有一个内部的类org.gradle.nativeplatform.platform.internal.DefaultOperatingSystem,但是我们不应该在构建脚本中使用这个类。Gradle在内部使用这个类,并且可能毫无警告地修改它。如果我们依赖这个类,一旦这个类被修改了,我们的构建脚本可能无法正常运行。但是,我们可以使用一个来自Ant的类(org.apache.tools.ant.taskdefs.condition.Os)。这个类包含各种方法和变量,来检测操作系统名称,版本和架构。 这些取值都基于Java的系统变量,包括os.name, os.version 和 os.arch.

在下面的例子中,为了我们稍后能够直接调用这个类的方法和引用这个类的常量,我们在构建脚本中静态引入这个Os类。 我们添加了几个基于onlyif条件的Task。只有当onlyif条件为true时,Task才会被执行。Task osInfo则简单显示了当前操作系统的一些属性值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// File: build.gradle
import static org.apache.tools.ant.taskdefs.condition.Os.*
task os {
description 'Run all conditional os tasks'
}
// Create 3 tasks that simply print
// the task name that is executed
// if the build scripts runs on the
// recognized operating system.
[FAMILY_WINDOWS, FAMILY_UNIX, FAMILY_MAC].each { osName ->
// Create task.
tasks.create(osName) {
description "Run when OS is ${osName}"
// Add condition to check operating system.
onlyIf { isFamily(osName) }
doLast {
println "Execute task '${it.name}'"
}
}
// Add task as dependency for the os task.
os.dependsOn osName
}
task osInfo {
description 'Show information about the operating system'
doLast {
println "Family: ${OS_NAME}"
println "Version: ${OS_VERSION}"
println "Architecture: ${OS_ARCH}"
}
}

接下来,让我们在MacOS上运行这些Task: os and osInfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ gradle os osInfo
mac
Execute task 'mac'
:unix
Execute task 'unix'
:windows SKIPPED
:os
:osInfo
Family: mac os x
Version: 10.12.3
Architecture: x86_64
BUILD SUCCESSFUL
Total time: 0.697 secs

基于Gradle 3.3编写。

联系方式

sn0wdr1am

原文: http://mrhaki.blogspot.com/2017/02/gradle-goodness-skip-task-when-input.html

Gradle 能够很好的支持增量构建。这就是说,Gradle可以根据Task的输入和输出来决定一个Task是否需要被执行。举个例子,假如输入和输出文件没有任何改变,那么这个Task将会被跳过。通过定义Task的输入和输出,可以让我们自定义的Task也支持增量构建。我们还可以定义一个Task,当它的输入文件集合/文件夹不存在或者为空时,跳过不执行。Gradle提供了一个注解@SkipWhenEmpty,我们可以应用于Task的输入。

下面的例子,我们将会定义一个DisplayTask,用于打印一个文件夹下所有文件的内容。当这个文件夹为空时,我们希望跳过这个Task,不执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
task display(type:DisplayTask) {
contentDir = file('src/content')
}
class DisplayTask extends DefaultTask {
@SkipWhenEmpty
@InputDirectory
File contentDir
DisplayTask() {
description = 'Show contents of files'
}
@TaskAction
void printMessages() {
contentDir.eachFile { file ->
println file.text
}
}
}

当输入文件夹下没有任何文件时,我们运行这个Task,将会在终端看到 NO-SOURCE 字样。如果我们不添加这个注解@SkipWhenEmpty,这个构建任务将会失败。

1
2
3
4
5
6
$ gradle display
:display NO-SOURCE
BUILD SUCCESSFUL
Total time: 0.866 secs

接下来,我们在这个文件夹(src/content)下添加一个文件,然后再次运行这个Task:

1
2
3
4
5
6
7
8
$ gradle display
:display
Gradle rocks!
BUILD SUCCESSFUL
Total time: 0.866 secs

使用Gradle 3.4编写。

联系方式

sn0wdr1am

翻译自: http://mrhaki.blogspot.com/2017/03/gradle-goodness-create-shortcut-key-to.html

我们可以在IntelliJ IDEA中打开一个Gradle工程,并且获得IntelliJ对Gradle的原生支持。当我们在Gradle build文件中添加一个新的依赖或者插件时,需要在 IntelliJ IDEA中刷新工程。我们需要刷新这个Gradle工程,来保证IntelliJ IDEA 能够同步这些改变。Gradle工具栏有一个Icon,点击它可以刷新所有Gradle工程。但是这样做,意味着我们需要移动鼠标,而我们现在需要一个快捷键来完成这些操作,这样,我们就不需要把手移开键盘。

刷新所有Gradle项目的操作,实际上是刷新所有外部功能的操作。我们可以通过 Preferences | Keymap 来添加键盘快捷键。我们在搜索栏搜索“refresh all external”来找到这个动作。

idea-refresh-gradle-keymap.png

我们可以右键点击这个Action,然后选择“Keyboard Shortcut”来定义新的键盘快捷键。

现在当我们修改Gradle build文件时,我们可以简单的使用快捷键来刷新Gradle工程。

下面我们介绍如何将这个刷新Gradle工程的Action添加到工具栏。右键点击工具栏,并且选择“option Customize Menus and Toolbars…. ”。现在可以将”Refresh all external projects”添加到工具栏:

idea-refresh-gradle-keymap-assign.png

联系方式

sn0wdr1am

在Gradle下,我们可以通过由Java插件添加的测试任务,来运行单元测试代码。默认情况下,项目下的所有单元测试代码都会执行。但是,如果我们只想运行一个简单的单元测试,我们可以通过Java系统属性test.single来制定这个单元测试的名字。实际上,系统属性的样式是taskName.single. 其中taskName是项目下测试类任务的名称。下面我们将展示在构建中如何实践的:

首先,我们创建一个简单的build.gradle文件,用来运行单元测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// File: build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:[4,)'
}
test {
testLogging {
// Show that tests are run in the command-line output
events 'started', 'passed'
}
}

下一步,我们创建两个测试类,每个测试类包含一个简单的单元测试方法。稍后,我们会演示,如何运行其中的一个单元测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
// File: src/test/java/com/mrhaki/gradle/SampleTest.java
package com.mrhaki.gradle;
import static org.junit.Assert.*;
import org.junit.*;
public class SampleTest {
@Test public void sample() {
assertEquals("Gradle is gr8", "Gradle is gr8");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
// File: src/test/java/com/mrhaki/gradle/AnotherSampleTest.java
package com.mrhaki.gradle;
import static org.junit.Assert.*;
import org.junit.*;
public class AnotherSampleTest {
@Test public void anotherSample() {
assertEquals("Gradle is great", "Gradle is great");
}
}

为了只运行SampleTest,我们需要在终端执行test任务的时候,添加一个Java系统属性 -Dtest.single=Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gradle -Dtest.single=Sample test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
com.mrhaki.gradle.SampleTest > sample STARTED
com.mrhaki.gradle.SampleTest > sample PASSED
BUILD SUCCESSFUL
Total time: 11.404 secs

请注意,现在只有一个单元测试执行了。Gradle将会获取Sample的值,并且按照下面的样式 **/<Java system property value=Sample>*.class去查找单元测试类。因此,我们不需要输入单元测试的完整包名和类名。而为了仅仅执行AnotherSampleTest单元测试类,我们可以通过改变这个Java系统属性(test.single)来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gradle -Dtest.single=AnotherSample test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
com.mrhaki.gradle.AnotherSampleTest > anotherSample STARTED
com.mrhaki.gradle.AnotherSampleTest > anotherSample PASSED
BUILD SUCCESSFUL
Total time: 5.62 secs

我们还可以使用Java系统样式来执行多个单元测试。例如:我们可以使用*Sample来同时运行 SampleTest 和A notherSampleTest。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ gradle -Dtest.single=*Sample test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
com.mrhaki.gradle.AnotherSampleTest > anotherSample STARTED
com.mrhaki.gradle.AnotherSampleTest > anotherSample PASSED
com.mrhaki.gradle.SampleTest > sample STARTED
com.mrhaki.gradle.SampleTest > sample PASSED
BUILD SUCCESSFUL
Total time: 5.605 secs

为了展示对于其他类型的测试任务,这种Java系统属性都有效。我们在build.gradle 文件中添加了一个新的任务。我们命名这个测试任务为sampleTest,包含了我们所有的测试类。我们同样应用了和之前一样的testLogging设置,方便跟踪单元测试输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// File: build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:[4,)'
}
task sampleTest(type: Test, dependsOn: testClasses) {
include '**/*Sample*'
}
tasks.withType(Test) {
testLogging {
events 'started', 'passed'
}
}

下面我们值运行SampleTest测试类,但是我们换一种方式使用Java系统属性 -DsampleTest.single=S*:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gradle -DsampleTest.single=S* sampleTest
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:sampleTest
com.mrhaki.gradle.SampleTest > sample STARTED
com.mrhaki.gradle.SampleTest > sample PASSED
BUILD SUCCESSFUL
Total time: 10.677 secs

实例使用 Gradle 1.6 编写。

联系方式

sn0wdr1am

一提到Docker,你可能想到云服务,运维等等。
今天,我们要谈谈Docker的本地应用,如何基于Docker和Debian打造一款个人专属操作系统。

简介

一个Docker镜像运行起来就相当于一个没有桌面的Linux系统。

现在,我们给一个基于Debian的Docker镜像,加上Mate桌面,就成了一个完整的Linux操作系统了。

为了保证我们可以通过网络来访问这个系统,我们再安装上OpenSSH和X2GO。

这样,一款基本的个人专属操作系统就完成了。当然,你可以在这个基础上,增加常用的软件,打造自己的个人专属操作系统。

构成

主要包含以下几个部分:

  • Debian jessie
  • Mate Desktop
  • Openssh-server
  • X2goserver

下载 && 安装

1. snowdream/desktop

下载Docker镜像:

1
docker pull snowdream/desktop

2. X2Go 客户端

以mac为例,其他参考: http://wiki.x2go.org/doku.php/doc:installation:x2goclient

先下载安装XQuartz-2.7.11.dmg(https://www.xquartz.org)

再下载安装x2goclient (https://code.x2go.org/releases/binary-macosx/x2goclient/releases/4.1.0.0/)

运行

1. 启动snowdream/desktop

通过以下Docker命令,启动镜像。
请留意提示的root和dockerx用户的密码,并记录下来。

1
2
CID=$(docker run -p 2222:22 -t -d snowdream/desktop)
docker logs $CID

2. 通过ssh访问

通过以下终端命令,连接上面的镜像。
密码见前面的提示。

1
ssh root@localhost -p 2222

3. 通过x2go访问桌面

  1. 启动x2go客户端
  2. 配置x2go客户端

点击主界面工具栏第三个按钮,看看全局设置中,XQuartz的路径和版本是否正确。

配置x2go客户端

接着,按照下面提示,创建一个会话。

其中,Host为主机IP,Login为用户名,SSH port为ssh端口,
底部的会话桌面选择Mate。

配置x2go客户端

3.启动会话,连接桌面。

联系方式

sn0wdr1am

在Gradle中运行单元测试很简单。一般情况下,如果有一个单元测试CASE执行失败,也会导致构建失败。但是我们却不能立刻在控制台看到为什么这个单元测试失败。我们需要先打开生成的HTML格式的测试报告。现在我们还有其他办法。

首先,我们创建一个下面的Gradle build文件:

1
2
3
4
5
6
7
8
9
10
// File: build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:[4,)'
}

然后,我们使用下面的Junit单元测试。注意,这个单元测试一直会失败,因为这就是我们想要的CASE场景。

1
2
3
4
5
6
7
8
9
10
11
12
// File: src/test/java/com/mrhaki/gradle/SampleTest.java
package com.mrhaki.gradle;
import org.junit.*;
public class SampleTest {
@Test public void sample() {
Assert.assertEquals("Gradle is gr8", "Gradle is great");
}
}

我们通过执行test任务,来运行单元测试。如果我们运行这个任务,我们发现控制台显示哪一行单元测试失败了,但是我们却看不到单元测试失败的具体原因:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
com.mrhaki.gradle.SampleTest > sample FAILED
org.junit.ComparisonFailure at SampleTest.java:8
1 test completed, 1 failed
:test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/gradle/testlogging/build/reports/tests/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 4.904 secs

我们可以再次运行test任务,但是现在我们通过添加命令行选项-i 或者 –info来设置Gradle日志级别到info。现在我们可以在终端看到单元测试失败的具体原因了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ gradle test -i
Starting Build
Settings evaluated using empty settings script.
Projects loaded. Root project using build file
...
Successfully started process 'Gradle Worker 1'
Gradle Worker 1 executing tests.
Gradle Worker 1 finished executing tests.
com.mrhaki.gradle.SampleTest > sample FAILED
org.junit.ComparisonFailure: expected:<gradle is gr[8]> but was:<gradle is gr[eat]>
at org.junit.Assert.assertEquals(Assert.java:115)
at org.junit.Assert.assertEquals(Assert.java:144)
at com.mrhaki.gradle.SampleTest.sample(SampleTest.java:8)
Process 'Gradle Worker 1' finished with exit value 0 (state: SUCCEEDED)
1 test completed, 1 failed
Finished generating test XML results (0.025 secs)
Generating HTML test report...
Finished generating test html results (0.027 secs)
:test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/gradle/testlogging/build/reports/tests/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.
BUILD FAILED
Total time: 5.117 secs

但是这样做仍然会产生很多干扰的日志。最好的办法就是通过配置test任务来自定义单元测试日志级别。我们可以配置不同的日志级别。为了获取单元测试失败的具体原因我们可以仅仅将exceptionFormat设置为full。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// File: build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:[4,)'
}
test {
testLogging {
exceptionFormat = 'full'
}
}

我们可以再次运行test任务,并且使用正常的日志级别,但是这次,我们依然能够看到单元测试失败的具体原因,而没有其他的干扰日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
com.mrhaki.gradle.SampleTest > sample FAILED
org.junit.ComparisonFailure: expected:<gradle is gr[8]> but was:<gradle is gr[eat]>
at org.junit.Assert.assertEquals(Assert.java:115)
at org.junit.Assert.assertEquals(Assert.java:144)
at com.mrhaki.gradle.SampleTest.sample(SampleTest.java:8)
1 test completed, 1 failed
:test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/gradle/testlogging/build/reports/tests/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 5.906 secs

实例使用 Gradle 1.6 编写。

联系方式

sn0wdr1am

作者:snowdream
Email:yanghui1986527#gmail.com
Github: https://github.com/snowdream
QQ 群: 529327615
原文地址:https://snowdream.github.io/blog/2016/11/27/gradle-issues-with-android/

现在,大家都慢慢开始习惯使用Android Studio来开发Android应用了。
在使用过程中,难免碰到一些Gralde相关的使用问题。下面总结我收集整理的一些碰到的问题,以及解决方案:

1. 问题: Maven源仓库不可用,或者访问,下载非常慢。

分析: 由于主要的仓库Maven,Jcenter都在国外,以及众所周知的原因,这些Maven仓库可能比较慢。而我们从新建/导入工程开始,就要和Maven源仓库进行交互,因此,这可能导致我们导入或者打开工程非常的缓慢。

解决方案

  1. 优先使用国内Maven仓库镜像。推荐:阿里云Maven仓库镜像

    1
    maven { url “http://maven.aliyun.com/mvn/repository/“ }
  2. 使用http协议访问Maven仓库。使用下面的仓库来替换默认的 jcenter() 和 mavenCentral()

    1
    2
    jcenter { url “http://jcenter.bintray.com/"}
    maven { url “http://repo1.maven.org/maven2"}
  3. 如果你的项目不需要频繁从Maven仓库更新/下载组件,那么强烈建议你打开offline模式。

2. 问题: Android Studio导入工程非常慢,甚至卡死在导入阶段。

分析:Android Studio导入工程,默认会采用Gradle Wrapper的方式。也就是当你在本地没有下载过相应版本的Gradle,在导入工程前,就会去尝试下载相应版本的Gradle。

关于Gradle Wrapper的配置文件,在项目根目录下gradle/wrapper下。通常是两个文件:gradle-wrapper.jar和gradle-wrapper.properties

我们来看看gradle-wrapper.properties文件:

1
2
3
4
5
6
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

没错,如果你之前没有通过Gradle Wrapper方式下载过这个版本Gradle,那么你导入工程后,第一件事情就是通过distributionUrl去下载gradle。然而,我们从这个来自Gradle官方的下载地址下载是非常慢的。

解决方案
1.搭建局域网HTTP服务器,镜像Gradle主流版本安装包。
参考:腾讯的方案:http://android-mirror.bugly.qq.com:8080/gradle/

2.在项目根目录build.gradle配置一个gradle wrapper任务。

1
2
3
4
task wrapper(type: Wrapper) {
gradleVersion = '3.1'
distributionUrl = "http://android-mirror.bugly.qq.com:8080/gradle/gradle-${gradleVersion}-bin.zip"
}

其中:gradleVersion对应gradle版本号,而distributionUrl则是对应版本的Gradle安装包下载地址。

3.在根目录下执行gradle wrapper 命令,然后将根目录下的gradle目录提交至git仓库。

3. 问题: 导入工程后,在Gradle Sync阶段卡死。

具体表现为:你以前已经在Android Studio中打开该工程,但是当你升级了本地Gradle版本,又或者使用Intellij IDEA打开,你会发现导入很慢。即使进去主界面,Gradle Sync也会处于假死状态,好像一直在加载什么。。。

分析: 不明

解决方案:根据网上的建议,排除以上原因之后,你可以这么干:删除工程下的.gradle文件夹,然后重新导入工程。

作者:snowdream
Email:yanghui1986527#gmail.com
Github: https://github.com/snowdream
QQ 群: 529327615
原文地址:https://snowdream.github.io/blog/2016/10/27/wifi-adb-without-usb/

简介

大家在开发调试Android应用的时候,都需要使用USB连接电脑和测试手机。
那么如何通过WIFI来连接电脑和测试手机呢?

通常的做法是这样:
安装idea插件AndroidWiFiADB。通过这个插件,只需要用USB连接一次电脑和测试手机,之后就可以只通过WIFI来连接了。

那么有没有方法,完全通过WIFI来进行连接呢?
下面就要介绍这样一款工具:WIFIADB

前提

Android手机需要Root

安装

WIFIADBIntelliJPlugin

在Idea/Android studio插件安装对话框输入“WIFI ADB ULTIMATE”,安装插件,然后重启IDE。
WIFIADBIntelliJPlugin

WIFIADBAndroid

  1. 点击,下载安装WIFIADBANDROID-RELEASE-1.0.APK
  2. 测试手机连接wifi
  3. 启动应用,点击主界面中间的圆形按钮。如果启动成功,底部会提示IP地址和端口号。
    WIFIADBAndroid

运行

在Idea/Android studio界面右侧,点击标签““WIFI ADB ULTIMATE””,输入IP地址和端口号,点击“Connect”即可。

WIFI ADB ULTIMATEWIFI ADB ULTIMATE

参考

  1. WIFIADB
  2. AndroidWiFiADB
  3. ADBWIFI

Fork me on GitHub