androidstudio for arm aapt for a

2019-08-03  本文已影响0人  YO算子

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的!

   

上一篇下一篇

猜你喜欢

热点阅读