Android 开发命令行完全攻略

nd4670 8年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/8f36b7a642f45d2ad644fbfc474ddba2.jpg"></p>    <p>作为命令行的爱好者,我想写这个主题已经有好一段时间了。除了显得很酷之外,命令行的使用能够提高我们的开发效率,因为相比通过鼠标点击一系列的菜单选项,使用键盘输入几个字符并点击 TAB 健显然会快很多。</p>    <p>本文的目的是跟大家分享在我的 Android 开发实践中对命令行的运用。</p>    <p><strong>iTerm2</strong></p>    <p>由于我们将会在命令行中进行后续的工作,因此如果能够安装一个比系统默认命令行更好的工具那显然是不错的,那么请下载 iTerm2 <sup>1</sup> 吧!</p>    <p>iTerm2 将命令行带入了现代化时代,提供了很多你一直想要的特性。其中包含了窗口拆分,自定义配色方案,剪贴板历史,细粒度的热键控制,以及一系列 <sup>2</sup> 你将会逐渐发现的方便的偏好设置。</p>    <p><strong>oh-my-zsh</strong></p>    <p>当你启动命令行应用时,它会运行一个名为 Bash 的 Shell 应用。Bash 是至今为止最流行的存在于绝大多数基于 Unix 的操作系统中的 Shell 应用。然而实际上也存在 Bash 的替代者,它们使得命令行使用起来更快,而且对开发者更友好。</p>    <p>默认情况下,oh-my-zsh 自带了 git 插件 <sup>3</sup> ,它提供了很多 aliases <sup>4</sup> 以及很多有用的函数 <sup>5</sup> 。</p>    <p><strong>命令行自动提示</strong></p>    <p>zsh-autosuggestions <sup>6</sup> 类似于 Fish <sup>7</sup> ,为 zsh 提供了快速的自动提示功能,它基于之前的输入历史,在你输入时自动提示命令。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c0bbb3fd1a9925a9a117f55d5d650de9.gif"></p>    <p><strong>反向智能搜索</strong></p>    <p>你可以通过 Control+R 快捷键实现在命令历史中进行反向智能搜索,从你输入命令开始,zsh 会根据之前输入的命令进行自动补全。然后你可以通过 Enter 键来执行对应的命令,或者通过箭头左键或者右键来编辑命令,或者持续按住 Control+R 快捷键来选择其他的历史命令。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c112d345e10cf4cf8d772f86e50d2f9b.gif"></p>    <p><strong>dryrun</strong></p>    <p>当你在 Github 上面看到一个非常酷的函数库时,你将会如何在你的手机上面测试它呢?</p>    <ol>     <li> <p>点击  download zip 按钮</p> </li>     <li> <p>解压下载后的  zip 包</p> </li>     <li> <p>打开 Android Studio</p> </li>     <li> <p>将刚才下载并解压的工程导入 Android Studio 中</p> </li>     <li> <p>同步 gradle</p> </li>     <li> <p>运行工程</p> </li>     <li> <p>选择工程要运行在哪个设备上</p> </li>     <li> <p>对运行起来的函数库进行测试</p> </li>     <li> <p>删除不再需要的工程目录和  zip 包</p> </li>    </ol>    <p>或者你可以使用 dryrun <sup>8</sup> :</p>    <pre>  <code class="language-java">dryrun REMOTE_GIT_URL</code></pre>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/cd34895bf0ecb0977eeb77dd5aecd0ae.gif"></p>    <p><strong>离线构建</strong></p>    <p>--offline 标记能够使得 gradle 始终从缓存中使用依赖的 modules,即使本来它们需要被重新检查是否需要更新。当在离线模式运行时,gradle 不会尝试去网络上面执行依赖解析,如果指定的依赖不在本地缓存中,构建将会失败。</p>    <p>以最快速度执行  develop debug 的命令如下所示:</p>    <pre>  <code class="language-java">./gradlew assembleDevelopDebug --offline</code></pre>    <p>以最快速度执行单元测试的命令如下所示:</p>    <pre>  <code class="language-java">./gradlew test --offline</code></pre>    <p>在 Android Studio 中,我们可以通过如下选项来配置 gradle 以离线模式运行:</p>    <p>Settings -&gt; Build, Execution, Deployment -&gt; Build tools -&gt; Gradle</p>    <p><img src="https://simg.open-open.com/show/6edb260221c5fd65beef63f683b23ee1.jpg"> <strong>alfi</strong></p>    <p>作为 Android 开发者,你应该在使用 Android Studio + Gralde 模式进行开发。使用 Android Studio 的一个非常好的特性是它提供的依赖管理,能够自动从指定仓库下载依赖库的 artifacts,并使得你的工程可以使用这个 artifacts。通常情况下,你只需要在工程的 build.gradle 文件中添加一行代码即可包含指定的依赖库,非常简单,不是吗?</p>    <p>那么你知道要添加的依赖库对应的是哪一行代码吗?为了实现快速的查找如何配置这一行代码,我开发了一个名为 alfi 的工具,使用方法很简单:</p>    <ol>     <li> <p>输入  alfi 要依赖的函数库名</p> </li>     <li> <p>拷贝得到的函数库配置信息(就是我们上面说的那一行代码)</p> </li>     <li> <p>将配置信息拷贝到 build.gradle 中</p> </li>    </ol>    <p>例如我们输入  alfi picasso ,将会得到如下结果:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e0f04e1cf79c0a290f8bf1ca7cbd2bef.gif"></p>    <p><strong>理解 gradle tasks 的缩写</strong></p>    <p>如果在命令行中执行  ./gradlew tasks 命令,你将会看到一系列可用的 gradle tasks,但它不会列出这些命令的缩写,下面几个你可以使用的例子:</p>    <ul>     <li> <p>iDD 是 installDevelopmentDebug 的缩写</p> </li>     <li> <p>aDD 是 assembleDevelopmentDebug 的缩写</p> </li>     <li> <p>cC 是 connectedCheck 的缩写</p> </li>     <li> <p>etc.</p> </li>    </ul>    <p>使用缩写,我们可以像下面这样执行命令:</p>    <pre>  <code class="language-java">./gradlew :App:iDD</code></pre>    <p>可以看到我们得到了一个更简短的命令。</p>    <p><strong>Android Rocket Launcher</strong></p>    <p>Android Rocket Launcher <sup>9</sup> 是一个 gradle 插件,用于给 Android Modules 中所有 variants 的增加安装和启动 APK 的 tasks,因此,无需再运行  ./gradlew installDebug 并到手机中辛辛苦苦找到刚安装的应用并启动它。</p>    <p><img src="https://simg.open-open.com/show/f105ac921cbaa61c156f71360964ac4a.jpg"> 在你的项目中引入这个功能,只需要在  build.gradle  文件中增加两行关键代码,如下所示:</p>    <pre>  <code class="language-java">apply plugin: 'android-rocket-launcher'buildscript {      repositories {          jcenter()      }      dependencies {          classpath 'com.cesarferreira:android-rocket-launcher:0.2.3'      }  }</code></pre>    <p>即使你是从命令行启动应用,你依然可以将当前进程和调试器绑定 <sup>10</sup> ,在调试模式不需要重启应用。</p>    <p><strong>将单元测试结果直接输出到控制台中</strong></p>    <p>一个巧妙的能在控制台中看到 Android 单元测试输出的结果日志的方法是在 build.gradle 文件中添加如下代码:</p>    <pre>  <code class="language-java">android {    ...    testOptions.unitTests.all {      testLogging {        events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'        outputs.upToDateWhen { false }        showStandardStreams = true      }    }  }</code></pre>    <p>配置后运行单元测试就可以看到如下结果:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c3aa9df54b964338e5c38dbc24e4dbdf.jpg"></p>    <p><strong>方便的 logcats</strong></p>    <p>在应用开发中我们经常需要打印出我们应用的日志信息,遗憾的是,由于应用重新部署安装到手机上时,应用的进程 ID 会发生改变,因此想要获取到正确的日志信息变得比较困难。Pidcat <sup>11</sup> 这个工具通过过滤应用的包名而不是应用的进程 ID 解决了这个问题。我们只需要提供应用的包名就可以在控制台中只获取到这个应用的日志信息:</p>    <pre>  <code class="language-java">pidcat github.cesarferreira.helloworld</code></pre>    <p><img src="https://simg.open-open.com/show/a1e9994bc203fc8703715d450a3000a5.jpg"></p>    <p><strong>简而言之</strong></p>    <p>最后,我们将上面介绍的内容概括为以下几个关键点:</p>    <ul>     <li> <p>安装 iterm2,一个比系统默认更好的命令行</p> </li>     <li> <p>使用 oh-my-zsh 来实现自动提示</p> </li>     <li> <p>使用命令缩写,例如  ./gradlew iDD</p> </li>     <li> <p>使用离线标记  --offline 来更快的执行 gradle 命令</p> </li>     <li> <p>控制台中打印出单元测试的日志</p> </li>     <li> <p>安装应用到手机后,不要手动到手机中找到并打开它,而是使用 android-rocket-launcher 插件自动打开它</p> </li>     <li> <p>将当前进程和调试器绑定,在调试模式不需要重启应用。</p> </li>     <li> <p>使用 pidcat 实现更智能更方便的 logcat</p> </li>    </ul>    <p> </p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s/ZQx6nJSLPdieRY7uf5i5Iw</p>    <p> </p>