zoukankan      html  css  js  c++  java
  • 想玩 Android 开发板?这些常用命令你不知不行!

    2019-04-19

    关键字:Android机顶盒常用命令、Linux命令

    笔者早年间从事 Android 机顶盒开发工作,那会刚毕业,技术也比较菜,工作过程中遇到过不少困难,不过所幸当时就有做笔记的习惯,很多工作过程中遇到的问题或者一些 “奇淫技巧” 都被我记录了下来。最近学到一个新词:复盘。恰好这段时间也在复盘自己之前的工作,发现自己虽然很长一段时间不碰机顶盒了,但之前积累下来的笔记还真不少。笔者不太甘心让这些 “年少的自己” 就这样尘封在暗无天日的笔记本里,加上一时间整理癖发作,就打算将它们整理成文发表出来,希望能帮到一部分后生们。

    这篇文章记载的是笔者在 Android 机顶盒开发过程中经常用到的一些命令。


    本篇文章提及的常用命令按 Linux 、 Android 以及 Git 三个部分来讲。这些命令基本就支撑起了笔者全部的机顶盒开发过程。

    1、Linux

    2、Android

    3、Git

    1、Linux

    这里的 Linux 命令有分服务器版及机顶盒版。因为机顶盒上的 Linux 系统被删减了很多功能,因此,有些命令或参数并不适用于机顶盒。

    find

    find .

    遍历当前目录。将当前目录及其子目录下的所有文件都列出来。

    find -name init.rc
    find -name "init*"

    首先是两条最基本的命令,查找某文件的位置。如果要查找的文件名含有通配符,最好加上双引号。

    find -type d -name "etc*"
    find -type f -name "etc*"

    这个是按类型查找。 -type 参数后面接 d 表示只查找目录名,接 f 表示只查找文件名。

    find /system -type f -name "ppp*"

    这条命令是指定目录查找。要指定目录时,目录名一定要放在最前面。

    上面 4 条就是机顶盒和 Linux 服务器上通用的 find 命令了。需要注意的是机顶盒不支持直接 find ,需要通过在普通 find 命令前加上 busybox 来执行。busybox 是一个工具程序,它位于 /system/bin/busybox , 有些平台 busybox 会直接链到 /system/bin/toolbox 上。

    下面几条则是只在 Linux 服务器上才支持的 find 命令了。

    find -maxdepth 2 -type f -name "*.mk"

    设置目录查找深度查找。这条命令表示只查找当前目录及一级子目录下的 .mk 文件。

    find vendor/ -size +2M
    find system/ -size +1024k
    find device/ -size -20c

    这几条命令是按文件大小来查找。分别是查找大于 2M 的文件、查找大于 1024KB 的文件、查找小于 20 个字节的文件。

    find vendor/ -size +2M -exec ls -alh {} ;
    find vendor/ -size +2M | xargs ls -alh
    find vendor/ -size +20M | xargs rm -rf

    前面两条命令的执行结果是等效的。效果是将前面查找到的结果应用一下 ls -alh 命令。第 3 条命令也比较常用,查找某类文件并将它们删除。下面那种 | xargs 格式的命令并不支持接所有指令。如果遇到不支持接的,换成第 1 种格式就可以了。

    grep

    grep -nr "ttyUSB" vendor/
    grep -i "ttyUSB" vendor/
    grep -A 5 -B 3 "ril" device/

    这几条 grep 命令撑起了我的日常工作。

    第 1 条是我最常用的 grep 命令,表示在 vendor 目录下查找包含 ttyUSB 字符串的文件,并将它们的文件名称以及所在行数列出来。

    第 2 条的 -i 参数表未忽略大小写查找。

    第 3 条表示匹配到结果以后,再往前多显示 5 条,往后多显示 3 条。

    操作目录

    pwd
    pwd -L
    pwd -P

    查看当前目录的绝对路径。前面两条命令的效果是一样的,将会显示当前目录的绝对路径。 第 3 条命令显示的是当前目录的真实路径,与上一条的区别就是对待 “软链接” 的显示方式了。如果当前目录下有软链接,加 -P 参数会显示出该软链接链向的实际路径。

    mkdir /system/myf0
    mkdir -p /system/myf1/myf2

    创建目录。加个 -p 参数表示递归创建目录,否则的话,只能在已存在的目录上创建目录。

    空间统计

    du -ah
    du -sh
    du -d 1 -ah
    du -d 1 -ah /usr/local

    统计当前目录的空间占用情况。

    第 1 条命令将会递归查找文件与目录,列出每个目录及文件的大小。参数 a 表示所有文件,参数 h 表示以适宜阅读的形式表示其大小,如多少 KB ,多少 MB 。

    第 2 条命令也是递归统计当前目录所占的空间大小,只不过它不会列出每一个文件与目录的占用情况,而是只列出一个总的结果值。

    第 3 条命令则是递归统计当前目录所占的空间大小,只列出当前目录下各一级目录的的占用空间情况,并列出当前目录占用空间总情况。

    第 4 条命令则是指定一个目录来统计。

    df -h

    列出当前文件系统磁盘空间占用情况,实际作用不大,但闲着没事时就喜欢敲敲它。

    解压缩

    tar -zcvf 目录 输出名称.tar.gz
    tar -zcvf 目录 | split ‐d ‐b 50m 输出名称.tar.gz

    以 tar.gz 格式压缩。第 2 条指令是分卷压缩,每 50MB 分一个文件。

    tar -zxvf 文件名称.tar.gz
    tar -zxvf 文件名称.tar.gz -C 输出目录

    解压。对于分卷压缩的文件,可以将它们合并成一个文件。

    cat 分卷压缩文件.tar.gz.a* > 输出名称.tar.gz

    Linux 的分卷压缩最后面一般都是以 aa, ab, ac 等命名的。

    至于 ZIP 格式的压缩,就不说了,笔者用的比较少。

    更改权限

    chmod 755 /system/bin/rild
    chown root:customer /system/etc/ppp/chat
    chgrp customer /system/bin/rild

    chmod 命令用的还比较多一点。其它的,用的就很少了。Android 系统对文件权限要求比较严格,对某些系统关键文件稍微有点权限不对,编译出来的系统都用不了。所以一般很少主动更改文件权限的。

    计算 MD5

    md5 /system/bin/sh
    md5sum /system/bin/rild

    求 MD5 值还算是比较常用的,在比对是否推错程序时很有用处。不过不同的设备集成的 md5 计算工具可能不一样,甚至有些系统没有集成计算 md5 的工具。所以上面的命令其实不具备代表性。

    查看进程

    ps

    查看系统当前进程。机顶盒开发过程中很常用的命令。

    top
    top -d 1

    查看当前系统进程及其资源占用情况。直接一个 top 是每 3 秒更新一次。加个参数 -d 1 则是每秒更新一次值。

    dumpsys activity | grep Focus
    dumpsys activity | grep ocu
    dumpsys activity -f | grep ocu

    这条命令在机顶盒端也很常用,用来查询当前处于栈顶的 Activity 名称。上面两条命令完全是一样的,只不过笔者本人嫌第 1 条指令要按一个大写的 F 麻烦,所以一般会用第 2 条,会顺手很多。第 3 条是在当前活动栈中查找,其实效果都一样。

    系统属性

    这个是针对机顶盒的。

    getprop ro.adb.secure
    getprop | grep "ril"
    
    setprop service.bootanimation.exit 1

    分别是获取属性和设置属性。

    命令行输入遥控器按键

    input keyevent KEYCODE_DPAD_CENTER
    input keyevent 23

    也比较常用的命令。可以将这些指令封装成脚本文件来做压力测试。

    ADB

    ADB 命令推文件调试非常常用啊有木有。

    用这个必须要确保 adbd 进程正在运行当中,可以 ps | grep adbd 查看一下。一般默认的 adbd 端口是 5555 ,当然,有些项目为了所谓的安全,会改端口号,一般可以 getprop | grep port 查看一下。对了,好像还要确认一下 ro.adb.secure 属性的值。在这一切前提条件都满足以后,就可以开始使用 adb 连接了。

    adb connect 192.168.x.x
    adb connect 192.168.x.x:17173
    adb remount
    adb devices
    adb disconnect
    adb disconnect 192.168.x.x
    adb push from/file.name /to/file.name
    adb pull from/file.name

    一般比较常用的就这些了,就不逐条解释命令了。 adb pull 命令拉取上来的文件默认是存在电脑的用户目录根目录下的。win 10 系统貌似不能指定存储路径。

    KILL

    kill 1476
    kill -9 51

    根据 PID 杀进程。 -9 参数把它理解成杀死一个顽固进程,哈哈。

    busybox

    busybox 是一个应用程序。在海思平台中,busybox 程序通常是软链接到 /system/bin/toolbox 程序上的。busybox 是一个工具集,它提供的功能有很多,但常用的却不多。

    busybox ifconfig
    busybox ifconfig -a

    上面两条命令一般用来查看机顶盒中的网卡信息。 -a 参数是列出所有网卡信息,包括未启用的。

    busybox  ifconfig eth0 hw ether 0c:c6:55:83:24:75  

    临时修改 eth0 网卡的 MAC 地址。

    busybox dmesg -n 1
    echo 1 > /proc/sys/kernel/printk

    关闭内核打印,上面两条命令的效果是一样的。

    编译

    通常 Android 系统的编译都离不开下面几条命令

    source build/envsetup.sh
    lunch xxx

    这两步是准备编译链环境。

    make otapackage -j32
    make bigfish -j32
    mm
    mmm vendor/xxx/app/MyApk/

    这几条就是编译命令了。

    前面两条是编译大包的命令,不同平台会有不同编译参数。第 1 条是 Android 原生编译参数,第 2 条是海思平台的编译方式。

    mm 命令是编译当前目录用的,需要当前目录下有 Android.mk 文件才行。

    mmm 命令则是指定目录编译,同样的也需要指定的目录下有 Android.mk 文件才行。

    额外提一下,这个 mm , mmm 命令都是在 ./build/envsetup.sh 脚本中定义的函数。

    通过命令恢复出厂设置

    下面介绍的是海思平台通过命令恢复出厂设置的方式

    1. 在 /cache 目录下创建 recovery 目录
    2. echo --wipe_data > /cache/recovery/command
    3. echo boot-recovery > /dev/block/platform/hi_mci.1/by-name/misc
    4. sync
    5. reboot

    上述第 3 步可能会随着版本的不同,某些目录名称可能会有变动,灵活应用即可。

    APK 手动签名

    严格来讲,这并不算是命令。但因为也比较常用,还是简单提一下吧。

    将 signapk.jar 文件拷贝至签名密钥所在的目录。

    ./out/host/linux-x86/framework/signapk.jar

    签名密钥文件不同平台的存放目录不一样,您可以搜索看看 platform.x509.pem 文件存储于哪个目录就将 signapk.jar 文件拷贝至哪个目录。

    上面步骤都准备好后,就可以通过以下命令给 APK 签名了。事先进入到存放了签名密钥的目录。

    java -jar signapk.jar platform.x509.pem platform.pk8 XXX.apk XXX_signed.apk

    抓日志

    Android 的日志分为好几个级别。main, system, radio, events 等。

    logcat -s 标签名称
    logcat *:E
    logcat -c;logcat
    logcat > /data/mine.log
    logcat -v process | grep 1471
    logcat -v time -s 标签名称

    抓取 main 级别日志。倒数第 2 条是按进程号过滤日志。最后一条是显示日志的时间戳。也可以通过 telnetd 来远程抓取日志,不过用的非常少,而且很多机顶盒没有预置 telnetd 程序,所以就不说了。

    logcat -b radio
    logcat -b 
    logcat -c -b radio

    抓取 radio 级别的日志。最后一条是清除 radio 级别的日志。

    抓网络包

    tcpdump -i eth0 -s0  -w /data/player.pcap

    有些机顶盒没有预置 tcpdump 程序的。

    2、Android

    这一章节主要介绍下操作四大组件的常用命令。

    pm

    pm install demo.apk
    pm uninstall com.your.pkg
    pm -l

    pm 命令里比较常用的就这几条了。

    前面两条是安装和卸载 APK 的命令。

    第 3 条是列出当前安装的所有 APK 包名及其 APK 位置。笔者通常用这条命令配合 grep 来查找某 APK 的安装信息。

    Activity

    am start com.chorm.four
    am start com.chorm.four/.MainActivity

    启动 APK 。其中第 1 条命令要求主 Activity 的注册 category 属性中有 “ android.intent.category.DEFAULT ” 。 第 2 条命令则没有这个要求,通常用第 2 条命令启动 APK 比较多。不过还是比较经常出现上面两条都启动不了的情况。这个时候就要借助另一条无敌指令来帮忙了。

    monkey -p com.chorm.four 1

    monkey 据说是一个测试工具,不过不管,笔者只用它来帮忙启动一些 APK 。monkey -p 是固定参数,后面接个 APK 包名,最后一个数字填个 1 就好了。据说这个工具的设计目的就是想模仿一只猴子,胡乱地去操作我们的 APK ,进而测试 APK 的稳定性等。最后面的数字参数就是想要让这只猴子胡乱操作的次数。

    Broadcast

    am broadcast -a my.broadcast.action

    通过命令发送一条全局广播。 -a 参数后接的是广播 Action 名。

    Service

    am startservice com.chorm.four/.MyService

    通过串口启动 Service 。

    ContentProvider

    content query --uri content://stbconfig/authentication
    content insert --uri content://settings/global --bind name:s:chormname --bind value:s:lemontea
    content update --uri content://settings/global --bind value:s:hello_xiao_tea --where "name='chormname'"
    content delete --uri content://settings/global --where "name='chormname'"

    ContentProvider 的 CRUD 命令全在这了。其实没什么,记住这些命令就好了,实在记不住,在串口敲一下 content 命令就会出来简明帮助信息了。

    这里可以关注一下上面标红的字体。三段式结构是固定的。因为 ContentProvider 是以 key-value 对的方式存储数据的, name 就代表 key 了,第 2 段 s 表示我们以字符串的形式来匹配字段。 后面的 value:s:xx 也一样了。 中间的 s 字段还有其它几种类型,可选的类型有如下几种

    b - boolean, s - string, i - integer, l - long, f - float, d - double

    其实这些东西,在串口上敲一下 content 命令都会出来帮助信息。

    3、Git

    笔者在公司使用的代码管理工具一直都是 Git ,而且笔者认为 Git 比 SVN 更有优势。

    建仓

    git config --global user.name your.name
    git config --global user.email you@email.com

    在首次使用 Git 工具时,需要先设置一下这些信息才能正常使用 Git 的功能。

    git init

    初始化代码仓库,在当前目录下初始化一个 .git 目录,并开始跟踪当前目录及其子目录。

    git remote add origin git@192.168...
    git remote -v

    第 1 条是为当前 Git 添加一个远程仓库。第 2 条则是查看当前 Git 仓库的远程仓库信息。

    git push -u origin master

    在添加好远程仓库信息后,即可以将本地仓库推送到远程仓库了。

    不过一般而言,建仓流程都是首先建立远程代码仓库,然后再由我们的机器主动去克隆代码的。

    git clone git@192.168...
    git clone git@192.168... -b master2
    git clone git@192.168... -b master2 myfolder/
    git clone --depth 3 git@192.168... -b master2 myfolder/

    将远程仓库中的代码克隆到本地来。

    第 1 条是默认克隆,完整克隆代码仓库,并切换到 master 分支。

    第 2 条也是完整克隆,只不过克隆完后会自动切换到指定的 master2 分支。

    第 3 条和第 2 条一样,只是会克隆到指定的目录中去。

    第 4 条是部分克隆,它只会克隆指定的 master2 分支到指定的 myfolder 目录,并且只会克隆最新 3 条记录。这种克隆方式对于一些庞大的代码仓库来讲,能大大减少空间占用量,因为它只克隆最近的几条记录,并且这种克隆方式不支持分支切换,所以必须要在克隆前就指定好你想要哪个分支。

    其实在工作过程中,建仓这种事,我们软件开发很少去操心的。

    代码管理

    git status
    git status vendor/

    与当前机器上最新的版本对比,列出有修改的文件。第 1 条命令是列出整个 Git 仓库的变化。第 2 条命令则是只看指定的 vendor 目录的变化文件。

    git diff xxx.xxx

    查看指定的文件的详细变化情况,可以接多个文件参数。

    git add file.name
    git add .

    添加有修改的文件到待提交区。第 1 条命令是添加指定的文件。第 2 条指令是添加所有有变化的文件到待提交区。

    git commit -m "Some description"

    将待提交区的代码提交上去,并以 -m 参数后的内容作为描述内容生成一条新的 Git 记录。

    git push

    将当前新提交的 Git 修改记录更新到远程仓库中去。

    git pull
    git pull origin branch2

    从远程代码仓库中下载新记录。第 1 条是更新所有分支。第 2 条则是从 origin 源中更新指定的分支。

    git log
    git reflog
    git log --graph
    git log -1
    git log --stat

    查看提交记录。

    第 1 条是按时间倒序查看所有提交记录,是最常用的 log 命令。

    第 2 条则是查看在本机中的所有操作记录。

    第 3 条可以以图形的形式查看所有人对分支的提交 / 合并情况。用的比较少。

    第 4 条查看最近 1 条提交记录。

    第 5 条查看每条记录都修改了哪些文件。

    git rm file.name

    取消跟踪指定的 file.name 文件。

    git clean -df

    强制删除所有未跟踪且未在忽略列表中的文件。

    代码控制

    git reset --hard HAED
    git reset file.name
    git reset 要回退的版本号 file.name
    git reset --hard 版本号

    第 1 条命令,强制让代码恢复到当前最新记录。该操作会放弃所有对文件的修改。

    第 2 条命令通常用于已经将某文件提交到 “待提交区” 的情况,对这种情况的文件执行这条命令,会使指定的文件回退到 “已修改” 的状态。

    第 3 条命令则是对 “已提交” 的文件进行回退,回退到指定的版本。这种情况其实是新生成一条记录提交上去。

    第 4 条命令是强制让代码整体回退到指定的版本号记录上。

    git checkout file.name

    将指定文件的修改回退到未修改前的状态。这条命令只对已发生修改,但尚未添加到 “待提交区” 的文件有效。

    分支操作

    git remote rm origin branch1

    删除远程仓库上的指定的 branch1 分支。

    git branch
    git branch -a
    git branch branch0

    查看分支情况。

    第 1 条是查看本地已有的分支情况。

    第 2 条是查看本地及远程仓库中所有的分支情况。

    第 3 条是在本地新建一条分支 branch0 。

    git checkout branch2
    git checkout -b branch3

    切换分支。

    第 1 条是切换到指定的 branch2 分支。

    第 2 条是新建分支 branch3 并切换过去。

    git cherry-pick 记录版本号

    将指定版本号的记录修改合并到当前分支来。

    删除一条已存在分支的实例

    假设我们要删除一条已有记录的分支,可以按如下步骤来做。

    1. 首先找到这条要删除的分支名称;

    git branch

    2. 删除这条分支在本地的记录;

    git branch --delete branch_name

    3. 删除在本地保存的远程分支信息;

    git branch -r --delete origin/branch_name

    4. 删除在远程服务器上的分支信息;

    git push origin --delete branch_name

     

    当然,在一般的工作过程中,分支信息是只能增不能删的。

    其它

    git config --add core.filemode false

    执行这条配置信息后,会使我们本地的 Git 忽略掉文件模式的变化。

    git config --global core.quotepath false

    解决中文乱码的问题。

    git config --global core.autocrlf false

    解决 Windows 与 Linux 系统换行符不同的问题,是否会自动将这些不同的换行符作转换。

    git config --global http.proxy="http://192.168.100.252:38098"

    设置网络代理。

    忽略已跟踪文件的后续修改

    在工作过程中,经常会碰到这样的一种需求:某些文件是必须要提交到 Git 去管理的,但这些文件可能会在工作过程中被自动修改,而我们又不想将这些修改提交上去。所以我们可以这样做

    git update-index --assume-unchanged file.name
    git update-index --no-assume-unchanged file.name

    这两条命令分别是对 file.name 文件的忽略跟踪后续修改以及恢复跟踪后续修改。

    如果想看看当前有哪些文件是被忽略跟踪后续修改的,可以用下面这条命令

    git ls-files -v
    git grep "xxx"

    对了,有时候我们可能需要 grep 整个大包目录,为了减少一些 grep 工作量,可以用这条命令来代替。效果是一样的。


  • 相关阅读:
    Connection parameters are correct , SSL not enabled
    log4j配置文件的详解
    java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique
    MYSQL的三种注释
    Oracle19c 单节点ASM 存储模式数据库实例搭建过程
    [专题]中立遭质疑,提价遭反对,ARM的生存难题怎么破?
    快速排序的理解
    chrome审查元素功能,web开发强大帮手
    MyEclipse Server view报错解决方法
    把Java程序打包成jar文件包并执行
  • 原文地址:https://www.cnblogs.com/chorm590/p/stb_command_201904191113.html
Copyright © 2011-2022 走看看