作为命令行的爱好者,我想写这个主题已经有好一段时间了。除了显得很酷之外,命令行的使用能够提高我们的开发效率,因为相比通过鼠标点击一系列的菜单选项,使用键盘输入几个字符并点击 TAB 健显然会快很多。

本文的目的是跟大家分享在我的 Android 开发实践中对命令行的运用。

iTerm2

由于我们将会在命令行中进行后续的工作,因此如果能够安装一个比系统默认命令行更好的工具那显然是不错的,那么请下载 iTerm21 吧!

iTerm2 将命令行带入了现代化时代,提供了很多你一直想要的特性。其中包含了窗口拆分,自定义配色方案,剪贴板历史,细粒度的热键控制,以及一系列2你将会逐渐发现的方便的偏好设置。

oh-my-zsh

当你启动命令行应用时,它会运行一个名为 Bash 的 Shell 应用。Bash 是至今为止最流行的存在于绝大多数基于 Unix 的操作系统中的 Shell 应用。然而实际上也存在 Bash 的替代者,它们使得命令行使用起来更快,而且对开发者更友好。

默认情况下,oh-my-zsh 自带了 Git 插件3,它提供了很多 aliases4 以及很多有用的函数5

命令行自动提示

zsh-autosuggestions6类似于 Fish7,为 zsh 提供了快速的自动提示功能,它基于之前的输入历史,在你输入时自动提示命令。

反向智能搜索

你可以通过 Control+R 快捷键实现在命令历史中进行反向智能搜索,从你输入命令开始,zsh 会根据之前输入的命令进行自动补全。然后你可以通过 Enter 键来执行对应的命令,或者通过箭头左键或者右键来编辑命令,或者持续按住 Control+R 快捷键来选择其他的历史命令。

dryrun

当你在 Github 上面看到一个非常酷的函数库时,你将会如何在你的手机上面测试它呢?

  1. 点击 download zip 按钮
  2. 解压下载后的 zip
  3. 打开 Android Studio
  4. 将刚才下载并解压的工程导入 Android Studio 中
  5. 同步 gradle
  6. 运行工程
  7. 选择工程要运行在哪个设备上
  8. 对运行起来的函数库进行测试
  9. 删除不再需要的工程目录和 zip

或者你可以使用 dryrun8

dryrun REMOTE_GIT_URL
  • 1
  • 1

离线构建

--offline 标记能够使得 gradle 始终从缓存中使用依赖的 modules,即使本来它们需要被重新检查是否需要更新。当在离线模式运行时,gradle 不会尝试去网络上面执行依赖解析,如果指定的依赖不在本地缓存中,构建将会失败。

以最快速度执行 develop debug 的命令如下所示:

./gradlew assembleDevelopDebug --offline
  • 1
  • 1

以最快速度执行单元测试的命令如下所示:

./gradlew test --offline
  • 1
  • 1

在 Android Studio 中,我们可以通过如下选项来配置 gradle 以离线模式运行:

Settings -> Build, Execution, Deployment -> Build tools -> Gradle

alfi

作为 Android 开发者,你应该在使用 Android Studio + Gralde 模式进行开发。使用 Android Studio 的一个非常好的特性是它提供的依赖管理,能够自动从指定仓库下载依赖库的 artifacts,并使得你的工程可以使用这个 artifacts。通常情况下,你只需要在工程的 build.gradle 文件中添加一行代码即可包含指定的依赖库,非常简单,不是吗?

那么你知道要添加的依赖库对应的是哪一行代码吗?为了实现快速的查找如何配置这一行代码,我开发了一个名为 alfi 的工具,使用方法很简单:

  1. 输入 alfi 要依赖的函数库名
  2. 拷贝得到的函数库配置信息(就是我们上面说的那一行代码)
  3. 将配置信息拷贝到 build.gradle 中

例如我们输入 alfi picasso,将会得到如下结果:

理解 gradle tasks 的缩写

如果在命令行中执行 ./gradlew tasks 命令,你将会看到一系列可用的 gradle tasks,但它不会列出这些命令的缩写,下面几个你可以使用的例子:

  • iDD 是 installDevelopmentDebug 的缩写
  • aDD 是 assembleDevelopmentDebug 的缩写
  • cC 是 connectedCheck 的缩写
  • etc.

使用缩写,我们可以像下面这样执行命令:

./gradlew :App:iDD
  • 1
  • 1

可以看到我们得到了一个更简短的命令。

Android Rocket Launcher

Android Rocket Launcher9 是一个 gradle 插件,用于给 Android Modules 中所有 variants 的增加安装和启动 APK 的 tasks,因此,无需再运行 ./gradlew installDebug 并到手机中辛辛苦苦找到刚安装的应用并启动它。

在你的项目中引入这个功能,只需要在 build.gradle 文件中增加两行关键代码,如下所示:

apply plugin: 'android-rocket-launcher'

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.cesarferreira:android-rocket-launcher:0.2.3'
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

即使你是从命令行启动应用,你依然可以将当前进程和调试器绑定10,在调试模式不需要重启应用。

将单元测试结果直接输出到控制台中

一个巧妙的能在控制台中看到 Android 单元测试输出的结果日志的方法是在 build.gradle 文件中添加如下代码:

android {
...
testOptions.unitTests.all {
testLogging {
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
outputs.upToDateWhen { false }
showStandardStreams = true
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

配置后运行单元测试就可以看到如下结果:

方便的 logcats

在应用开发中我们经常需要打印出我们应用的日志信息,遗憾的是,由于应用重新部署安装到手机上时,应用的进程 ID 会发生改变,因此想要获取到正确的日志信息变得比较困难。Pidcat11这个工具通过过滤应用的包名而不是应用的进程 ID 解决了这个问题。我们只需要提供应用的包名就可以在控制台中只获取到这个应用的日志信息:

pidcat github.cesarferreira.helloworld
  • 1
  • 1

简而言之

最后,我们将上面介绍的内容概括为以下几个关键点:

  • 安装 iterm2,一个比系统默认更好的命令行
  • 使用 oh-my-zsh 来实现自动提示
  • 使用命令缩写,例如 ./gradlew iDD
  • 使用离线标记 --offline 来更快的执行 gradle 命令
  • 控制台中打印出单元测试的日志
  • 安装应用到手机后,不要手动到手机中找到并打开它,而是使用 android-rocket-launcher 插件自动打开它
  • 将当前进程和调试器绑定,在调试模式不需要重启应用。
  • 使用 pidcat 实现更智能更方便的 logcat

Android 开发命令行完全攻略的更多相关文章

  1. android开发新浪微博客户端 完整攻略 [新手必读]

    开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...

  2. 打造一个高逼格的android开源项目——小白全攻略 (转)

    转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...

  3. android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...

  4. Go使用flag包开发命令行工具

    flag包是Go语言标准库提供用来解析命令行参数的包,使得开发命令行工具更为简单 常用方法 1.flag.Usage 输出使用方法,如linux下ls -h的帮助输出 2.flag.Type(参数名, ...

  5. rocketmq番外篇(一):开发命令行

    匠心零度 转载请注明原创出处,谢谢! 说在前面 虽然是以rocketmq引出的开发命令行,但是任何java应用如果需要都可以借鉴引用,也是通用技术. 主题 rocketmq使用例子 Apache Co ...

  6. 用PHP开发命令行工具

    介绍 用过laravel开发过项目的都应该用过artisan,通过artisan我们可以在命令行中创建控制器类,Eloquent类等,今天我们将通过php来开发命令行工具 开发环境与工具 使用vagr ...

  7. I.MX6 Android CAN 命令行测试

    /********************************************************************* * I.MX6 Android CAN 命令行测试 * 说 ...

  8. Cocos2d-x项目编译为Android应用——命令行方式

    配置: 相关工具:Cocos2d-x 3.2 + Ant 1.9.4 + Android NDK r9d + Android SDK 运行平台:OS X 10.9.4+ Xcode 6 前言:笔者使用 ...

  9. CLI:如何使用Go开发命令行

    CLI或者"command line interface"是用户在命令行下交互的程序.由于通过将程序编译到一个静态文件中来减少依赖,一次Go特别适合开发CLI程序.如果你编写过安装 ...

随机推荐

  1. sqlserver 索引的一些总结【转】

    1.1.1 摘要 如果说要对数据库进行优化,我们主要可以通过以下五种方法,对数据库系统进行优化. 1. 计算机硬件调优 2. 应用程序调优 3. 数据库索引优化 4. SQL语句优化 5. 事务处理调 ...

  2. 带你玩转JavaWeb开发之五-如何完成响应式开发页面

    响应式页面开发 使用BootStrap开发一个响应式的页面出来 响应式开发就是同一个页面在PC端与手机端Pad端显示不同的效果,以给用户更好的体验 需求分析 开发一套页面,让用户能够在PC端, Pad ...

  3. 微信小程序时代已经来临

    昨天估计微信公众号上产生了第一篇最快的30万+文章,10万+只花了10多分钟.就是冯大辉(著名Oracle专家,知名博主)同学的「微信应用号来了」. 为什么这么一篇如此简单又技术类的文章一下能刷遍朋友 ...

  4. 用TPP开启TDD的easy模式

    Test-Drived Development 测试驱动开发三步曲:写一个失败的测试用例->编写生产代码通过这个测试用例(transformation)->重构(refactor).重构是 ...

  5. 保证唯一的一种js提交数据方式,还不错

    <div class="project_right"> <div class="project_title_right" id="m ...

  6. Java:对象的强、软、弱、虚引用

    转自: http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  7. MongoDB的安装和配置成服务的三种方法和一些难点

    1. Hotfix KB2731284 or later update is not installed的问题: If you are running any edition of Windows S ...

  8. 如何查看当前使用的Entity Framework版本

    Visual Studio 中-----工具-----NuGet套件管理员-----套件管理器控制台-----输入Get-Package即可查看当前使用的版本信息

  9. buildroot--uboot&kernel&rootfs全编译工具

    参考: http://www.crifan.com/files/doc/docbook/buildroot_intro/release/html/buildroot_intro.html https: ...

  10. Python之路----------生成器

    一.列表生成式 想想如何创建一个列表[0,1,2,3,4,5] l = [0,1,2,3,4,5] 如果上面的列表元素足够多的话,是不是会写很多代码?看看列表生成式怎么写 #列表生成式 l = [x ...