您当前的位置:首页 > 计算机 > 系统应用 > Linux

编译构建 adb(龙芯)

时间:11-21来源:作者:点击数:

环境

操作系统:Debian

适用架构:MIPS64EL(Loongson 龙芯)

从今往后,在龙芯上调试 Android 设备将更加容易。我将告诉你如何为龙芯编译构建 adb(MIPS)。

成品

下载文件

Debian 官方有 adb 的安装包:

https://packages.debian.org/search?suite=all&arch=mips64el&searchon=names&keywords=adb

一共 5 个文件。

  • adb_7.0.0+r33-1_mips64el.deb
  • android-libadb_7.0.0+r33-1_mips64el.deb
  • android-libbase_7.0.0+r33-1_mips64el.deb
  • android-libcutils_7.0.0+r33-1_mips64el.deb
  • android-liblog_7.0.0+r33-1_mips64el.deb

备用地址,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设备

  • Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
  • Bus 001 Device 005: ID 0bda:0821 Realtek Semiconductor Corp.
  • Bus 001 Device 003: ID 5986:06b2 Acer, Inc
  • Bus 001 Device 013: ID 12d1:1079 Huawei Technologies Co., Ltd.
  • Bus 001 Device 002: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
  • Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

创建 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

重启USB服务

sudo systemctl restart udev

sudo usermod -a -G plugdev $(id -u -n)

sudo udevadm control --reload-rules

sudo udevadm trigger

重启adb服务

并执行adb devices命令,如有设备则说明adb配置成功了。

adb kill-server

adb start-server

adb devices

输出的结果:

  • List of devices attached
  • 69T7N15823003216    device
     

设置环境变量

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

二、从 Git 仓库克隆源代码

需要 Clone 的项目

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/

执行 Clone

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

 

三、新建一个独立的 Makefile 文件

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

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

使用 GCC

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门