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

在 CentOS 7 下构建 Android 编译环境

[复制链接]
发表于 2022-7-4 16:37:02 | 显示全部楼层 |阅读模式
7 _! w3 A! a* u/ [
在 Android Studio 之外,还可以通过 Gradle Script 来编译 Android 项目并构建和测试应用。
" |  T5 S3 s2 v  B本文是一个备忘录,以记录我在 x86_64 GNU/Linux 系统 CentOS Linux release 7.8.2003 下折腾 Android 编译环境的一个过程。: E( ]& c# x. A! G
# D! e/ q0 J& T) P/ {* k+ t
本文将会安装以下组件:
" s0 _, `3 |9 t2 O5 ~8 i
  1. Git
    " S4 c5 c" h( g! i7 m
  2. JDK 1.8# |+ I" Z. K: H
  3. Go 1.14.7
    1 ~  ~; m# n$ ?, c0 _0 m6 h4 V
  4. Android SDK& z/ `" G* f+ Z! g
  5.   Android NDK
    9 [) [4 Z7 j2 C0 ~! M
  6. Rust 1.45.0
    1 [( j4 v+ z, k$ x* X
  7.   Android Targets:
    1 e" H5 B4 p6 s5 q% d
  8.     armv7-linux-androideabi
    % P/ g6 B; S* s! j
  9.     aarch64-linux-android* c; j; P/ `3 ~
  10.     i686-linux-android1 Y: a( w4 u) g( N0 _' K) e
  11.     x86_64-linux-android
复制代码

8 [! z5 w7 }$ O5 O以下的所有过程均是在 root 用户下操作。) b2 Z, C- @3 L: L
1. 安装 Git 和 JDK 1.8这两个组件发行版自带,通过以下命令即可安装。与此同时,再安装一些其他必要的组件 wget 和 unzip。
2 ^. U9 p6 C9 E$ q/ o; o, p
  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"0 R) y) {( K# T
  2. OpenJDK Runtime Environment (build 1.8.0_252-b09)
    / X' |1 W0 c1 ^. u( L$ G9 Z  f
  3. OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码
  1. $ javac -version
复制代码
返回
  1. javac 1.8.0_252
复制代码
4 C/ [6 `2 ~/ y; J3 l7 i# m. e# @
2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。
4 M4 T' X' l5 h1 h( C) c
  1. $ GO_VERSION=1.14.7" _" i$ T* s3 Q
  2. $ wget -O /tmp/go${GO_VERSION}.tar.gz https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz
    7 D  K  h/ i) M( l  b' l
  3. $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
    1 q' k, \* R9 F5 f
  4. $ rm -fv /tmp/go${GO_VERSION}.tar.gz
    + l6 w1 b" d8 d6 z# ]5 K
  5. $ export PATH=/usr/local/go/bin:$PATH
复制代码
完成后通过以下命令验证 Go 版本号。
  1. $ go version
复制代码
返回
  1. go version go1.14.7 linux/amd64
复制代码
& q, k% M' [3 }
3. 安装 Android SDK 及 Android NDK假设 ANDROID_HOME 路径是 /opt/sdk。安装过程如下。# }7 V' [% r1 g" E) G( c
  1. $ mkdir -p /opt/sdk && cd /opt/sdk
    5 N( b3 y4 U. q7 M4 [# b; ?3 h
  2. $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip$ e3 s7 x, l2 P# m" O6 D9 @* N
  3. $ unzip -q commandlinetools-linux-6609375_latest.zip- T2 o& c0 e3 I7 S- _  q( `2 N
  4. $ rm -fv commandlinetools-linux-6609375_latest.zip
    . W( H( {' \1 L9 g: a' ?
  5. $ export PATH=/opt/sdk/tools/bin:$PATH+ b" a) t% m! e2 Y  T) u4 i
  6. $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk; t" T8 b+ q5 j/ s
  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:* d8 c/ E5 n& S
  2.   Path                 | Version      | Description                     | Location            
    9 H" D! |. P. C! u. |, o
  3.   -------              | -------      | -------                         | -------              6 r, ~5 I7 u. S
  4.   build-tools;29.0.2   | 29.0.2       | Android SDK Build-Tools 29.0.2  | build-tools/29.0.2/    A4 H- r- E5 `4 T, l5 Q
  5.   ndk-bundle           | 21.3.6528147 | NDK                             | ndk-bundle/          ' F; s# n' m- F1 W& p  y) E% t, S
  6.   ndk;21.0.6113669     | 21.0.6113669 | NDK (Side by side) 21.0.6113669 | ndk/21.0.6113669/    . D' }  C/ ^* B* x* Q; A! b# u) h
  7.   patcher;v4           | 1            | SDK Patch Applier v4            | patcher/v4/          8 @* M( \! v- M! S5 l) m5 U& `! s
  8.   platform-tools       | 30.0.3       | Android SDK Platform-Tools      | platform-tools/      8 c' I4 U( h0 [( _  Y( p
  9.   platforms;android-29 | 4            | Android SDK Platform 29         | platforms/android-29/
    ) f  [5 H* k3 \
  10.   platforms;android-30 | 1            | Android SDK Platform 30         | platforms/android-30/5 Z8 ~: B0 l- l8 f! P) F% R9 h9 ~
  11.   tools                | 2.1.0        | Android SDK Tools 2.1           | tools/               # H( T& V* ^; i" B+ b) E
  12. Available Packages:
    . K0 J5 H: c# C6 x! S# ^  Z
  13.   以下省略
复制代码

% U/ v2 V5 c) E" i. T, n2 ^4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。* X/ ]6 f1 g6 ^. d, I
  1. $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
    0 E# \; R$ V3 {3 x6 X
  2. $ RUST_VERSION=1.45.0
    + s5 q* _% s/ Z% {7 q
  3. $ RUSTARCH='x86_64-unknown-linux-gnu'! M- i: N9 E% f3 M* I! V
  4. $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"+ f: E8 P! E0 J" r
  5. $ chmod 755 /tmp/rustup-init% C7 q, _9 u5 b: J& J
  6. $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION8 T. g) ^4 d2 _* [/ x7 h: _8 K
  7. $ rm -fv /tmp/rustup-init5 u! p0 j8 g7 o, y& U. f
  8. $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}
    ! ?7 p8 e) f: q0 e1 \
  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-androideabi4 C# u; \0 U/ C; N: g. h# g5 g5 ~
  2. aarch64-linux-android8 [5 A/ ~6 H# e$ b
  3. i686-linux-android3 w8 @+ C( x" ~7 g" h
  4. x86_64-linux-android
复制代码
安装过程如下。
  1. $ rustup install stable/ ^* S3 a+ j$ B) O! i) ]
  2. $ rustup default stable" r7 u- K, `# o! [/ B4 t4 R* M& r- i
  3. $ rustup target add armv7-linux-androideabi; U9 w" t' g$ ^- G5 [
  4. $ rustup target add i686-linux-android
    : \' U* z% l- i6 o! p- ^
  5. $ rustup target add aarch64-linux-android$ K7 L4 i9 M, [* L, F, w( u, a
  6. $ rustup target add x86_64-linux-android
复制代码
! r6 H) P2 l1 O- ]) Q
5. 持久化环境变量上面的安装步骤是通过 export 来定义系统 PATH 的,在退出当前登录后就会丢失设置。
/ ]8 w: n* Z3 m因此需要持久化一些环境变量。
2 C* v+ ]) W+ t, `. j) b* d$ J! x7 `  w编辑 ~/.bash_profile 文件。添加 ANDROID_HOME,RUSTUP_HOME,CARGO_HOME 的定义以及增加 PATH 定义。
% F' [+ u) j+ F) E* v1 W最后呈现内容如下。/ d) J5 R1 D2 v, h
  1. # .bash_profile
    $ N% Q5 V/ R' h0 g' H

  2. 8 I. T/ n9 P& I+ r3 o
  3. # Get the aliases and functions  c7 n5 O& ^2 E5 {9 a9 L
  4. if [ -f ~/.bashrc ]; then
    6 K+ h% k# G0 B* x% C( i- ~3 q" c
  5. . ~/.bashrc& E, S0 \# L5 U/ n
  6. fi3 I5 o6 c: W& o8 A7 v
  7. % s, [5 o- r$ j$ E
  8. # User specific environment and startup programs0 }5 R% q( ^7 D  Z9 z' L# w+ l* j
  9. " N- K2 A4 V; c3 ^+ N) K
  10. export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo  N; H0 J0 L+ W% L* k% ~: |, P
  11. * Z% q* J, J+ Z( M0 ~; K* Q8 x
  12. PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin
    3 C3 I  c8 K( @' g/ K  t. p
  13.   O* F8 s$ |# Q0 p# ^/ I" _
  14. export PATH
复制代码
' h" B- Y4 S. k
6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android。
! {" V$ P/ i3 P% F5 w  e1 ?编译过程如下。
' v& M9 E# H. P2 n: N
  1. $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git
    4 d' d9 m- s6 ]: _* ?! i5 G
  2. $ cd v2ray-plugin-android: y5 x. N. w) J/ U
  3. $ git submodule update --init --recursive4 w8 L" ~$ e! l% _3 W6 d
  4. $ ./gradlew assembleRelease
复制代码

( h3 q' Z$ R) [/ G+ A4 v完成后,编译好的 apk 文件位于 app/build/outputs/apk/release 路径下。
) j) h* ]" k0 r, p, C0 p; @: p/ EAndroid 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。
5 C  r/ Y' d# A# b% P+ @5 }因此这些 apk 文件还不能被直接拿来安装。8 v+ G7 P2 F. U3 ^! Q* e
至于如何签名,请参考以下链接,过程省略。
4 l, z, y3 w+ D6 n1 U* U  ?( Ihttps://developer.android.com/studio/publish/app-signing
: W4 D; K: X, Y% _7. 总结当你习惯于用命令行做事的时候,你会发现效率往往会有很大的提升。编译代码亦是如此。
" z4 K* l; U: K: k0 A8 f& z: o' e7 f. ~

( U& i- V; A* @! ~
# q0 O+ H$ I; f" L
6 T2 l1 f9 G* w5 ^2 ^' a. ^5 W: v  Q( p, e5 |6 k" ~
7 Y3 C! }/ t, R) F8 m' k
) R0 @0 C! \' M7 l( T  y, {
) L3 u7 r6 A/ b/ v! v
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-3 02:34 AM , Processed in 0.098468 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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