|
( 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- Git
3 g7 ]2 m ]+ F0 F - JDK 1.8) C+ U* x" j+ w
- Go 1.14.74 r1 u( z- }- u3 R W$ U
- Android SDK
! q1 }+ G+ O% F6 X - Android NDK& ?/ R: O7 P# t( p6 q
- Rust 1.45.02 |) ^! d6 @! ~
- Android Targets:
8 L. k+ }0 J+ i; a$ q$ T+ d. E - armv7-linux-androideabi6 d' G+ G9 ?$ r8 ^2 t
- aarch64-linux-android1 h1 x5 O8 Z" I m6 v- l
- i686-linux-android
) ^- B+ ~8 f9 ?2 @ - 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
- $ yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget unzip git
复制代码 完成后通过以下命令验证 JDK 版本号。 - openjdk version "1.8.0_252"/ D- H# P3 B2 q! O3 C# a7 c7 d2 Y
- OpenJDK Runtime Environment (build 1.8.0_252-b09)
8 T# @ }2 [4 V! @5 K9 Z# q* f' m - OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码 返回+ d$ t, o& B- H9 m
2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。
* L7 O* g! @. g. z9 l- $ GO_VERSION=1.14.76 G# P' r5 n' Q( f; x
- $ 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 - $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
3 o* A$ {) ` H - $ rm -fv /tmp/go${GO_VERSION}.tar.gz
0 b4 n/ u! K L1 M) G: n. Z2 n9 ? - $ export PATH=/usr/local/go/bin:$PATH
复制代码 完成后通过以下命令验证 Go 版本号。 - 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- $ mkdir -p /opt/sdk && cd /opt/sdk8 w% i2 g$ p, x6 [, ~& I) Q
- $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip4 R! V" V, K5 o& Y9 S) p- q% S
- $ unzip -q commandlinetools-linux-6609375_latest.zip
2 g( P: v) m) s" I y+ Y - $ rm -fv commandlinetools-linux-6609375_latest.zip
6 q3 i5 s' ^, v' r8 _0 B+ U - $ export PATH=/opt/sdk/tools/bin:$PATH
# D' `9 }* a6 [8 D/ d- z9 @- Z - $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk( F0 O- w- H; k# t" r9 P9 _
- $ yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses
复制代码 通过 sdkmanager 来安装一些组件。一条命令一步到位。如下。- $ sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools" "platforms;android-30" "platforms;android-29" "ndk-bundle" "ndk;21.0.6113669" "build-tools;29.0.2"
复制代码 完成后,确认已安装的列表。- $ sdkmanager --sdk_root=${ANDROID_HOME} --list
复制代码 返回- Installed packages:
& S% Z5 E7 s) b7 Z$ I8 i: J8 _ - Path | Version | Description | Location ; [0 c" [# n3 Z9 L' ?& K
- ------- | ------- | ------- | -------
- n& ]- N' L! P# u4 o0 n - 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 \ - ndk-bundle | 21.3.6528147 | NDK | ndk-bundle/ . h: D2 S" i$ j' v4 E0 p( u @3 Z
- 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 - patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/
9 M; e& j5 c+ ^( ^ - platform-tools | 30.0.3 | Android SDK Platform-Tools | platform-tools/ 5 Y4 ~# }$ r- Y0 F2 g- {9 Q% S
- platforms;android-29 | 4 | Android SDK Platform 29 | platforms/android-29/
, W6 F& ^) q9 H* P9 s - platforms;android-30 | 1 | Android SDK Platform 30 | platforms/android-30/
3 X- x7 f4 v6 v- B" u7 X3 [ - tools | 2.1.0 | Android SDK Tools 2.1 | tools/
# W8 D7 q7 I( s# m6 Q' t5 H - Available Packages:" Z8 \& t& I$ r) s6 w' B
- 以下省略
复制代码 + e* P; e" M& `( M. D u
4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。
' A) T. x; S7 _6 v8 j* I- $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
. T7 o% Q& g! e% ]2 i4 m - $ RUST_VERSION=1.45.0/ Y5 S, |' i! U2 g, E
- $ RUSTARCH='x86_64-unknown-linux-gnu'/ |5 W3 I$ m4 I3 m) e1 G
- $ 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
- $ chmod 755 /tmp/rustup-init
- r6 b8 m- U/ D+ W0 h4 v1 ^3 w - $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION" K- H4 A, Z5 F* c8 s) K! x
- $ rm -fv /tmp/rustup-init$ u# L& c1 K# g3 n
- $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}0 ^1 c. [ G& ]7 T
- $ export PATH=/usr/local/cargo/bin:$PATH
复制代码 完成后通过以下命令验证 Rust 及组件的版本号。- rustup 1.21.1 (7832b2ebe 2019-12-20)
复制代码 返回- cargo 1.45.0 (744bd1fbb 2020-06-15)
复制代码 返回- rustc 1.45.0 (5c1f21c3b 2020-07-13)
复制代码 Rust 安装以下 Android Targets:- armv7-linux-androideabi
' T: g" s5 r. _. P& H4 ? - aarch64-linux-android
4 S; O5 M" n8 k8 N - i686-linux-android6 }6 j2 N8 M; C2 s5 e
- x86_64-linux-android
复制代码 安装过程如下。- $ rustup install stable6 v* U4 z5 b( {- o/ q8 k% I% P& l; n
- $ rustup default stable- S3 Q: `8 n1 A5 y( c
- $ rustup target add armv7-linux-androideabi8 L: e7 {0 j% B. q' {
- $ rustup target add i686-linux-android w# y. A! i2 W/ g5 r: T
- $ rustup target add aarch64-linux-android
4 h* y Q- Z1 X D; \; ` - $ 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- # .bash_profile5 r$ J1 l& c2 v, z6 ^
/ f3 d0 T2 |1 a- # Get the aliases and functions
( d- z/ R9 X7 Q - if [ -f ~/.bashrc ]; then7 |4 h& ~& a6 Y8 C+ U8 q0 _! _3 q& {
- . ~/.bashrc
- \8 T8 f7 U) D - fi0 {" h2 N) O# l
# J5 Z; N/ v) E- # User specific environment and startup programs( h, I5 ~5 d$ i
- / f/ Y b4 b% g5 k" o3 {( {. p
- export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
3 c7 y$ N) N9 G/ n" f
, @- S J V" s" _) o, L& v y* e/ K- PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin
$ h/ d: p: J4 z1 U1 s* O
2 c; n$ l) j7 f- export PATH
复制代码 . m2 z3 H* q" B+ t: K" C: x
6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android。7 T7 ^6 F# A% r$ J5 Y N2 n1 {
编译过程如下。: f6 h' q9 t+ a9 t! D
- $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git
7 s& u! K6 r- n' K Y - $ cd v2ray-plugin-android# X" J& G$ t0 N% N
- $ git submodule update --init --recursive- K$ g3 F* Z. [ P- g+ h
- $ ./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
|
|