|
|
/ h9 `) `+ v; K; u' i& L9 F; O) t在 Android Studio 之外,还可以通过 Gradle Script 来编译 Android 项目并构建和测试应用。$ ~ s+ e" s3 P/ E1 Q- `
本文是一个备忘录,以记录我在 x86_64 GNU/Linux 系统 CentOS Linux release 7.8.2003 下折腾 Android 编译环境的一个过程。
/ X+ C3 D9 c' f& O5 @3 A7 ^: o8 h
- X+ \% i* X4 T. l1 ~/ V$ l( K7 S本文将会安装以下组件:" F) Z& ^& T! V9 j
- Git
0 i# ^0 _- H$ s( L. P ?1 m - JDK 1.8
4 e$ {7 Y# t2 |# E3 ^% U; A - Go 1.14.7
9 T' M8 k! o; b2 } - Android SDK8 D( j" k0 L* r% ?
- Android NDK! s, Z# \3 g/ v/ Y5 R7 o
- Rust 1.45.0
6 h: _8 I2 z1 ^. I - Android Targets:, `3 O/ N/ s2 K
- armv7-linux-androideabi; w! D6 H( u, a4 c( V6 a
- aarch64-linux-android5 ^% W) g7 y7 t# Q
- i686-linux-android9 o+ D- n6 ^* @3 z+ x) o
- x86_64-linux-android
复制代码
/ q' e$ o+ O. n: }" A$ @" M1 J4 U以下的所有过程均是在 root 用户下操作。& B; O' N4 t: N. {& }, _
1. 安装 Git 和 JDK 1.8这两个组件发行版自带,通过以下命令即可安装。与此同时,再安装一些其他必要的组件 wget 和 unzip。
5 J$ [# T& H: V7 W6 C% W4 }# \7 w- $ yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget unzip git
复制代码 完成后通过以下命令验证 JDK 版本号。 - openjdk version "1.8.0_252"& ` s% H5 x$ Q/ z. I5 } @( Y9 m
- OpenJDK Runtime Environment (build 1.8.0_252-b09)# l" j: f2 v, c# s- V& U
- OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码 返回
! p9 w9 c) o% @9 S; G2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。: ~7 e2 Y8 _! H/ k! V$ }
- $ GO_VERSION=1.14.7
* D, J* Y5 [, j( c. n$ @ - $ wget -O /tmp/go${GO_VERSION}.tar.gz https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz
5 x1 f+ T. ?9 U, ~) n9 e - $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
# |) M* t- S# \2 A! A8 x4 V - $ rm -fv /tmp/go${GO_VERSION}.tar.gz# F$ o& e' a5 K) F
- $ export PATH=/usr/local/go/bin:$PATH
复制代码 完成后通过以下命令验证 Go 版本号。 - go version go1.14.7 linux/amd64
复制代码
% Y) I8 B8 W5 A* Z' U! d3. 安装 Android SDK 及 Android NDK假设 ANDROID_HOME 路径是 /opt/sdk。安装过程如下。
. A% O9 R! S, l2 q( k f) R- $ mkdir -p /opt/sdk && cd /opt/sdk, P, m6 e( A: t! Q. j
- $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip
) ]0 L: Z# x) v0 }( d+ K - $ unzip -q commandlinetools-linux-6609375_latest.zip' ?1 H% O1 {+ a- E7 a
- $ rm -fv commandlinetools-linux-6609375_latest.zip
3 ^7 t8 z# y% k" T' Q - $ export PATH=/opt/sdk/tools/bin:$PATH- A; L( c; n, L8 r, V! k. J
- $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk
9 |0 Y" ^7 J4 R8 ?6 s& v0 |4 v - $ 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:
' |. D1 _2 A7 Q' x+ L8 e+ `/ v - Path | Version | Description | Location / K& f5 S" y4 m% G) }' G- u
- ------- | ------- | ------- | -------
' {* x! @ ?3 p4 |( ?1 f - build-tools;29.0.2 | 29.0.2 | Android SDK Build-Tools 29.0.2 | build-tools/29.0.2/
% [" V- C) t4 h$ E' O0 D - ndk-bundle | 21.3.6528147 | NDK | ndk-bundle/
- C2 m3 z- L* B8 i5 @+ O6 V7 k; ? - ndk;21.0.6113669 | 21.0.6113669 | NDK (Side by side) 21.0.6113669 | ndk/21.0.6113669/ ) ~9 ]# M; P% s9 h. U
- patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/ : R' U0 r0 T5 r* Z* L
- platform-tools | 30.0.3 | Android SDK Platform-Tools | platform-tools/ ; A6 a( x4 @- z& Y/ ~- R- |* ~+ N
- platforms;android-29 | 4 | Android SDK Platform 29 | platforms/android-29/
/ e6 A% J1 B1 @ - platforms;android-30 | 1 | Android SDK Platform 30 | platforms/android-30/
- R/ @7 C T- b) A2 ~; L N3 [$ Z - tools | 2.1.0 | Android SDK Tools 2.1 | tools/ ; ^/ D. a" J: K* T0 M
- Available Packages:5 |& r- u- a$ b% d$ I
- 以下省略
复制代码
+ F$ e7 f3 s3 a/ I# M# }4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。
: ^" j: } v5 D, O5 r- $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo! s1 J. r1 l7 b l
- $ RUST_VERSION=1.45.0' _# @7 P9 ?1 b7 m3 {: U; n) Z
- $ RUSTARCH='x86_64-unknown-linux-gnu'
/ A$ f9 P. J& ^/ r* W4 y/ ~* e - $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"! g/ v; n/ o1 e
- $ chmod 755 /tmp/rustup-init
6 _8 q& d0 c' I3 ] - $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION
5 s. {7 N. _4 l3 p8 O: i - $ rm -fv /tmp/rustup-init
* f/ T- J; H' n% g9 l - $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}1 a6 Z2 Q0 N0 r" D* ]& B( |
- $ 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
d' F6 |/ n. V' D9 r# r: U - aarch64-linux-android5 }+ q5 c. T* z3 L
- i686-linux-android
: Z4 y$ ~# q; a+ T$ j1 {7 [ - x86_64-linux-android
复制代码 安装过程如下。- $ rustup install stable
! E' a7 B6 l% X$ l# c - $ rustup default stable4 M9 v/ T$ r4 W) e! x
- $ rustup target add armv7-linux-androideabi
; J2 P/ [6 }, [; I* h - $ rustup target add i686-linux-android2 k* b9 s+ r. Y( ^; A, F/ m0 b! j
- $ rustup target add aarch64-linux-android
5 P, D- S* e# |7 G8 ~ - $ rustup target add x86_64-linux-android
复制代码
( B( A5 r" z0 ^5. 持久化环境变量上面的安装步骤是通过 export 来定义系统 PATH 的,在退出当前登录后就会丢失设置。
/ w9 V, i% ] r+ Q8 e' _因此需要持久化一些环境变量。
- W! |( c9 L! T0 B" C编辑 ~/.bash_profile 文件。添加 ANDROID_HOME,RUSTUP_HOME,CARGO_HOME 的定义以及增加 PATH 定义。
& L( u% W4 W7 T6 }8 a+ ~最后呈现内容如下。
1 w# w3 l+ V; L1 e5 w- # .bash_profile: u/ A3 K5 n. A' {6 |) F0 r
- 4 [3 Z, B# w# n! ^8 g
- # Get the aliases and functions" A( ]: C& h1 j$ I9 T! X2 `9 N7 y
- if [ -f ~/.bashrc ]; then
0 `# {: c) U+ j0 w - . ~/.bashrc' e1 h' k0 c8 o, u& L- B. V
- fi- n4 g+ A4 S: j3 q: s) c- C7 Y3 n! D
- 8 y0 Y% @) P+ }$ @
- # User specific environment and startup programs6 c2 _) k0 H7 Z/ t2 U |
1 a; U( {5 Z" |. l- export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo
& {$ D9 N W, r& |4 n( o
* x3 \% W3 n/ u/ i- PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin
n# J( j' V2 i. T+ O
$ _) _7 g$ l/ Q3 Y/ A' N- export PATH
复制代码 ! ]9 s% @" C* w
6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android。/ Y* G3 s* e! T0 f- F* V
编译过程如下。
' D: E# J& ^" X X, B- $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git
1 X8 i/ v, x* B* N( L - $ cd v2ray-plugin-android
! j) u8 T( W" @9 p9 K) Q, Q - $ git submodule update --init --recursive4 W n& O/ M$ J# Z! q/ Z0 z9 K
- $ ./gradlew assembleRelease
复制代码 6 K% |, Q L* F) c* }% {2 |
完成后,编译好的 apk 文件位于 app/build/outputs/apk/release 路径下。% z( ~) d6 h! Q* Q; m
Android 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。
2 M( e! m1 J# t ~6 {0 e& V' r因此这些 apk 文件还不能被直接拿来安装。
3 f# S- k3 n4 E: U4 b4 ?, [至于如何签名,请参考以下链接,过程省略。5 |- Z2 x' _) j0 F4 X
https://developer.android.com/studio/publish/app-signing! A% S: L0 ^! W$ F- c5 s
7. 总结当你习惯于用命令行做事的时候,你会发现效率往往会有很大的提升。编译代码亦是如此。
' u( j: R& R. i. n9 t; F
/ e* ~" P0 o% ?, f& A; p( P! K
: n* k% o( D5 U: ]
8 K/ n: s6 F5 ^
" l5 R3 m$ @) T8 p7 K
* o9 D) y1 ^9 t" o% E% I, K$ D( \5 f
/ N$ \$ j. Q6 t* c* i6 H
( y @& k. d6 v |
|