|
|
# 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- Git
' _, }( o/ x! H) f: `6 @ - JDK 1.8! V3 M8 ^) Q7 e( u/ B
- Go 1.14.7
5 D% M# b! x; ]2 z6 H - Android SDK* v# x) w k: C* I
- Android NDK
0 A M* T5 G1 e, r4 @$ Y7 Z7 m* r - Rust 1.45.0
, |. b% u. ^8 I/ e0 o. g - Android Targets:8 D5 _- p0 X* `+ ]
- armv7-linux-androideabi
- W4 h, A0 Q7 ] - aarch64-linux-android
) k1 c1 x! a7 ^9 Z3 C3 O8 h2 @7 ` - i686-linux-android- U' W0 b0 R" V2 t
- 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- $ yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget unzip git
复制代码 完成后通过以下命令验证 JDK 版本号。 - openjdk version "1.8.0_252"
) z) w5 k3 P6 v" d - OpenJDK Runtime Environment (build 1.8.0_252-b09)( V) b5 s) Q2 {8 ^) E0 h
- OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码 返回
7 N8 c( Q* [; @3 u2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。 j: {, y) t7 P+ ?% e2 o( g& t
- $ GO_VERSION=1.14.7# E6 x `0 T( ?
- $ 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 - $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
1 X. E) i& c0 \* p; C+ ^/ ` - $ rm -fv /tmp/go${GO_VERSION}.tar.gz
( E& L" A3 Y a& ?4 E - $ export PATH=/usr/local/go/bin:$PATH
复制代码 完成后通过以下命令验证 Go 版本号。 - 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
- $ mkdir -p /opt/sdk && cd /opt/sdk) x x _* R2 C- v6 M- T
- $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip$ h6 A% @. l7 ^5 a; m
- $ unzip -q commandlinetools-linux-6609375_latest.zip
5 ^* q4 K- O6 w- o. Q& ~+ q6 v5 ]! B+ W$ ? - $ rm -fv commandlinetools-linux-6609375_latest.zip
8 R, W1 R! a- H% N2 [& ] - $ export PATH=/opt/sdk/tools/bin:$PATH6 R& |+ E7 U4 E' S, M0 |6 ~
- $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk- J. c$ a8 r, C0 t7 ]
- $ 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:! R3 l. D* z" @- `3 z
- Path | Version | Description | Location ( i( W! l/ a# _2 U4 W0 ]
- ------- | ------- | ------- | -------
' J* g1 E8 i; Y2 Q P; k" D5 x - 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 {/ @
- ndk-bundle | 21.3.6528147 | NDK | ndk-bundle/
0 ]- K9 K; i5 x8 Y7 g5 d! `. @ - 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
- patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/
5 _3 ^2 H }, \( v - platform-tools | 30.0.3 | Android SDK Platform-Tools | platform-tools/
5 x4 U! E7 r+ T0 w1 U7 C0 I - platforms;android-29 | 4 | Android SDK Platform 29 | platforms/android-29/
: C4 M$ t/ o6 b, |- [ ~5 G8 F+ e! L - platforms;android-30 | 1 | Android SDK Platform 30 | platforms/android-30/" S/ F6 Z- w$ g* @0 {/ C! ^' y1 p
- tools | 2.1.0 | Android SDK Tools 2.1 | tools/
. ]. D: A- n* F( Z1 e$ }( X - Available Packages:
7 `, n+ S5 K8 o d) g+ ` - 以下省略
复制代码 3 j- y, ^8 C1 u+ l. b
4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。
W6 C& p! O5 i- Z& L) o- $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
! d) Z7 f1 C5 c) l) ~" { - $ RUST_VERSION=1.45.0* ]/ X( T [& [/ }' a# U
- $ RUSTARCH='x86_64-unknown-linux-gnu'
' u: m E# R, U' x/ }. q# \ - $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"4 p% {: f2 i' U
- $ chmod 755 /tmp/rustup-init
' B& l5 K$ @; J3 q$ M - $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION8 d4 y* _5 T. E
- $ rm -fv /tmp/rustup-init
( d7 W) @+ ^! X# T& g) I! G3 R - $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}
3 F! J% |- Z; O! t5 m - $ 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/ ?2 J* L$ j, H% f: Y ^$ s5 d9 F1 z
- aarch64-linux-android" M& {$ m! k! ~
- i686-linux-android! x: j' L/ R, |& t
- x86_64-linux-android
复制代码 安装过程如下。- $ rustup install stable
. j2 f P- f" }! |$ ` - $ rustup default stable
4 G S& M+ r/ _& W* s+ y) V - $ rustup target add armv7-linux-androideabi0 n1 `! z8 m3 w/ b% A
- $ rustup target add i686-linux-android
, R/ O" x! D/ i5 p4 m/ q6 @/ t - $ rustup target add aarch64-linux-android
* _8 t( \4 J5 [! q& g1 ^* z - $ 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
- # .bash_profile: ^6 h4 I8 ^( V; I6 V$ j* e
- % x; V3 {! ` W8 m& w
- # Get the aliases and functions0 W* ^0 [- c4 Z$ S; t
- if [ -f ~/.bashrc ]; then( X) Q( G5 l1 z, M' P8 m
- . ~/.bashrc* S4 l, w. S$ q/ P9 M4 a/ i: S! L
- fi4 O5 ]4 y v# d* R' }: b' P5 o8 B
- ! b+ s( L* a. ~
- # User specific environment and startup programs# E3 H; K- P" n8 x7 N& p
7 T% x/ I. i* a; W/ u+ Z- export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
2 l) J% A1 K& h' P - , n7 {: r! i A$ `7 b
- PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin' l& \" l, y% W' n' Q
/ l2 T6 { ~$ f: V- 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
- $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git5 L1 ]; ]4 q" u- O+ F+ e) e6 d
- $ cd v2ray-plugin-android
: B3 K4 z% g0 a, Q - $ git submodule update --init --recursive
& [" ]) u9 r3 r% K: L8 } L8 b - $ ./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
|
|