|
|
: K; n) V1 j0 `3 I; D
在 Android Studio 之外,还可以通过 Gradle Script 来编译 Android 项目并构建和测试应用。1 h F. w8 @% X3 y/ b7 N
本文是一个备忘录,以记录我在 x86_64 GNU/Linux 系统 CentOS Linux release 7.8.2003 下折腾 Android 编译环境的一个过程。
) B/ w4 v) W# J2 e# ` A" O
3 b: u' ]. _8 {# u5 [本文将会安装以下组件:: ~, z' |! t" n, D- E6 h! F
- Git' T( P" z2 |+ T8 H$ C1 s+ b
- JDK 1.8
" v/ u0 g/ k; z) B! L - Go 1.14.72 Q# K. s) \3 b; P! z7 F# _
- Android SDK
* R0 u; c7 s: _ - Android NDK1 N% E* c$ J# y5 \* T( S+ M! q
- Rust 1.45.0
/ B' y6 a& ~" y; G2 e - Android Targets:. c$ V( Y2 l0 ]1 O
- armv7-linux-androideabi
8 x1 z7 z/ E; y, ] - aarch64-linux-android4 d: k# I0 q8 u/ Z% W
- i686-linux-android
: c/ r7 J$ W; Z5 _7 q) w - x86_64-linux-android
复制代码 6 \. n" P% O) x/ f
以下的所有过程均是在 root 用户下操作。
( q1 W( l( n6 }$ ^" q3 b1. 安装 Git 和 JDK 1.8这两个组件发行版自带,通过以下命令即可安装。与此同时,再安装一些其他必要的组件 wget 和 unzip。
$ O1 U7 Q2 n+ E8 w* O3 t- $ yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget unzip git
复制代码 完成后通过以下命令验证 JDK 版本号。 - openjdk version "1.8.0_252", v+ K J) q1 Q. w' i' ~
- OpenJDK Runtime Environment (build 1.8.0_252-b09)
3 F0 a: N$ M4 \; `6 ^- u8 D1 U5 f - OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码 返回
; d* }3 F8 T2 {+ A. H& {: c2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。( J: s3 ?. K- }1 k& b2 u- A
- $ GO_VERSION=1.14.78 O+ M- q8 `- b
- $ wget -O /tmp/go${GO_VERSION}.tar.gz https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz5 q4 S/ N0 L# ^ |/ g& H
- $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
& U2 [4 P0 K# K - $ rm -fv /tmp/go${GO_VERSION}.tar.gz6 p8 e2 M9 E" P5 [- U: Y
- $ export PATH=/usr/local/go/bin:$PATH
复制代码 完成后通过以下命令验证 Go 版本号。 - go version go1.14.7 linux/amd64
复制代码 : G# D) b0 [7 {! l( |
3. 安装 Android SDK 及 Android NDK假设 ANDROID_HOME 路径是 /opt/sdk。安装过程如下。
% a; x3 y; ^# R4 C6 g) I- $ mkdir -p /opt/sdk && cd /opt/sdk
3 |, Z0 K" ^9 y - $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip% T' l' S$ P. I; u) j$ _
- $ unzip -q commandlinetools-linux-6609375_latest.zip2 E. d! D) O; k. Q9 S1 u/ D6 J
- $ rm -fv commandlinetools-linux-6609375_latest.zip8 U$ t0 B, m) X
- $ export PATH=/opt/sdk/tools/bin:$PATH2 p- A$ m" h0 a
- $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk
n Y% Z$ s# u! y0 ~, Y# X& _) Q - $ 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:
% J9 T' D) h4 W) ] - Path | Version | Description | Location 8 W; d6 n1 ~+ V
- ------- | ------- | ------- | -------
8 @1 z. f: [/ E0 v3 l/ B - build-tools;29.0.2 | 29.0.2 | Android SDK Build-Tools 29.0.2 | build-tools/29.0.2/ 1 T+ @+ o3 a t0 A8 I
- ndk-bundle | 21.3.6528147 | NDK | ndk-bundle/ & a: ]/ }5 `; b2 K% Y) ]
- ndk;21.0.6113669 | 21.0.6113669 | NDK (Side by side) 21.0.6113669 | ndk/21.0.6113669/ 9 v% f; i8 U* R/ C" c9 J
- patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/
, J6 I- R3 M- Q* \5 s - platform-tools | 30.0.3 | Android SDK Platform-Tools | platform-tools/
! W; ^- }; ^ R9 b/ Z) t |( y5 P, @ - platforms;android-29 | 4 | Android SDK Platform 29 | platforms/android-29/* `9 J* \) }! c- M" {; ?1 |
- platforms;android-30 | 1 | Android SDK Platform 30 | platforms/android-30/
1 n! q. _: i* a, X& k2 Q - tools | 2.1.0 | Android SDK Tools 2.1 | tools/ " d1 f& G$ v/ @6 r. P5 r$ X7 l
- Available Packages:
! ?' J& v' t4 z! @ - 以下省略
复制代码
2 ?* b' o' Y; M6 K$ x/ w7 G4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。% J, [2 ~* r& k# b
- $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
+ w! j# z$ h0 V/ W - $ RUST_VERSION=1.45.0& U. i: _! \$ C& @! J5 f
- $ RUSTARCH='x86_64-unknown-linux-gnu'
. V; R: p: m5 |+ { - $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"
/ O# O: H. [1 U; B" X& U - $ chmod 755 /tmp/rustup-init6 {" }5 l7 _' L1 z2 e( B$ |
- $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION
4 y5 o2 l1 {6 U - $ rm -fv /tmp/rustup-init2 [; k' Q" s1 k# }7 G
- $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}. {* x3 B4 m0 c! ]: o
- $ 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
# O7 Y# A3 U6 c2 U7 {3 ^6 {0 v1 R* X - aarch64-linux-android
2 j; Y% D* d4 r: }, ^/ ~: { - i686-linux-android2 j5 v# p& b" L) ~, {- k8 `0 J
- x86_64-linux-android
复制代码 安装过程如下。- $ rustup install stable
I- x' Q* e. l k& y% L - $ rustup default stable6 ` Q- q) A+ g
- $ rustup target add armv7-linux-androideabi3 D0 V; V. G' B0 B! ]% L' X" ^
- $ rustup target add i686-linux-android. I3 G( a/ N5 o5 U& m9 {
- $ rustup target add aarch64-linux-android
$ J G1 O9 C& ?9 ^5 O8 e: i - $ rustup target add x86_64-linux-android
复制代码
' u& x; O* A5 ?' b5. 持久化环境变量上面的安装步骤是通过 export 来定义系统 PATH 的,在退出当前登录后就会丢失设置。& G$ Z# `, `. Z) C& \
因此需要持久化一些环境变量。4 F% ^5 z; y3 x) C
编辑 ~/.bash_profile 文件。添加 ANDROID_HOME,RUSTUP_HOME,CARGO_HOME 的定义以及增加 PATH 定义。
' |7 Z4 G6 Q$ @; z# x. n! ? R最后呈现内容如下。2 m' [) W: h" y2 ^3 K! H3 L& A
- # .bash_profile( ^' w* E# }' l+ |" c4 Y3 T
8 m* f/ L6 Z" C- q7 N- h: M& X/ A; k6 }- # Get the aliases and functions
3 e: b4 ~6 ?' [9 X* E/ D$ R - if [ -f ~/.bashrc ]; then
/ q) H' J q2 ^: A" Z - . ~/.bashrc
9 ^8 i/ _( S) g0 l; a - fi$ t3 x- n) Y8 w/ j/ ]: T
- ' o# f+ x1 {1 X z0 u
- # User specific environment and startup programs
4 H% k; {+ n. Y' G - # K$ K: j( Z2 m) P' W
- export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
% O: X; t `+ _7 w" n
- g$ n1 T) h4 s0 Z/ y& y$ b- PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin
& p2 t# h4 ]6 E, z0 [ _
E0 j6 P; ]. t2 U0 d1 [- export PATH
复制代码 ( x/ C/ N4 `' X6 `" R% z
6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android。
# \7 v2 U. \* }( L2 c编译过程如下。! W, G( a W$ [/ y
- $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git- S/ n0 r3 V# E4 b0 F; z
- $ cd v2ray-plugin-android
( o; \) k8 l' ~ - $ git submodule update --init --recursive
; m( y* c+ K, A2 e - $ ./gradlew assembleRelease
复制代码 , t# X R& `3 j) I
完成后,编译好的 apk 文件位于 app/build/outputs/apk/release 路径下。
) E6 a' F* F2 EAndroid 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。: i6 f- |, @6 z& \
因此这些 apk 文件还不能被直接拿来安装。
5 u n- Q' o9 @7 S5 [) V% B& O至于如何签名,请参考以下链接,过程省略。
0 G9 p6 x$ J$ w: e! B9 P, o8 Ohttps://developer.android.com/studio/publish/app-signing
: X$ D+ X: a) t9 h7. 总结当你习惯于用命令行做事的时候,你会发现效率往往会有很大的提升。编译代码亦是如此。: r) `5 w$ k+ r* _1 g6 }, y& W) i
" T9 m7 y% w4 i( m' K* t1 t; D* h3 | q8 O" a) w; j' }0 _
r/ t$ d* L. h% U. c7 K
, C5 i8 w' X- [' T$ V, J( ?% @! S& R; ~8 b
$ q3 Z8 a2 Z3 O& T* H7 \. c
% u* Z0 S8 V: i. b7 \ 1 q& g7 V4 J5 Z& l+ ` r5 E
|
|