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

在 CentOS 7 下构建 Android 编译环境

[复制链接]

985

主题

92

回帖

5万

积分

管理员

积分
53561
发表于 2022-7-4 16:37:02 | 显示全部楼层 |阅读模式
# M( P& j8 }$ V- [
在 Android Studio 之外,还可以通过 Gradle Script 来编译 Android 项目并构建和测试应用。
9 k8 C! S& p0 o" P/ G$ l本文是一个备忘录,以记录我在 x86_64 GNU/Linux 系统 CentOS Linux release 7.8.2003 下折腾 Android 编译环境的一个过程。
" N, t' D" W0 w1 ?
" h% b2 E* o' k% s9 L6 t本文将会安装以下组件:
9 G. N' }0 U( u  A
  1. Git
    ' _, }( o/ x! H) f: `6 @
  2. JDK 1.8! V3 M8 ^) Q7 e( u/ B
  3. Go 1.14.7
    5 D% M# b! x; ]2 z6 H
  4. Android SDK* v# x) w  k: C* I
  5.   Android NDK
    0 A  M* T5 G1 e, r4 @$ Y7 Z7 m* r
  6. Rust 1.45.0
    , |. b% u. ^8 I/ e0 o. g
  7.   Android Targets:8 D5 _- p0 X* `+ ]
  8.     armv7-linux-androideabi
    - W4 h, A0 Q7 ]
  9.     aarch64-linux-android
    ) k1 c1 x! a7 ^9 Z3 C3 O8 h2 @7 `
  10.     i686-linux-android- U' W0 b0 R" V2 t
  11.     x86_64-linux-android
复制代码

9 _4 ?6 n" I- y: A- q; M" P: O以下的所有过程均是在 root 用户下操作。' [+ k5 W' B! Q3 R6 `
1. 安装 Git 和 JDK 1.8这两个组件发行版自带,通过以下命令即可安装。与此同时,再安装一些其他必要的组件 wget 和 unzip。
. D$ c5 H- q$ m
  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"
    ) z) w5 k3 P6 v" d
  2. OpenJDK Runtime Environment (build 1.8.0_252-b09)( V) b5 s) Q2 {8 ^) E0 h
  3. OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码
  1. $ javac -version
复制代码
返回
  1. javac 1.8.0_252
复制代码

7 N8 c( Q* [; @3 u2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。  j: {, y) t7 P+ ?% e2 o( g& t
  1. $ GO_VERSION=1.14.7# E6 x  `0 T( ?
  2. $ wget -O /tmp/go${GO_VERSION}.tar.gz https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz
    9 t+ |0 r% ^& V* B& |2 c
  3. $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
    1 X. E) i& c0 \* p; C+ ^/ `
  4. $ rm -fv /tmp/go${GO_VERSION}.tar.gz
    ( E& L" A3 Y  a& ?4 E
  5. $ export PATH=/usr/local/go/bin:$PATH
复制代码
完成后通过以下命令验证 Go 版本号。
  1. $ go version
复制代码
返回
  1. go version go1.14.7 linux/amd64
复制代码
3 o! ?5 C) `6 ^  ^
3. 安装 Android SDK 及 Android NDK假设 ANDROID_HOME 路径是 /opt/sdk。安装过程如下。' J# S! Y8 t% A# i
  1. $ mkdir -p /opt/sdk && cd /opt/sdk) x  x  _* R2 C- v6 M- T
  2. $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip$ h6 A% @. l7 ^5 a; m
  3. $ unzip -q commandlinetools-linux-6609375_latest.zip
    5 ^* q4 K- O6 w- o. Q& ~+ q6 v5 ]! B+ W$ ?
  4. $ rm -fv commandlinetools-linux-6609375_latest.zip
    8 R, W1 R! a- H% N2 [& ]
  5. $ export PATH=/opt/sdk/tools/bin:$PATH6 R& |+ E7 U4 E' S, M0 |6 ~
  6. $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk- J. c$ a8 r, C0 t7 ]
  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:! R3 l. D* z" @- `3 z
  2.   Path                 | Version      | Description                     | Location             ( i( W! l/ a# _2 U4 W0 ]
  3.   -------              | -------      | -------                         | -------              
    ' J* g1 E8 i; Y2 Q  P; k" D5 x
  4.   build-tools;29.0.2   | 29.0.2       | Android SDK Build-Tools 29.0.2  | build-tools/29.0.2/  % m" r) d7 V" a" u9 {/ @
  5.   ndk-bundle           | 21.3.6528147 | NDK                             | ndk-bundle/         
    0 ]- K9 K; i5 x8 Y7 g5 d! `. @
  6.   ndk;21.0.6113669     | 21.0.6113669 | NDK (Side by side) 21.0.6113669 | ndk/21.0.6113669/    / |4 V# P. I) T) G5 f# s
  7.   patcher;v4           | 1            | SDK Patch Applier v4            | patcher/v4/         
    5 _3 ^2 H  }, \( v
  8.   platform-tools       | 30.0.3       | Android SDK Platform-Tools      | platform-tools/      
    5 x4 U! E7 r+ T0 w1 U7 C0 I
  9.   platforms;android-29 | 4            | Android SDK Platform 29         | platforms/android-29/
    : C4 M$ t/ o6 b, |- [  ~5 G8 F+ e! L
  10.   platforms;android-30 | 1            | Android SDK Platform 30         | platforms/android-30/" S/ F6 Z- w$ g* @0 {/ C! ^' y1 p
  11.   tools                | 2.1.0        | Android SDK Tools 2.1           | tools/               
    . ]. D: A- n* F( Z1 e$ }( X
  12. Available Packages:
    7 `, n+ S5 K8 o  d) g+ `
  13.   以下省略
复制代码
3 j- y, ^8 C1 u+ l. b
4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。
  W6 C& p! O5 i- Z& L) o
  1. $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
    ! d) Z7 f1 C5 c) l) ~" {
  2. $ RUST_VERSION=1.45.0* ]/ X( T  [& [/ }' a# U
  3. $ RUSTARCH='x86_64-unknown-linux-gnu'
    ' u: m  E# R, U' x/ }. q# \
  4. $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"4 p% {: f2 i' U
  5. $ chmod 755 /tmp/rustup-init
    ' B& l5 K$ @; J3 q$ M
  6. $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION8 d4 y* _5 T. E
  7. $ rm -fv /tmp/rustup-init
    ( d7 W) @+ ^! X# T& g) I! G3 R
  8. $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}
    3 F! J% |- Z; O! t5 m
  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/ ?2 J* L$ j, H% f: Y  ^$ s5 d9 F1 z
  2. aarch64-linux-android" M& {$ m! k! ~
  3. i686-linux-android! x: j' L/ R, |& t
  4. x86_64-linux-android
复制代码
安装过程如下。
  1. $ rustup install stable
    . j2 f  P- f" }! |$ `
  2. $ rustup default stable
    4 G  S& M+ r/ _& W* s+ y) V
  3. $ rustup target add armv7-linux-androideabi0 n1 `! z8 m3 w/ b% A
  4. $ rustup target add i686-linux-android
    , R/ O" x! D/ i5 p4 m/ q6 @/ t
  5. $ rustup target add aarch64-linux-android
    * _8 t( \4 J5 [! q& g1 ^* z
  6. $ rustup target add x86_64-linux-android
复制代码
4 i7 V! ?, x9 h
5. 持久化环境变量上面的安装步骤是通过 export 来定义系统 PATH 的,在退出当前登录后就会丢失设置。
1 D8 W1 H% {4 [8 x3 {4 K因此需要持久化一些环境变量。; f4 }  L. M. d, P( V) R
编辑 ~/.bash_profile 文件。添加 ANDROID_HOME,RUSTUP_HOME,CARGO_HOME 的定义以及增加 PATH 定义。
: p' R" {1 R1 Q1 c# e3 A, J最后呈现内容如下。4 n( @0 p3 r. E; y
  1. # .bash_profile: ^6 h4 I8 ^( V; I6 V$ j* e
  2. % x; V3 {! `  W8 m& w
  3. # Get the aliases and functions0 W* ^0 [- c4 Z$ S; t
  4. if [ -f ~/.bashrc ]; then( X) Q( G5 l1 z, M' P8 m
  5. . ~/.bashrc* S4 l, w. S$ q/ P9 M4 a/ i: S! L
  6. fi4 O5 ]4 y  v# d* R' }: b' P5 o8 B
  7. ! b+ s( L* a. ~
  8. # User specific environment and startup programs# E3 H; K- P" n8 x7 N& p

  9. 7 T% x/ I. i* a; W/ u+ Z
  10. export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
    2 l) J% A1 K& h' P
  11. , n7 {: r! i  A$ `7 b
  12. PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin' l& \" l, y% W' n' Q

  13. / l2 T6 {  ~$ f: V
  14. export PATH
复制代码

& Q% D/ A! U1 y  ^% J: e6 G* D6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android/ e3 Z" c# \3 Z  i& d$ ^6 z, p
编译过程如下。9 d: q  H; m- X+ y' E4 V
  1. $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git5 L1 ]; ]4 q" u- O+ F+ e) e6 d
  2. $ cd v2ray-plugin-android
    : B3 K4 z% g0 a, Q
  3. $ git submodule update --init --recursive
    & [" ]) u9 r3 r% K: L8 }  L8 b
  4. $ ./gradlew assembleRelease
复制代码
( ?" f4 |2 O+ C4 h7 _
完成后,编译好的 apk 文件位于 app/build/outputs/apk/release 路径下。3 e0 P3 A& |4 u! M8 n+ B
Android 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。
& Y/ Z9 c* v. I& b/ p2 Q/ t+ B因此这些 apk 文件还不能被直接拿来安装。2 p3 u* g* {0 @: N6 K5 }$ S
至于如何签名,请参考以下链接,过程省略。3 b4 z- n- U* m9 H( i5 a6 ^) x
https://developer.android.com/studio/publish/app-signing
0 I' B" P5 B- v5 n4 A5 w7. 总结当你习惯于用命令行做事的时候,你会发现效率往往会有很大的提升。编译代码亦是如此。2 z% [4 J# [3 \+ W" N0 ?$ y

4 ~* U# ?; M, W# F1 @  ]' s; y6 I! n9 T, p
6 w4 e& m! F& g( g$ t9 K2 i) ^& Q8 C

3 }" I$ P1 W/ M+ ?7 \- U7 m
2 N# a5 [1 L! k: X; T6 |. v% f. ?6 T7 Y: ?$ E

* V* a; c# j$ S, J3 k$ |; G5 E' V
% q: u+ d* c5 D6 T: O
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-11-5 05:55 AM , Processed in 0.092334 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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