作为命令行的爱好者,我想写这个主题已经有好一段时间了。除了显得很酷之外,命令行的使用能够提高我们的开发效率,因为相比通过鼠标点击一系列的菜单选项,使用键盘输入几个字符并点击 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. C# 依赖注入

      http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 这篇文章真的非常非常好···绝对值得收藏学习.     目录 目录 1 ...

  2. office 365 online api

    https://view.officeapps.live.com/op/view.aspx?src=http://bookfuns.com/1.ppt

  3. python2.x与3.x差别

    数字常量: 八进制 十六进制 二进制 2:0177 0o177   0x9ff 0b101010 3:0o177 0x9ff 0b101010 多种字符串: 2:一般字符串,Unicode字符串 3: ...

  4. percona-toolkit中在线ddl

    percona-toolkit中在线ddl percona-toolkit工具提供了一组用于mysql操作的工具,比如主从复制,在线更改mysql表ddl等 一.安装1.安装perl(略)2.BI&a ...

  5. java beans

    There are N little kids sitting in a circle, each of them are carrying some java beans in their hand ...

  6. android的程序运行数据存放在哪里?

    Android应用开发中,给我们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 ...

  7. 6. support vector machine

    1. 了解SVM 1. Logistic regression 与SVM超平面 给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类.如果用x表示数据点,用y表示类别( ...

  8. SecureCRT连接VirtualBox下的ubuntu以及NMP的搭建与通过宿主机访问该NGINX服务器过程

    一直使用wamp作为开发环境,只是工作中时常会遇到在wamp下没问题但是提交到服务器生产环境会出现一些意想不到的情况,由此萌生了在本机搭建LNMP环境的想法,我个人不知道其他人的虚拟机搭建服务器环境是 ...

  9. PRML读书笔记——3 Linear Models for Regression

    Linear Basis Function Models 线性模型的一个关键属性是它是参数的一个线性函数,形式如下: w是参数,x可以是原始的数据,也可以是关于原始数据的一个函数值,这个函数就叫bas ...

  10. Leetcode: Ternary Expression Parser

    Given a string representing arbitrarily nested ternary expressions, calculate the result of the expr ...