找回密码
 立即注册
搜索
查看: 122|回复: 0

在 CentOS 7 下构建 Android 编译环境

[复制链接]

979

主题

90

回帖

5万

积分

管理员

积分
53052
发表于 2022-7-4 16:37:02 | 显示全部楼层 |阅读模式
( J. }: ]; e' z) _/ |
在 Android Studio 之外,还可以通过 Gradle Script 来编译 Android 项目并构建和测试应用。
4 N# f% h3 R- @本文是一个备忘录,以记录我在 x86_64 GNU/Linux 系统 CentOS Linux release 7.8.2003 下折腾 Android 编译环境的一个过程。) `# e. V' @5 U+ H6 P
% u0 C3 ]+ R3 y8 H
本文将会安装以下组件:
8 R  m: i4 v5 m) d
  1. Git
    3 g7 ]2 m  ]+ F0 F
  2. JDK 1.8) C+ U* x" j+ w
  3. Go 1.14.74 r1 u( z- }- u3 R  W$ U
  4. Android SDK
    ! q1 }+ G+ O% F6 X
  5.   Android NDK& ?/ R: O7 P# t( p6 q
  6. Rust 1.45.02 |) ^! d6 @! ~
  7.   Android Targets:
    8 L. k+ }0 J+ i; a$ q$ T+ d. E
  8.     armv7-linux-androideabi6 d' G+ G9 ?$ r8 ^2 t
  9.     aarch64-linux-android1 h1 x5 O8 Z" I  m6 v- l
  10.     i686-linux-android
    ) ^- B+ ~8 f9 ?2 @
  11.     x86_64-linux-android
复制代码
. q1 r2 T/ T% |# k; ~" L9 b! h1 E
以下的所有过程均是在 root 用户下操作。
- G$ E. D" q. R$ _( s. A8 q* s. z1. 安装 Git 和 JDK 1.8这两个组件发行版自带,通过以下命令即可安装。与此同时,再安装一些其他必要的组件 wget 和 unzip。, K0 B/ I0 p- u, W: E. I
  1. $ yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget unzip git
复制代码
完成后通过以下命令验证 JDK 版本号。
  1. $ java -version
复制代码
返回
  1. openjdk version "1.8.0_252"/ D- H# P3 B2 q! O3 C# a7 c7 d2 Y
  2. OpenJDK Runtime Environment (build 1.8.0_252-b09)
    8 T# @  }2 [4 V! @5 K9 Z# q* f' m
  3. OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码
  1. $ javac -version
复制代码
返回
  1. javac 1.8.0_252
复制代码
+ d$ t, o& B- H9 m
2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。
* L7 O* g! @. g. z9 l
  1. $ GO_VERSION=1.14.76 G# P' r5 n' Q( f; x
  2. $ wget -O /tmp/go${GO_VERSION}.tar.gz https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz
    ; [8 Y1 u# m: b/ m0 W7 C
  3. $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
    3 o* A$ {) `  H
  4. $ rm -fv /tmp/go${GO_VERSION}.tar.gz
    0 b4 n/ u! K  L1 M) G: n. Z2 n9 ?
  5. $ export PATH=/usr/local/go/bin:$PATH
复制代码
完成后通过以下命令验证 Go 版本号。
  1. $ go version
复制代码
返回
  1. go version go1.14.7 linux/amd64
复制代码
6 n* j) F, c* {* j6 D1 j, Q6 P& N
3. 安装 Android SDK 及 Android NDK假设 ANDROID_HOME 路径是 /opt/sdk。安装过程如下。
9 Y9 v5 k; h: j+ C
  1. $ mkdir -p /opt/sdk && cd /opt/sdk8 w% i2 g$ p, x6 [, ~& I) Q
  2. $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip4 R! V" V, K5 o& Y9 S) p- q% S
  3. $ unzip -q commandlinetools-linux-6609375_latest.zip
    2 g( P: v) m) s" I  y+ Y
  4. $ rm -fv commandlinetools-linux-6609375_latest.zip
    6 q3 i5 s' ^, v' r8 _0 B+ U
  5. $ export PATH=/opt/sdk/tools/bin:$PATH
    # D' `9 }* a6 [8 D/ d- z9 @- Z
  6. $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk( F0 O- w- H; k# t" r9 P9 _
  7. $ yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses
复制代码
通过 sdkmanager 来安装一些组件。一条命令一步到位。如下。
  1. $ sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools" "platforms;android-30" "platforms;android-29" "ndk-bundle" "ndk;21.0.6113669" "build-tools;29.0.2"
复制代码
完成后,确认已安装的列表。
  1. $ sdkmanager --sdk_root=${ANDROID_HOME} --list
复制代码
返回
  1. Installed packages:
    & S% Z5 E7 s) b7 Z$ I8 i: J8 _
  2.   Path                 | Version      | Description                     | Location             ; [0 c" [# n3 Z9 L' ?& K
  3.   -------              | -------      | -------                         | -------              
    - n& ]- N' L! P# u4 o0 n
  4.   build-tools;29.0.2   | 29.0.2       | Android SDK Build-Tools 29.0.2  | build-tools/29.0.2/  
    3 f- k7 p( e) H  @& G4 \
  5.   ndk-bundle           | 21.3.6528147 | NDK                             | ndk-bundle/          . h: D2 S" i$ j' v4 E0 p( u  @3 Z
  6.   ndk;21.0.6113669     | 21.0.6113669 | NDK (Side by side) 21.0.6113669 | ndk/21.0.6113669/   
    ) B9 r5 B" ]. r1 W% G. d
  7.   patcher;v4           | 1            | SDK Patch Applier v4            | patcher/v4/         
    9 M; e& j5 c+ ^( ^
  8.   platform-tools       | 30.0.3       | Android SDK Platform-Tools      | platform-tools/      5 Y4 ~# }$ r- Y0 F2 g- {9 Q% S
  9.   platforms;android-29 | 4            | Android SDK Platform 29         | platforms/android-29/
    , W6 F& ^) q9 H* P9 s
  10.   platforms;android-30 | 1            | Android SDK Platform 30         | platforms/android-30/
    3 X- x7 f4 v6 v- B" u7 X3 [
  11.   tools                | 2.1.0        | Android SDK Tools 2.1           | tools/               
    # W8 D7 q7 I( s# m6 Q' t5 H
  12. Available Packages:" Z8 \& t& I$ r) s6 w' B
  13.   以下省略
复制代码
+ e* P; e" M& `( M. D  u
4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。
' A) T. x; S7 _6 v8 j* I
  1. $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
    . T7 o% Q& g! e% ]2 i4 m
  2. $ RUST_VERSION=1.45.0/ Y5 S, |' i! U2 g, E
  3. $ RUSTARCH='x86_64-unknown-linux-gnu'/ |5 W3 I$ m4 I3 m) e1 G
  4. $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"  r% c/ y  M+ W; x; e
  5. $ chmod 755 /tmp/rustup-init
    - r6 b8 m- U/ D+ W0 h4 v1 ^3 w
  6. $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION" K- H4 A, Z5 F* c8 s) K! x
  7. $ rm -fv /tmp/rustup-init$ u# L& c1 K# g3 n
  8. $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}0 ^1 c. [  G& ]7 T
  9. $ export PATH=/usr/local/cargo/bin:$PATH
复制代码
完成后通过以下命令验证 Rust 及组件的版本号。
  1. $ rustup --version
复制代码
返回
  1. rustup 1.21.1 (7832b2ebe 2019-12-20)
复制代码
  1. $ cargo --version
复制代码
返回
  1. cargo 1.45.0 (744bd1fbb 2020-06-15)
复制代码
  1. $ rustc --version
复制代码
返回
  1. rustc 1.45.0 (5c1f21c3b 2020-07-13)
复制代码
Rust 安装以下 Android Targets:
  1. armv7-linux-androideabi
    ' T: g" s5 r. _. P& H4 ?
  2. aarch64-linux-android
    4 S; O5 M" n8 k8 N
  3. i686-linux-android6 }6 j2 N8 M; C2 s5 e
  4. x86_64-linux-android
复制代码
安装过程如下。
  1. $ rustup install stable6 v* U4 z5 b( {- o/ q8 k% I% P& l; n
  2. $ rustup default stable- S3 Q: `8 n1 A5 y( c
  3. $ rustup target add armv7-linux-androideabi8 L: e7 {0 j% B. q' {
  4. $ rustup target add i686-linux-android  w# y. A! i2 W/ g5 r: T
  5. $ rustup target add aarch64-linux-android
    4 h* y  Q- Z1 X  D; \; `
  6. $ rustup target add x86_64-linux-android
复制代码
% ]' ]) \, r2 ]
5. 持久化环境变量上面的安装步骤是通过 export 来定义系统 PATH 的,在退出当前登录后就会丢失设置。
. Q$ [! X, `& w0 b因此需要持久化一些环境变量。6 e1 N+ i9 N' P
编辑 ~/.bash_profile 文件。添加 ANDROID_HOME,RUSTUP_HOME,CARGO_HOME 的定义以及增加 PATH 定义。- {  G/ i0 b' n: b5 t6 c9 O! D
最后呈现内容如下。
9 l( n% o8 ?# N1 p; z
  1. # .bash_profile5 r$ J1 l& c2 v, z6 ^

  2. / f3 d0 T2 |1 a
  3. # Get the aliases and functions
    ( d- z/ R9 X7 Q
  4. if [ -f ~/.bashrc ]; then7 |4 h& ~& a6 Y8 C+ U8 q0 _! _3 q& {
  5. . ~/.bashrc
    - \8 T8 f7 U) D
  6. fi0 {" h2 N) O# l

  7. # J5 Z; N/ v) E
  8. # User specific environment and startup programs( h, I5 ~5 d$ i
  9. / f/ Y  b4 b% g5 k" o3 {( {. p
  10. export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
    3 c7 y$ N) N9 G/ n" f

  11. , @- S  J  V" s" _) o, L& v  y* e/ K
  12. PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin
    $ h/ d: p: J4 z1 U1 s* O

  13. 2 c; n$ l) j7 f
  14. export PATH
复制代码
. m2 z3 H* q" B+ t: K" C: x
6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android7 T7 ^6 F# A% r$ J5 Y  N2 n1 {
编译过程如下。: f6 h' q9 t+ a9 t! D
  1. $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git
    7 s& u! K6 r- n' K  Y
  2. $ cd v2ray-plugin-android# X" J& G$ t0 N% N
  3. $ git submodule update --init --recursive- K$ g3 F* Z. [  P- g+ h
  4. $ ./gradlew assembleRelease
复制代码

/ i2 Z% g7 T/ n; {2 o! y完成后,编译好的 apk 文件位于 app/build/outputs/apk/release 路径下。+ {% y$ B" c- ^* W
Android 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。* z/ m; Y2 h  X2 I  a
因此这些 apk 文件还不能被直接拿来安装。
& y5 Y( u2 V8 d4 y! ^8 `3 ]至于如何签名,请参考以下链接,过程省略。
0 C7 p, |& A1 P  S% x& z1 D! jhttps://developer.android.com/studio/publish/app-signing
: e# r% R* a" ?0 b  `+ m1 R: [7. 总结当你习惯于用命令行做事的时候,你会发现效率往往会有很大的提升。编译代码亦是如此。, K4 b7 N! v' C, g$ R# q  H9 M
4 K3 E% o% D3 T$ b
* K* w' F7 w! a# I9 g
# K7 p& g5 `" r
- R! C) U- k+ N! G6 z! C: U! z, |, C

4 I) U6 P8 m$ C5 J& F  U3 C! ]
) y8 T% u- |- V: C4 N' x
2 W& Y! _5 D. s3 @- P
) L9 G! _' y7 @/ t2 U( R
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-2-25 00:11 , Processed in 0.103455 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表