AndroidStudio for arm
1.下载 AndroidStudio for linux
网址:https://developer.android.google.cn/studio
并对应下载好相应的sdk (具体安装详见Androidstudio 的安装步骤)
并且编写简单的helloworld 程序。
2.安装 adb, adb 必须适应arm 版的,可以下载源码,在飞腾平台上进行编译 ,或者 飞腾下 sudo apt install adb 安装软件 需要 注意 需要替换linux 源 :
/etc/apt/source.list如下
deb [trusted=yes] http://192.168.1.99/kylin/arm64 4.0.2sp2 main restricted universe multiverse\
#ubuntu arm64
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
将编译或者下载好的adb 替换到 androidstudio sdk 目录下 的 我的主机对应的是 (/home/greatwall/AndroidStudioProjects/Android/Sdk/platform-tools/)
3. 编译 aapt, AndroidStudio 需要的资源打包工具 ,此时工具会提示 aapt 不可执行的二进制文件,android sdk 官网下载默认的是x86 格式我们需要手动编译arm 版的aapt 工具
由于 aapt 编译依赖于安卓源码编译,需要下载安卓源码 ,此步最为麻烦 ,由于aapt 编译后 会存放到out/host/linux-86/bin 下 host 目录存放的全部是x86 运行的程序(可以查阅android
编译过程了解 host target),并且在 arm cpu 下进行源码编译是编译不通过的 ,需要对安卓编译脚本进行改造!
1).下载 android 源码 我这里下载的是android-7.1.2_r36 可参考 (https://www.kaelli.com/19.html https://www.cnblogs.com/aaronLinux/p/5862235.html)
soure ./build/envsetup.sh
lunch 2
make aapt //用来直接生成 aapt 工具 此时会报错
2). 更改android 脚本
a. 更改build/core/envsetup.mk
通过 uname -sm 可以查看信息 linux aarch64
如下diff的 修改将基本信息更改为aarch64 并将SDK_HOST_ARCH 更改为aarch64 会在out 下生成linux-aarch64 目录
85,94d84
< ifneq (,$(findstring aarch64,$(UNAME)))
< HOST_ARCH := aarch64
< HOST_2ND_ARCH := arm
< HOST_IS_64_BIT := true
< else
< ifneq (,$(findstring x86,$(UNAME)))
< $(error Building on a 32-bit x86 host is not supported: $(UNAME)!)
< endif
< endif
<
114c104
< HOST_PREBUILT_ARCH := aarch64
---
> HOST_PREBUILT_ARCH := x86
149c139
< SDK_HOST_ARCH := aarch64
---
> SDK_HOST_ARCH := x86
b. 在build/core/combo 下创建 HOST_linux-aarch64.mk 此文件主要作用时指定交叉编译工具链,我们这里采用系统下默认的编译工具 详见文件
HOST_linux-aarch64.mk HOST_linux-aarch64.mk
1KB --0%
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 HOST_arm.mk
3KB --0%
将 -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 工具 可通过 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 目录和在lib/aarch6 4-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)最后在编译的时候出现undefined reference to `png_init_filter_functions_neon' 的错误 按照 网址 https://blog.csdn.net/weixin_42330265/article/details/80484978 的方法进行解决,aapt编译成功!
4. 从新整理androidstudio 将编译出的 out/host/bin/aapt 和 out/host/linux-aarch64/lib64/libc++.so 分别拷贝道sdk下载目录/home/greatwall/AndroidStudioProjects/Android/Sdk/build-tools/26.0.1 目录下和 lib64 目录下!
5.如果AndroidStudio 出现如下错误:
> 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
+ 31 more
Required by:
project :app
需要修改build.gradle 文件降低版本内容再进行编译可以通过!
6.使用 XDroid 作为工具运行模拟!AndroidStudoio 自带的AVD 是不支持arm的市面上的虚拟机也没有找到支持arm的!