<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>A simple adb client written in rust.</title>
<style>
.vscode-dark img[src$=\#gh-light-mode-only],
.vscode-light img[src$=\#gh-dark-mode-only],
.vscode-high-contrast:not(.vscode-high-contrast-light) img[src$=\#gh-light-mode-only],
.vscode-high-contrast-light img[src$=\#gh-dark-mode-only] {
display: none;
}
</style>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif;
font-size: 14px;
line-height: 1.6;
}
</style>
<style>
.task-list-item {
list-style-type: none;
}
.task-list-item-checkbox {
margin-left: -20px;
vertical-align: middle;
pointer-events: none;
}
</style>
<style>
:root {
--color-note: #0969da;
--color-tip: #1a7f37;
--color-warning: #9a6700;
--color-severe: #bc4c00;
--color-caution: #d1242f;
--color-important: #8250df;
}
</style>
<style>
@media (prefers-color-scheme: dark) {
:root {
--color-note: #2f81f7;
--color-tip: #3fb950;
--color-warning: #d29922;
--color-severe: #db6d28;
--color-caution: #f85149;
--color-important: #a371f7;
}
}
</style>
<style>
.markdown-alert {
padding: 0.5rem 1rem;
margin-bottom: 16px;
color: inherit;
border-left: .25em solid #888;
}
.markdown-alert>:first-child {
margin-top: 0
}
.markdown-alert>:last-child {
margin-bottom: 0
}
.markdown-alert .markdown-alert-title {
display: flex;
font-weight: 500;
align-items: center;
line-height: 1
}
.markdown-alert .markdown-alert-title .octicon {
margin-right: 0.5rem;
display: inline-block;
overflow: visible !important;
vertical-align: text-bottom;
fill: currentColor;
}
.markdown-alert.markdown-alert-note {
border-left-color: var(--color-note);
}
.markdown-alert.markdown-alert-note .markdown-alert-title {
color: var(--color-note);
}
.markdown-alert.markdown-alert-important {
border-left-color: var(--color-important);
}
.markdown-alert.markdown-alert-important .markdown-alert-title {
color: var(--color-important);
}
.markdown-alert.markdown-alert-warning {
border-left-color: var(--color-warning);
}
.markdown-alert.markdown-alert-warning .markdown-alert-title {
color: var(--color-warning);
}
.markdown-alert.markdown-alert-tip {
border-left-color: var(--color-tip);
}
.markdown-alert.markdown-alert-tip .markdown-alert-title {
color: var(--color-tip);
}
.markdown-alert.markdown-alert-caution {
border-left-color: var(--color-caution);
}
.markdown-alert.markdown-alert-caution .markdown-alert-title {
color: var(--color-caution);
}
</style>
</head>
<body class="vscode-body vscode-light">
<h3 id="a-simple-adb-client-written-in-rust">A simple adb client written in rust.</h3>
<p>===========================</p>
<p>ADBCmd can be executed using synchronous execution commands, and can also be executed using asynchronous, callback function closure methods.</p>
<p>目前,这个库主要用于在Rust中调用 “cmd” 的命令,包含一些实用的API。</p>
<ul>
<li><strong>new()</strong>: 创建一个ADBCmd实例,返回一个ADBCmd实例。</li>
<li><strong>create_adb_cmd()</strong>: 创建一个异步的(基于tokio::process:Command)的Command实例,返回Command的实例,</li>
<li><strong>run_async()</strong>: 运行一个异步的命令,通过传入回调参数的形式,实时获取Command的输出</li>
<li><strong>run()</strong>:运行一个同步的命令(基于std::process::Command),获取当前同步命令的输出,返回一个Result<String, String></li>
<li><strong>get_file_path()</strong>: 获取传入路径的文件路径,如果不存在则返回错误信息,返回一个Result<String, String></li>
</ul>
<h3 id="使用方法">使用方法</h3>
<pre><code class="language-toml">///cargo.toml
<span class="hljs-section">[dependencies]</span>
<span class="hljs-attr">tokio</span> = { version = <span class="hljs-string">"1.0"</span>, features = [<span class="hljs-string">"full"</span>] }
<span class="hljs-attr">adb-rust</span>=<span class="hljs-string">"0.1.6"</span>
</code></pre>
<ul>
<li>调用</li>
</ul>
<pre><code class="language-rust"><span class="hljs-keyword">use</span> adb_rust::cmd::{ADBCmd, ADBCmdResult}
<span class="hljs-keyword">pub</span> <span class="hljs-keyword">fn</span> <span class="hljs-title function_">push_xml_file</span>(){
<span class="hljs-keyword">let</span> <span class="hljs-variable">file</span>:&<span class="hljs-type">str</span>= <span class="hljs-string">"./resources/file.xml"</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">paths</span>:<span class="hljs-type">String</span> = ADBCmd::<span class="hljs-title function_ invoke__">get_file_path</span>(file).<span class="hljs-title function_ invoke__">unwrap</span>();
<span class="hljs-keyword">let</span> <span class="hljs-variable">args</span>:<span class="hljs-type">Vec</span><&<span class="hljs-type">String</span>> = <span class="hljs-built_in">vec!</span>[<span class="hljs-string">"push"</span>.<span class="hljs-title function_ invoke__">to_string</span>(),&paths,<span class="hljs-string">"/sdcard/"</span>.<span class="hljs-title function_ invoke__">to_string</span>()];
<span class="hljs-keyword">let</span> <span class="hljs-variable">res</span>:<span class="hljs-type">Result</span><<span class="hljs-type">String</span>, <span class="hljs-type">String</span>> = ADBCmd::<span class="hljs-title function_ invoke__">new</span>(<span class="hljs-string">"adb"</span>,<span class="hljs-literal">true</span>).<span class="hljs-title function_ invoke__">run</span>(args);
...
...
}
</code></pre>
<h3 id="api">APi</h3>
<pre><code class="language-rust"><span class="hljs-keyword">pub</span> <span class="hljs-keyword">mod</span> tests {
<span class="hljs-keyword">use</span> crate::cmd::{ADBCmd, ADBCmdTrait};
<span class="hljs-keyword">use</span> super::*;
<span class="hljs-keyword">use</span> tokio;
<span class="hljs-meta">#[test]</span>
<span class="hljs-keyword">fn</span> <span class="hljs-title function_">test_adb_cmd</span>() {
<span class="hljs-keyword">let</span> <span class="hljs-variable">res</span> = cmd::ADBCmd::<span class="hljs-title function_ invoke__">get_file_path</span>(<span class="hljs-string">"./resources/file.xml"</span>).<span class="hljs-title function_ invoke__">unwrap</span>();
<span class="hljs-keyword">let</span> <span class="hljs-variable">res</span> = res.<span class="hljs-title function_ invoke__">replace</span>(<span class="hljs-string">"\\\\?\\"</span>, <span class="hljs-string">""</span>);
<span class="hljs-keyword">let</span> <span class="hljs-variable">args</span> = <span class="hljs-built_in">vec!</span>[<span class="hljs-string">"push"</span>.<span class="hljs-title function_ invoke__">to_string</span>(), res, <span class="hljs-string">"/data/local/tmp/"</span>.<span class="hljs-title function_ invoke__">to_string</span>()];
<span class="hljs-keyword">let</span> <span class="hljs-variable">binding</span> = ADBCmd::<span class="hljs-title function_ invoke__">new</span>(<span class="hljs-string">"adb"</span>.<span class="hljs-title function_ invoke__">to_string</span>(), <span class="hljs-literal">false</span>);
<span class="hljs-keyword">let</span> <span class="hljs-variable">child</span> = binding.<span class="hljs-title function_ invoke__">run</span>(args);
<span class="hljs-keyword">match</span> child {
<span class="hljs-title function_ invoke__">Ok</span>(stdout) => {
<span class="hljs-built_in">println!</span>(<span class="hljs-string">"{}"</span>, stdout)
}
<span class="hljs-title function_ invoke__">Err</span>(stderr) => {
<span class="hljs-built_in">println!</span>(<span class="hljs-string">"{}"</span>, stderr)
}
}
}
<span class="hljs-meta">#[tokio::test]</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">fn</span> <span class="hljs-title function_">test_run_async</span>() {
<span class="hljs-keyword">let</span> <span class="hljs-variable">adb_cmd</span> = ADBCmd::<span class="hljs-title function_ invoke__">new</span>(<span class="hljs-string">"adb"</span>.<span class="hljs-title function_ invoke__">to_string</span>(), <span class="hljs-literal">false</span>);
<span class="hljs-keyword">let</span> <span class="hljs-variable">args</span> = [<span class="hljs-string">"devices"</span>.<span class="hljs-title function_ invoke__">to_string</span>()];
adb_cmd
.<span class="hljs-title function_ invoke__">run_async</span>(args.<span class="hljs-title function_ invoke__">to_vec</span>(), |line| {
<span class="hljs-built_in">println!</span>(<span class="hljs-string">"{}"</span>, line);
line
})
.<span class="hljs-keyword">await</span>;
}
}
</code></pre>
</body>
</html>