操作系统:Debian
适用架构:MIPS64EL(Loongson 龙芯)
从今往后,在龙芯上调试 Android 设备将更加容易。我将告诉你如何为龙芯编译构建 adb(MIPS)。
Debian 官方有 adb 的安装包:
https://packages.debian.org/search?suite=all&arch=mips64el&searchon=names&keywords=adb
一共 5 个文件。
备用地址,https://pan.baidu.com/s/1wIJA9HQ-quvcr-L1BAJNlg 提取码:ajsy
将 Adb 及其依赖的软件包安装完成后,查看一下 adb 版本。
adb version
输出的结果
Android Debug Bridge version 1.0.36
Revision 1:7.0.0+r33-1
Installed as /usr/lib/android-sdk/platform-tools/adb
在手机上启用“开发者模式”,启用“USB 调试”。
将 Android 设备连接至电脑,在弹出的对话框中选择 USB 连接模式为“文件传输”。
这些操作很重要,能决定成功与否。
adb devices -l
手机上会弹出对话框,“是否允许 USB 调试?这台计算机的 RSA 秘钥指纹如下:19:F4:29……”,点击“确定”。
如果提示连接成功。后边的步骤就可以省略了。
List of devices attached
69T7N15823003216 device
如果出现授权不成功的信息。如下所示,请继续往下看。
List of devices attached
69T7N15823003216 unauthorized
通过 lsusb 查看 usb 设备,如下红色部分对应的就是android设备
创建 adb_usb.ini 文件,写入 android 设备的 VID。(比如,上方红色加粗的部分,12d1。)
echo 0x12d1 > ~/.android/adb_usb.ini
sudo nano /etc/udev/rules.d/90-android.rules
90-android.rules 这个文件名是自定义的。
加入以下内容,注意 ATTRS{idVendor} 字段对应的是 android 设备的 VID,ATTRS{idProduct} 字段对应的是 android 设备的 PID。
SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1079", MODE="0666", GROUP="plugdev", SYMLINK+="android_adb"
修改文件权限
sudo chmod 666 /etc/udev/rules.d/90-android.rules
sudo systemctl restart udev
sudo usermod -a -G plugdev $(id -u -n)
sudo udevadm control --reload-rules
sudo udevadm trigger
并执行adb devices命令,如有设备则说明adb配置成功了。
adb kill-server
adb start-server
adb devices
输出的结果:
sudo nano /etc/profile
追加以下内容。
export ANDROID_SDK_ROOT=/lib/android-sdk
export LD_LIBRARY_PATH=${ANDROID_SDK_ROOT}/tools/lib64/qt
export QT_QPA_PLATFORM_PLUGIN_PATH=${LD_LIBRARY_PATH}/plugins/platforms
export PATH=$PATH:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools
使环境变量生效
source /etc/profile
如果手机上不弹出确认授权的对话框,请参考下边的指南。
adb:添加公钥验证
安全的 adb 使用公钥进行验证,只有来自已经授权的主机才被允许 USB 调试。
当设备连接到未经授权的主机时,adb守护程序会发送设备的用户公钥。将显示一个弹出窗口,要求用户允许从主机进行一次或永久调试。公钥是在后一种情况下安装在设备上。可以在构建时安装其他密钥。
在主机上,自动生成用户公钥/私钥对, 如果它不存在,当 adb 守护程序启动并存储在 $HOME/.android/adb_key(.pub) 或 windows 上的 $ANDROID_SDK_HOME。如果需要,ADB_KEYS_PATH 环境变量可以设置为 :-分隔(Windows下用 ; )私钥列表,例如公司范围或供应商密钥。
在设备上,供应商公钥在构建时安装在中 /adb_key。用户安装的密钥存储在 /data/misc/adb/adb_keys 中。
ADB 协议变更:
如果设备需要验证主机,它会回复到 CNXN 带有 AUTH 数据的数据包。AUTH 数据包有效负载是一个随机令牌。 主机用它的一个私钥对令牌进行签名,并发送一个 AUTH(0) 小包。如果签名验证成功,设备将回复 CNXN 一个数据包。否则,它会发送一个带有新令牌的新 AUTH 数据包,主机可以使用另一个私钥重试。一旦主人尝试过它可以发送一个带有公钥的 AUTH(1) 包 有效载荷。adbd随后将公钥发送给框架(如果它已经被开始)进行确认。
安卓的发行版众多,一定要确认好版本号,并保持各个组件版本的一致。
请及时到安卓中国的官网查新,https://developer.android.google.cn/about/dashboards
版本 | 代号 |
---|---|
5.0 | Lollipop |
6.0 | Marshmallow |
7.0 | Nougat |
8.0 | Oreo |
9 | Pie |
大版本号下边,还有小版本号,比如,5.0、5.1、7.0、7.1……
大小版本号还面向着不同的对象,比如,dev开发版、release正式版、iot物联网版……
这里以安卓 9.0 Release 2 为例,代号 Pie。
去掉 source.list 中的 deb-src 的注释。
sudo sed -i "s/# deb-src/deb-src/g" /etc/apt/sources.list
安装编译所需依赖。
sudo apt update
一次性安装。
sudo apt install git clang openjdk-8-jdk autoconf libx11-dev libreadline6-dev libgl1-mesa-dev flex bison gperf build-essential libncurses5-dev tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev dpkg-dev libsdl1.2-dev gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev lib32ncurses5-dev x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils xsltproc unzip m4 lib32z-dev ccache bc python flex bison gperf libsdl-dev build-essential
分别安装。
apt install git clang python openjdk-8-jdk autoconf
apt install libx11-dev libreadline6-dev libgl1-mesa-dev
apt install flex bison gperf build-essential libncurses5-dev
apt install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev
apt install dpkg-dev libsdl1.2-dev
apt install gnupg flex bison gperf build-essential
apt install zip curl zlib1g-dev gcc-multilib g++-multilib
apt install libc6-dev
apt install lib32ncurses5-dev x11proto-core-dev libx11-dev
apt install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
apt install lib32z-dev ccache
apt install bc flex bison gperf libsdl-dev build-essential
platform/system/core
platform/external/boringssl
建议使用安卓官方的目录结构,这样调试时可以更好的保证兼容性。
mkdir -pv ./dvp/android/platform/system/
cd ./dvp/android/platform/
Git 时,请设置一下分支 pie-release-2,也指定一下本地目录。
中国科学技术大学
https://mirrors.ustc.edu.cn/aosp/
清华大学和北京外国语大学的 AOSP 镜像站为了减轻服务器的负荷,没有开启 Git Web,所以,浏览器上看不到目录结构,但是这并不影响 Git 的使用。
清华大学
https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/
北京外国语大学
https://mirrors.bfsu.edu.cn/git/AOSP/
安卓官网
https://android.googlesource.com/
git clone -b pie-release-2 https://mirrors.bfsu.edu.cn/git/AOSP/platform/system/core.git ./system/core
git clone -b pie-release-2 https://mirrors.bfsu.edu.cn/git/AOSP/platform/external/boringssl.git ./external/boringssl
git clone -b pie-release-2 https://mirrors.bfsu.edu.cn/git/AOSP/platform/development ./development
其他可能涉及的项目,请指定对应的本地目录。
git clone -b pie-release-2 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/tools/base ./tools/base
git clone -b pie-release-2 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/system/libbase ./system/libbase
git clone -b pie-release-2 https://mirrors.ustc.edu.cn/aosp/platform/external/zlib ./external/zlib
git clone -b pie-release-2 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/build ./build
git clone -b pie-release-2 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/build/soong ./build/soong
cd ./system/core/adb
修改一下版本号的格式。
nano ../../../development/sdk/plat_tools_source.prop_template
删掉空格。
Pkg.Revision=28.0.0rc1
这里参考该文件夹中的 Android.mk 来编写 Makefile 文件
nano Makefile
内容如下:
# Makefile for adb
LOCAL_PATH := ~/dvp/android/platform/system/core/adb
BUILD_NUMBER_FROM_FILE := 1
platform_tools_version := $(shell sed /
's/$${PLATFORM_SDK_VERSION}/0/ ; s/^Pkg.Revision=/(.*/)//1/p ; d' /
../../../development/sdk/plat_tools_source.prop_template /
)
tool_version := $(platform_tools_version)-$(BUILD_NUMBER_FROM_FILE)
# adb_version := $(shell git -C ~/dvp/android/platform/system/core/adb rev-parse --short=12 HEAD 2>/dev/null)-android
adb_host_sanitize :=
adb_target_sanitize :=
SRCS+= adb.c
SRCS+= adb_client.c
SRCS += adb_auth_host.c
SRCS+= commandline.c
SRCS+= console.c
SRCS+= file_sync_client.c
SRCS+= fdevent.c
SRCS+= get_my_path_linux.c
SRCS+= services.c
SRCS+= sockets.c
SRCS+= transport.c
SRCS+= transport_local.c
SRCS+= transport_usb.c
SRCS+= usb_linux.c
SRCS+= usb_vendors.c
SRCS+= utils.c
VPATH+= ../libcutils
SRCS+= abort_socket.c
SRCS += list.c
SRCS += load_file.c
SRCS+= socket_inaddr_any_server.c
SRCS+= socket_local_client.c
SRCS+= socket_local_server.c
SRCS+= socket_loopback_client.c
SRCS+= socket_loopback_server.c
SRCS+= socket_network_client.c
VPATH+= ../libcrypto_utils
SRCS+= android_pubkey.c
VPATH+= ../libzipfile
SRCS+= centraldir.c
SRCS+= zipfile.c
VPATH += ../../../external/zlib/src
SRCS += adler32.c
SRCS += compress.c
SRCS += crc32.c
SRCS += deflate.c
SRCS += infback.c
SRCS += inffast.c
SRCS += inflate.c
SRCS += inftrees.c
SRCS += trees.c
SRCS += uncompr.c
SRCS += zutil.c
CPPFLAGS+= -std=c++11
CPPFLAGS+= -std=c++14
CPPFLAGS+= -DADB_HOST=1
CPPFLAGS+= -DHAVE_FORKEXEC=1
CPPFLAGS+= -DHAVE_SYMLINKS
CPPFLAGS+= -DHAVE_TERMIO_H
CPPFLAGS+= -DADB_VERSION=$(tool_version)
CPPFLAGS+= -DADB_REVISION=$(tool_version)
CPPFLAGS += -DHAVE_SYS_SOCKET_H
CPPFLAGS+= -D_GNU_SOURCE
CPPFLAGS+= -D_XOPEN_SOURCE
CPPFLAGS+= -I.
CPPFLAGS+= -I../include
CPPFLAGS += -I../libcrypto_utils/include
CPPFLAGS+= -I../../../external/zlib
CPPFLAGS += -I../../../external/boringssl/include
CPPFLAGS += -I../base/include
CPPFLAGS += -I../../../build/soong/cc/libbuildversion/include
CFLAGS+= -O2 -Wno-unused-parameter
LDFLAGS=
LIBS= -lrt -lpthread -lz
TOOLCHAIN= mips64el-unknown-linux-gnu-
CC= $(TOOLCHAIN)gcc
LD= $(TOOLCHAIN)gcc
OBJS= $(SRCS:.c=.o)
all: adb
adb: $(OBJS)
$(LD) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)
clean:
rm -rf $(OBJS)
注意:请将上边两段中的前置空格改为制表符(表格键 Tab)。否则编译会报错。
clang -std=c++11 -std=c++14 -DADB_HOST=1 -DHAVE_FORKEXEC=1 -DHAVE_SYMLINKS -DHAVE_TERMIO_H -DADB_VERSION=-android -DADB_REVISION=-android -DHAVE_SYS_SOCKET_H -D_GNU_SOURCE -D_XOPEN_SOURCE -I. -I../include -I../libcrypto_utils/include -I../../../external/zlib -I../../../external/boringssl/include -I../base/include -I../../../build/soong/cc/libbuildversion/include -c -o adb.o adb.cpp
make
如果 stdatomic.h 报错,请下载安卓自带的版本。
https://www.androidos.net.cn/android/9.0.0_r8/xref/bionic/libc/include/stdatomic.h
备份源文件。
sudo mv /lib/gcc/mips64el-linux-gnu/9/include/stdatomic.h /lib/gcc/mips64el-linux-gnu/9/include/stdatomic.h.bak
创建软链接。
sudo ln -s ~/dvp/android/stdatomic.h /lib/gcc/mips64el-linux-gnu/9/include/stdatomic.h
参考文献:
《Ubuntu16.04配置ADB调试环境》https://blog.csdn.net/u012351661/article/details/78201040
《ubuntu使用scrcpy手机投屏-免费神器scrcpy【介绍、安装、使用】》https://www.cnblogs.com/hesse-summer/p/11200260.html
《android android.mk中:= ?= +=之间的区别》https://blog.csdn.net/u011467537/article/details/50395138
《Android编译系统中的Android.bp、Blueprint与Soong》https://note.qidong.name/2017/08/android-blueprint/
《Android之ADB总结》https://blog.csdn.net/mediatec/article/details/87934199
《Android.mk》https://www.jianshu.com/p/7677566beec6
《Bug 60932 - make stdatomic.h compatible with C++ 》https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932
《P0943R5: Support C atomics in C++》http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0943r5.html
《安卓镜像编译构建指南(基于x86环境)》https://support.huaweicloud.com/prtg-robox-kunpengcps/kunpengadriodimage_02_0002.html
《Build adb for Loongson(MIPS)》https://hev.cc/2227.html
《linux下adb及fastboot编译与使用》https://blog.csdn.net/wofeboy/article/details/8920344?locationNum=12&fps=1
《Android Adb 源码解析(base on Android 9.0)》https://www.jianshu.com/p/a47e1c90b9bf
《ADB DEVICES OFFLINE》https://www.oschina.net/question/2517795_2141286
https://gitlab.com/Codeaurora/platform_system_core/commit/613bd280bdc3db7c771d6779f34b424b8a6ef3ef