前言
項目使用Rockchip的3399挖掘機demo板,使用官方提供的Debian Linux SDK(官方github源碼鏈接:https://github.com/rockchip-linux)進行開發定制。當前需要將Android上的調試工具adb移植到arm平台上運行,所以搜羅了網上的一堆教程和參考,最終本地交叉編譯出了可以在RK3399(3399是armhf的)核心板上直接運行的adb工具。
開發環境為Ubuntu1604。
一、下載桌面版Ubuntu1604的如下源碼包:android-tools-adb,openssl,zlib。
android-tools-adb源碼包下載鏈接:https://packages.ubuntu.com/source/xenial/android-tools
openssl-1.1.0源碼包下載鏈接:https://www.openssl.org/source/
zlib-1.2.8源碼包下載鏈接:https://packages.ubuntu.com/xenial/zlib1g-dev
注意:交叉編譯armhf平台的adb工具,本地必須安裝openssl和zlib庫,直接用apt install是不行的,因為交叉編譯時需要鏈接arm版本的庫。最終交叉編譯出來的openssl和zlib庫,需要拷貝到本地/usr/arm-linux-gnueabihf/lib/目錄下。
二、下載arm-linux-gcc交叉編譯工具鏈。
arm-none-linux-gnueabi-gcc下載地址:https://blog.csdn.net/alan00000/article/details/51724252
arm-linux-gnueabihf-gcc下載地址:http://www.veryarm.com/arm-linux-gnueabihf-gcc
在Ubuntu1604上安裝交叉編譯工具鏈可以參考如下鏈接:https://blog.csdn.net/u010957054/article/details/58056863
三、交叉編譯openssl和zlib庫。
3)交叉編譯openssl庫。
1. 首先在終端命令行中運行配置命令(此步驟已經做過,不需要再做,可直接從第3步做起。當然有興趣折騰的話,可以自己再配一次):./config no-asm -shared --prefix=$PWD/output/
說明:no-asm 在交叉編譯過程中不使用匯編代碼代碼加速編譯過程。
-shared 生成動態鏈接庫。
--prefix 指定安裝編譯生成文件的路徑,如不指定則默認為當前目錄。
2. 其次修改當前目錄下的 Makefile 文件(此步驟也已經做過,不需要再做,可直接從第3步做起。有興趣自己折騰的話,可以自行配置修改):
將 Makefile 第74行 “CROSS_COMPILE= ” 改為 “CROSS_COMPILE= arm-linux-gnueabihf-”(前提上電腦上已經安裝了 arm 交叉編譯工具,未安裝的參考此鏈接:https://blog.csdn.net/u010957054/article/details/58056863
或 https://blog.csdn.net/singleroot/article/details/54342935)。
找到Makefile中有 “-m64” 的地方,全刪之(共2處)。
3. 最后,在終端命令行里面執行編譯和安裝命令:make && make install
運行完畢后,會在當前目錄下生成一個 “output” 目錄,生成的交叉編譯庫文件、可執行文件和頭文件等均在此目錄下。
將 “output/lib” 目錄下的 “libcrypto” 和 “libssl” 開頭的庫文件全部復制到 “/usr/arm-linux-gnueabihf/lib/” 目錄下即可。
參考鏈接:
https://www.cnblogs.com/ynxf/p/6375091.html
https://blog.csdn.net/zqj6893/article/details/8778237
2)交叉編譯zlib庫。
1. 首先在終端命令行中運行命令指定編譯器:export CC=arm-linux-gnueabihf-gcc
2. 其次運行配置命令:./configure --prefix=$PWD/output
說明:--prefix 指定安裝編譯生成文件的路徑,如不指定則默認為當前目錄。
3. 最后,在終端命令行里面執行編譯和安裝命令:make && make install
運行完畢后,會在當前目錄下生成一個 “output” 目錄,生成的交叉編譯庫文件、可執行文件和頭文件等均在此目錄下。
將 “output/lib” 目錄下的 “libz” 開頭的庫文件全部復制到 “/usr/arm-linux-gnueabihf/lib/” 目錄下即可。
參考鏈接:
https://blog.csdn.net/npy_lp/article/details/6991704
四、交叉編譯android-tools-adb工具。
直接復制 android-tools-adb 源碼包中 debian/makefiles 目錄下的 adb.mk 到 core/adb 目錄下,並改名為 Makefile 。然后在終端命令行中運行 export CC=arm-linux-gnueabihf-gcc 然后再運行 make 命令,即可編譯生成 armhf 平台對應的 adb 可執行文件。
將生成的 adb 可執行程序拷貝到3399目標板 /usr/bin/ 目錄下,經驗證,可以使用完整的 adb 調試命令。
1.問題
遇到一個比較苛刻的客戶,測試程序adb push到開發板時間格式不一樣,這都要算軟件bug。
沒辦法,只能想辦法解決。
后續在其他平台驗證不會出現時間格式不一致的問題,所以把目標鎖定在adbd版本的問題。於是打算重新移植個最新版本的adbd。
后面發現根本原因是設備的系統時間小於adb push文件的屬性時間,由於沒有聯網校時導致的,因此只會顯示年份。
不過還是把移植的過程記錄下來。
2.過程
2.1 失敗
參考交叉編譯arm Linux環境下的android-tools-adb_u011281197的博客-CSDN博客_android-tools-adb
這篇文章,不過看內容描述又是移植openssl又是zlib的,把問題搞得復雜化了。
而且這個版本的源碼包里面依賴的好多庫,對交叉編譯來說太麻煩了。
android-properties這個庫都不知道在哪移植,索性放棄這個版本。
2.2 成功
成功移植的源碼、zlib與openssl源碼我都已提交的碼雲上android-tools相關源碼
其中adb與adbd目錄下的makefile我已經修改,后續直接修改CC編譯器就可以直接make
需要安裝zlib和openssl。
2.2.1 安裝gcc版本zlib
1.tar zxvf zlib-1.2.11.tar.gz
2.cd zlib-1.2.11
3. ./configure
4.make -j8
5.make install
2.2.2 安裝gcc版本openssl
1.tar zxvf openssl-1.0.0e.tar.gz
2.cd openssl-1.0.0e/
3. ./Configure shared os/compiler:gcc
意思我電腦gcc默認是不支持編譯編譯動態庫,沒啥影響。
4.make -j8
5.make install
2.2.3 編譯測試
對比下上個版本adbd的makefile
所依賴的庫少很多,減少很多移植難度。
github上提交的源碼已經按照操作流程拷貝了.mk文件,后續只要修改對應目錄的Makefile即可。
操作流程:
- 將android-tools-4.2.2/debian/makefiles中相應的.mk文件拷貝到android-tools-4.2.2/core/對應的目錄,例如adb,只需將adb.mk拷貝到adb目錄並將adb.mk修改為Makefile。
- 添加編譯器,鏈接的頭文件與.c文件路徑記得修改一下。
- make
編譯成功。
adb push到開發板試試看。