AndroidStudio for arm
1.下载 AndroidStudio for linux
下载网址:https://developer.android.google.cn/studio;
并对应下载好相应的sdk (具体安装详见Androidstudio 的安装步骤)
https://blog.csdn.net/J_Treasuries/article/details/44015797;
并且编写简单的helloworld 程序。
2. 安装 adb
adb 必须适应arm版的,可以下载源码,在飞腾平台上进行编译,或者飞腾下 sudo apt install adb 安装软件,需要注意需要替换linux 源 :
/etc/apt/source.list如下:
将编译或者下载好的adb替换到 AndroidStudio sdk 目录下的我的主机对应的是:/home/greatwall/AndroidStudioProjects/Android/Sdk/platform-tools/
HOST_PREBUILT_ARCH := x86
149c139
< SDK_HOST_ARCH := aarch64
SDK_HOST_ARCH := x86
b. 在build/core/combo下创建 HOST_linux-aarch64.mk
此文件主要作用时指定交叉编译工具链,我们这里采用linux系统下默认的编译环境详见文件 HOST_linux-aarch64.mk
HOST_CC := gcc
HOST_CXX := g++
HOST_AR := ar
c. 在build/core/clang 目录下 创建HOST_arm.mk 文件
此文件用来指定编译的时候依赖头文件和一些库文件所在目录我们这里也 让它默认去linux下/usr 目录下去寻找 比如stdio.h stdlib.h 默认使用系统中头文件 这样做避免一些文件不兼容arm版本,详见文件HOST_arm.mk
将 -targer 注释掉 这样就会去在系统/usr下去找文件可参考HOST_X86.mk 和TARGET_arm.mk 进行文件修改:
CLANG_CONFIG_arm_HOST_EXTRA_CPPFLAGS :=
$(CLANG_CONFIG_EXTRA_CPPFLAGS)
$(CLANG_CONFIG_HOST_EXTRA_CPPFLAGS)
$(CLANG_CONFIG_arm_EXTRA_CPPFLAGS)
$(CLANG_CONFIG_arm_HOST_COMBO_EXTRA_CPPFLAGS)
#-target $(CLANG_CONFIG_arm_HOST_TRIPLE)
3)下载 ninja 工具
android 7.0 后用来代替make编译的工具,可参考网址 :
https://blog.csdn.net/rankun1/article/details/80420301;
git clone git://github.com/ninja-build/ninja.git;
cd ninja;
git checkout release;
./configure.py --bootstrap;
在prebuilts/ninja/下创建linux-aarch64,将下载编译好的ninja拷贝进来
4) 下载clang 工具
C语言、C++ 轻量级编译器;
可通过 sudo apt install clang 下载,也可以在官网https://pkgs.org/download/xmllint下载arm 版本的进行安装
将下载好后的工具(usr/include/clang 和/usr/include/clang++) 使用 whereis clang 查看位置拷贝到 prebuilts/clang/host/linux-x86/clang-2690385/bin
目录下进行替换原先的。这个目录依然时x86目录原因时我没有去改目录。修改目录的地方 在build/core/clang/config.mk 中进行更改clang/clang++的位置。在此还要说明 clang 编译的参数列表/build/core/definitions.mk 中定义。在编译的过程中如果发现有的c++ 程序编译不过去需要加入-std=c++11。
例如如下编译错误脚本:
/bin/bash -c “(PWD=/proc/self/cwd prebuilts/clang/host/linux-x86/clang-2690385/bin/clang++ -I external/libcxx/include/ -I external/libcxx -I out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates -I out/host/linux-aarch64/gen/STATIC_LIBRARIES/libc++_static_intermediates -I libnativehelper/include/nativehelper $(cat out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/import_includes) -isystem system/core/include -isystem system/media/audio/include -isystem hardware/libhardware/include -isystem hardware/libhardware_legacy/include -isystem hardware/ril/include -isystem libnativehelper/include -isystem frameworks/native/include -isystem frameworks/native/opengl/include -isystem frameworks/av/include -isystem frameworks/base/include -isystem tools/include -isystem out/host/linux-aarch64/obj/include -c -D__compiler_offsetof=__builtin_offsetof -Werror=int-conversion -Wno-reserved-id-macro -Wno-format-pedantic -Wno-unused-command-line-argument -fcolor-diagnostics -Wno-inconsistent-missing-override -target i686-linux-gnu -std=c++11 -MD -MF out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.d -o out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.o external/libcxx/src/stdexcept.cpp ) && (cp out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.d out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.P; sed -e ‘s/#.//’ -e 's/[:]: *//’ -e ‘s/ *\\$//’ -e ‘/^$/ d’ -e ‘s/$/ ’ < out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.d >> out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.P; rm -f out/host/linux-aarch64/obj/STATIC_LIBRARIES/libc++_static_intermediates/src/stdexcept.d )”
当我们发现有些代码编译报错后,将编译打印如上复制出来,放在android系统根目录下进行修改参数,然后执行,以此作为检查错误的手段!
5)当编译的过程中你会发现一些头文件或库文件找不到
这是因为我们使用的是系统/usr/目录下文件,此目录并不包含安卓系统所需要的的所有文件,我们需要将文件进行拷贝扩展这个是个漫长的过程需要一点点调试。改一个文件就需要编译一次,并且需要的文件比较多! 我一般查找的过程在/usr/include下有个aarch64-linux-gnu 目录可以在这个地方寻找文件拷贝到usr下进行一个个文件尝试。如果实在找不到文件,在android系统源码prebuilts/gcc/linux-x86 也是可以找到的。为节省时间可以不用make aapt 编译,直接复制报错的执行脚本进行验证!另外usr/include 只是缺少文件不存在将/usr/include下的文件覆盖的情况,所以不会影响原有系统!
6)注意limits.h
这个文件在编译external/libcxx 目录时候导致了很多错误!所花费时间最长,这个文件在usr/include是没有的,在aarch64-linux-gnu下可以找到,当把文件拷贝到/usr/include下后,依然报出很多未知莫名奇妙的错误。最后索性使用,prebuilts/gcc/linux-x86 目录下的文件进行代替,还是报很多错误,最后解决办法是将两个文件进行下了比较,aarch64-linux-gnu 下的有些内容没有定义,但是prebuilts/gcc/linux-x8下定义了,将两个文件合并编译通过!
7)undefinedreferenceto`png_init_filter_functions_neon’
最后在编译的时候的错误按照网址:https://blog.csdn.net/weixin_42330265/article/details/80484978 的方法进行解决,aapt编译成功!
Could not resolve all dependencies for configuration ‘:app:_debugApkCopy’.
Could not find any version that matches com.android.support:appcompat-v7:29.+.
Versions that do not match:
26.0.0-alpha1
25.3.1
25.3.0
25.2.0
25.1.1