如何选取 android 系统上的编译工具链

https://mdgsf.github.io/2020/07/23/miscellanea-cpu/

 

先介绍一些基础背景知识。

  1. Intel. 我们一般买的电脑都是 Intel 的 CPU。
  2. AMD. AMD 是 Intel 的最大竞争对手。AMD 的 CPU 一般也用在电脑上。
  3. ARM. ARM 的芯片一般用在手机、平板上。我的手机就是高通骁龙的。

ARM 有两层含义:

  1. ARM. 是一家半导体芯片设计研发的企业。
  2. ARM. 是与 x86 平级的 CPU 架构。

ARM CPU 架构与 x86 CPU 架构的区别:

  1. ARM CPU 架构使用 RISC(精简指令集)。
  2. x86 CPU 架构使用 CISC(复杂指令集)。

每个 CPU 都会实现一套指令集,也叫做 Instruction Set Architecture,简称 ISA

标题上的这些名字表示的是不同平台的 CPU 架构。

  1. armarm32armv7 是 32 位 ARMv7 架构。
  2. arm64aarch64 是 64 位 ARMv8 架构。
  3. x86i386i686 是 32 位 Intel x86 架构。
  4. x86_64amd64 是 64 位 Intel x86 架构。

现在的手机和电脑一般都是 64 位的,所以如果要给手机编译一个软件,一般使用 aarch64 类型的交叉编译工具链。

 

 

交叉编译工具链三元组格式介绍

Triple 三元组格式:

{arch}-{vendor}-{sys}-{abi}

明明是 4 个项,不知道为什么叫三元组。

例子:

arm-unknown-linux-gnueabihf
  • 架构(architecture):arm。
  • 供应商(vendor):unknown。这里 unknown 就是未指定供应商或者是不重要。
  • 系统(system):linux。
  • ABI:gnueabihf。gnueabihf 表示系统使用 glibc 作为其 C 标准库 libc 实现, 并且具有硬件加速浮点算法。

然后有的 triple 三元组会把供应商(vendor)或 ABI 给省略掉。例如:

x86_64-apple-darwin
  • 架构(architecture):x86_64。
  • 供应商(vendor):apple。
  • 系统(system):darwin。

那我们要怎么确定我们要用哪一个呢?

  • 架构(architecture):在 UNIX 系统上,我们可以使用 uname -m 查看。
  • 供应商(vendor):Linux 通常是 unknown,Windows 是 pc,OSX/IOS 是 apple
  • 系统(system):在 UNIX 系统上,我们可以使用 uname -s 查看。
  • ABI:Linux 上可以使用 ldd --version 查看。Mac 和 *BSD 忽略这个选项。Windows 是 gnu 或 msvc

因为我们是要给 64 位的 android 系统使用,所以一定要有 aarch64 和 android 出现,这样就可以排除掉其他不可以使用的了。 下面我们看具体要怎么选。

 

android 编译工具链

你可以从 ndk 下载 地址下载最新的 ndk。目前最新的稳定版本是 r21b。 我这里是 ubuntu 系统,所以下载 android-ndk-r21b-linux-x86_64.zip 这个压缩包。 解压之后得到 android-ndk-r21b 这个目录,比如就解压到 HOME 目录 /home/huangjian 下面。

我们可以编写一个如下的编译脚本,来编译最简单的 hello world 的 cpp 程序。

export NDK=/home/huangjian/android-ndk-r21b
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export API=29

export AR=$TOOLCHAIN/bin/$TARGET-ar
export AS=$TOOLCHAIN/bin/$TARGET-as
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/$TARGET-ld
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export STRIP=$TOOLCHAIN/bin/$TARGET-strip

echo 'AR = '$AR
echo 'AS = '$AS
echo 'CC = '$CC
echo 'CXX = '$CXX
echo 'LD = '$LD
echo 'RANLIB = '$RANLIB
echo 'STRIP = '$STRIP

$CC hello.cpp -o hello

我们可以看到在目录 /home/huangjian/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/bin 下面,有非常多的不同 CPU 架构的编译器,我们需要选择其中一个来使用。上面的编译脚本中, 我们选择的是 aarch64-linux-android29-clang。数字 29 是 API 的级别,详见 什么是 API 级别?

aarch64-linux-android21-clang       armv7a-linux-androideabi23-clang    ld.lld
aarch64-linux-android21-clang++     armv7a-linux-androideabi23-clang++  lldb-argdumper
aarch64-linux-android22-clang       armv7a-linux-androideabi24-clang    llvm-addr2line
aarch64-linux-android22-clang++     armv7a-linux-androideabi24-clang++  llvm-ar
aarch64-linux-android23-clang       armv7a-linux-androideabi26-clang    llvm-as
aarch64-linux-android23-clang++     armv7a-linux-androideabi26-clang++  llvm-cfi-verify
aarch64-linux-android24-clang       armv7a-linux-androideabi27-clang    llvm-config
aarch64-linux-android24-clang++     armv7a-linux-androideabi27-clang++  llvm-cov
aarch64-linux-android26-clang       armv7a-linux-androideabi28-clang    llvm-dis
aarch64-linux-android26-clang++     armv7a-linux-androideabi28-clang++  llvm-lib
aarch64-linux-android27-clang       armv7a-linux-androideabi29-clang    llvm-link
aarch64-linux-android27-clang++     armv7a-linux-androideabi29-clang++  llvm-modextract
aarch64-linux-android28-clang       bisect_driver.py                    llvm-nm
aarch64-linux-android28-clang++     clang                               llvm-objcopy
aarch64-linux-android29-clang       clang++                             llvm-objdump
aarch64-linux-android29-clang++     clang-check                         llvm-profdata
aarch64-linux-android-addr2line     clang-cl                            llvm-ranlib
aarch64-linux-android-ar            clang-format                        llvm-readelf
aarch64-linux-android-as            clang-tidy                          llvm-readobj
aarch64-linux-android-c++filt       clang-tidy.real                     llvm-size
aarch64-linux-android-dwp           dsymutil                            llvm-strings
aarch64-linux-android-elfedit       git-clang-format                    llvm-strip
aarch64-linux-android-gprof         i686-linux-android16-clang          llvm-symbolizer
aarch64-linux-android-ld            i686-linux-android16-clang++        sancov
aarch64-linux-android-ld.bfd        i686-linux-android17-clang          sanstats
aarch64-linux-android-ld.gold       i686-linux-android17-clang++        scan-build
aarch64-linux-android-nm            i686-linux-android18-clang          scan-view
aarch64-linux-android-objcopy       i686-linux-android18-clang++        x86_64-linux-android21-clang
aarch64-linux-android-objdump       i686-linux-android19-clang          x86_64-linux-android21-clang++
aarch64-linux-android-ranlib        i686-linux-android19-clang++        x86_64-linux-android22-clang
aarch64-linux-android-readelf       i686-linux-android21-clang          x86_64-linux-android22-clang++
aarch64-linux-android-size          i686-linux-android21-clang++        x86_64-linux-android23-clang
aarch64-linux-android-strings       i686-linux-android22-clang          x86_64-linux-android23-clang++
aarch64-linux-android-strip         i686-linux-android22-clang++        x86_64-linux-android24-clang
arm-linux-androideabi-addr2line     i686-linux-android23-clang          x86_64-linux-android24-clang++
arm-linux-androideabi-ar            i686-linux-android23-clang++        x86_64-linux-android26-clang
arm-linux-androideabi-as            i686-linux-android24-clang          x86_64-linux-android26-clang++
arm-linux-androideabi-c++filt       i686-linux-android24-clang++        x86_64-linux-android27-clang
arm-linux-androideabi-dwp           i686-linux-android26-clang          x86_64-linux-android27-clang++
arm-linux-androideabi-elfedit       i686-linux-android26-clang++        x86_64-linux-android28-clang
arm-linux-androideabi-gprof         i686-linux-android27-clang          x86_64-linux-android28-clang++
arm-linux-androideabi-ld            i686-linux-android27-clang++        x86_64-linux-android29-clang
arm-linux-androideabi-ld.bfd        i686-linux-android28-clang          x86_64-linux-android29-clang++
arm-linux-androideabi-ld.gold       i686-linux-android28-clang++        x86_64-linux-android-addr2line
arm-linux-androideabi-nm            i686-linux-android29-clang          x86_64-linux-android-ar
arm-linux-androideabi-objcopy       i686-linux-android29-clang++        x86_64-linux-android-as
arm-linux-androideabi-objdump       i686-linux-android-addr2line        x86_64-linux-android-c++filt
arm-linux-androideabi-ranlib        i686-linux-android-ar               x86_64-linux-android-dwp
arm-linux-androideabi-readelf       i686-linux-android-as               x86_64-linux-android-elfedit
arm-linux-androideabi-size          i686-linux-android-c++filt          x86_64-linux-android-gprof
arm-linux-androideabi-strings       i686-linux-android-dwp              x86_64-linux-android-ld
arm-linux-androideabi-strip         i686-linux-android-elfedit          x86_64-linux-android-ld.bfd
armv7a-linux-androideabi16-clang    i686-linux-android-gprof            x86_64-linux-android-ld.gold
armv7a-linux-androideabi16-clang++  i686-linux-android-ld               x86_64-linux-android-nm
armv7a-linux-androideabi17-clang    i686-linux-android-ld.bfd           x86_64-linux-android-objcopy
armv7a-linux-androideabi17-clang++  i686-linux-android-ld.gold          x86_64-linux-android-objdump
armv7a-linux-androideabi18-clang    i686-linux-android-nm               x86_64-linux-android-ranlib
armv7a-linux-androideabi18-clang++  i686-linux-android-objcopy          x86_64-linux-android-readelf
armv7a-linux-androideabi19-clang    i686-linux-android-objdump          x86_64-linux-android-size
armv7a-linux-androideabi19-clang++  i686-linux-android-ranlib           x86_64-linux-android-strings
armv7a-linux-androideabi21-clang    i686-linux-android-readelf          x86_64-linux-android-strip
armv7a-linux-androideabi21-clang++  i686-linux-android-size             yasm
armv7a-linux-androideabi22-clang    i686-linux-android-strings
armv7a-linux-androideabi22-clang++  i686-linux-android-strip

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要下载Android编译工具,您可以按照以下步骤进行操作: 首先,打开您的浏览器,然后在搜索引擎中搜索“Android编译工具下载”。您会看到许多网站和资源提供这些工具的下载。 根据您的需求和喜好,选择一个您信任的网站来下载反编译工具。请注意,确保您从可靠的和官方的网站下载这些工具,以避免安全风险。 一旦您打开选择的网站,找到适合您的Android编译工具并选择下载选项。通常,这些工具会提供Windows、Mac和Linux等不同操作系统版本的下载。 单击下载按钮后,选择保存文件的位置。最好将其保存在自己容易找到的文件夹中,以方便后续使用。 下载完成后,导航到保存工具的文件夹,并解压缩下载的文件。大多数情况下,这可以通过右键单击文件并选择“解压缩”选项来完成。 完成解压缩后,您可以找到反编译工具的可执行文件。双击该文件,它将开始运行。 请注意,某些反编译工具可能需要您在计算机上安装Java运行时环境(JRE)。如果您尚未安装JRE,请按照指示从官方Java网站进行安装。 完成这些步骤后,您就可以使用所下载的Android编译工具。具体的使用方法和功能可以在工具的官方网站或帮助文档中找到。 总之,下载Android编译工具需要在可靠的网站上找到并选择合适的工具进行下载。记得保存并解压缩下载的文件,然后按照工具提供的说明启动和使用该工具。 ### 回答2: 在网上可以找到许多可供下载的Android编译工具,这些工具可以帮助开发者分析和修改已编译Android应用程序。以下是一些常见的Android编译工具: 1. Apktool:这是一个开源工具,用于反编译和重新编译Android应用程序。它可以提取应用程序的资源文件和源代码,使开发者可以查看和修改其中的内容。 2. jadx:这是一个用于反编译DEX文件(Dalvik Executable)的工具,可以将Android应用程序转换为易于阅读和理解的Java代码。它还提供了图形用户界面,方便用户进行操作。 3. dex2jar:这是一个将DEX文件转换为JAR文件的工具,使开发者可以使用Java反编译工具来查看和修改Android应用程序。它还可以将转换后的JAR文件导入到集成开发环境(IDE)中进行进一步的分析和开发。 4. JEB Decompiler:这是一个专业的反编译工具,可以将Android应用程序转换为易读的Java源代码。它提供了强大的分析和调试功能,方便开发者进行逆向工程和应用程序的修改。 需要注意的是,反编译工具的使用应遵守法律法规和道德规范,不应用于非法目的。反编译他人应用程序可能涉及侵犯知识产权和违反隐私等问题,因此使用者需谨慎使用,并尊重他人的权利和隐私。 ### 回答3: android编译工具是一种用于提取和分析已编译Android应用程序的工具。反编译工具可以将已编译的apk文件转换成可读性更高的源代码,使开发者能够了解应用程序的内部结构和实现细节。 要下载android编译工具,可以按照以下步骤进行操作: 第一步,打开互联网浏览器,搜索并进入可信任的下载网站,如Github、SourceForge或官方网站等。 第二步,使用关键词搜索“Android编译工具”,比如常用的工具有Apktool、Dex2jar、JD-GUI等。根据个人需求和使用习惯选择合适的工具。 第三步,进入所选工具的下载页面,通常会提供多个版本以及源代码和二进制文件的下载选项。根据自己的需要选择适合的版本进行下载。 第四步,点击下载接开始下载反编译工具。根据网络速度和文件大小的不同,下载时间可能会有所变化。请确保网络连接稳定,避免中断和下载错误。 第五步,下载完成后,找到下载的文件并解压缩(如果需要)。根据所选工具的安装和配置要求进行相应操作。 第六步,启动已安装的工具,并使用它来打开或导入想要反编译的apk文件。工具将进行分析和转换,生成可读性更高的源代码或其他相关文件。 总之,下载android编译工具并不复杂,只需要通过合适的渠道找到可信任的工具和下载接,按照指引进行操作即可。但请注意,反编译和分析他人的应用程序可能涉及法律和道德问题,请在合法和适当的情况下使用反编译工具

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值