|
9 {- d1 {' e! W- T' h
在 Android Studio 之外,还可以通过 Gradle Script 来编译 Android 项目并构建和测试应用。
6 s8 L5 o. P% D4 f* |4 `本文是一个备忘录,以记录我在 x86_64 GNU/Linux 系统 CentOS Linux release 7.8.2003 下折腾 Android 编译环境的一个过程。
+ O. }* C. W- R- A0 Z% I4 |* v; v4 L, H
本文将会安装以下组件:
v6 R9 a* _4 \" t* \- Git* A0 O9 [. e% k* h9 P: e
- JDK 1.81 |- k$ [. n1 L$ s( t" y( V% @
- Go 1.14.7
$ B ?$ _0 ]# X* k - Android SDK" @+ V1 ^4 E+ y: M4 _
- Android NDK
; N6 H/ j1 z4 p9 q: F5 B; J - Rust 1.45.0
) q% @7 f9 H0 s; j$ E3 q - Android Targets:
2 |$ H! O4 u! t9 D9 H - armv7-linux-androideabi
2 z8 x2 X. c; Q$ V8 J5 h! R2 \, B3 I - aarch64-linux-android$ P& W: i" J# |9 e
- i686-linux-android6 A3 z3 ?4 j4 a' s, M
- x86_64-linux-android
复制代码 & ^- M+ @+ E% k( E: M+ ^2 G" z
以下的所有过程均是在 root 用户下操作。7 K1 M4 b. {" w/ X% }6 f3 m+ v; v' B
1. 安装 Git 和 JDK 1.8这两个组件发行版自带,通过以下命令即可安装。与此同时,再安装一些其他必要的组件 wget 和 unzip。
, T$ o( J2 J; i! G- $ yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget unzip git
复制代码 完成后通过以下命令验证 JDK 版本号。 - openjdk version "1.8.0_252"
/ c6 W! c% s$ G! D - OpenJDK Runtime Environment (build 1.8.0_252-b09)9 T7 v7 f Q l* _
- OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
复制代码 返回
+ v" J, l9 D9 C0 Q2. 安装 Go目前 Go 的最新版是 1.14.7。安装过程如下。' a4 r! X/ g5 a8 l
- $ GO_VERSION=1.14.7
) j3 k$ C4 W' d& i& @6 t" f( E - $ wget -O /tmp/go${GO_VERSION}.tar.gz https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz% f8 Q% g' s2 ]
- $ tar -C /usr/local -xzf /tmp/go${GO_VERSION}.tar.gz
! a R5 Z- _9 j! j - $ rm -fv /tmp/go${GO_VERSION}.tar.gz
, b" P& I0 p. S2 S! |; }* _. f0 G - $ export PATH=/usr/local/go/bin:$PATH
复制代码 完成后通过以下命令验证 Go 版本号。 - go version go1.14.7 linux/amd64
复制代码
, l A8 H" P4 \. `1 B3. 安装 Android SDK 及 Android NDK假设 ANDROID_HOME 路径是 /opt/sdk。安装过程如下。7 w" z% f* L0 x# |
- $ mkdir -p /opt/sdk && cd /opt/sdk( `! k' H- l1 r6 F
- $ wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip
7 N- f6 P7 q$ S. R9 Y - $ unzip -q commandlinetools-linux-6609375_latest.zip* s8 k9 s# Y0 o; d
- $ rm -fv commandlinetools-linux-6609375_latest.zip0 L+ v2 ?- ?7 n$ D
- $ export PATH=/opt/sdk/tools/bin:$PATH% z4 e) s# g5 P, r$ w& p9 m1 q( ]: f
- $ [ -z "${ANDROID_HOME}" ] && export ANDROID_HOME=/opt/sdk' _: M9 U) _0 A+ z. \, b9 ]
- $ 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:' m! z' }, g' T+ K6 M: t. z
- Path | Version | Description | Location
$ `, Y# o% |# L" G( Z+ Z- n - ------- | ------- | ------- | -------
+ L% T" o1 p: p, e% P- f: @ - build-tools;29.0.2 | 29.0.2 | Android SDK Build-Tools 29.0.2 | build-tools/29.0.2/ 2 J' r- U2 f" h' A- a
- ndk-bundle | 21.3.6528147 | NDK | ndk-bundle/
4 ~2 G& N- u$ ^ - ndk;21.0.6113669 | 21.0.6113669 | NDK (Side by side) 21.0.6113669 | ndk/21.0.6113669/
1 ~) v2 z5 S4 ^/ r- O! J - patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/ & O P4 ^! p( [( E9 `% q1 \! w
- platform-tools | 30.0.3 | Android SDK Platform-Tools | platform-tools/
6 y6 r4 V' y: h5 m" ] - platforms;android-29 | 4 | Android SDK Platform 29 | platforms/android-29/
- F) W {; O+ F1 [ - platforms;android-30 | 1 | Android SDK Platform 30 | platforms/android-30/* y- U: [8 K( t& w! \- i- x. R, d
- tools | 2.1.0 | Android SDK Tools 2.1 | tools/
/ D0 B' x" w% L0 U& G - Available Packages:" b: ]6 v6 ^3 m5 X* {7 k
- 以下省略
复制代码 ! j# i+ F) T! c+ o
4. 安装 Rust 及其它目前 Rust 的最新版是 1.45.0。安装过程如下。
. t- `2 P! c& ^0 s- $ export RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo$ o; }9 ~: b r7 H- `
- $ RUST_VERSION=1.45.0
5 f H+ c7 G& w. j5 t' P8 J - $ RUSTARCH='x86_64-unknown-linux-gnu'7 ^' O% g" d0 C& \! R
- $ wget -O /tmp/rustup-init "https://static.rust-lang.org/rustup/archive/1.21.1/${RUSTARCH}/rustup-init"
, d5 v6 Q! W# q1 `1 h - $ chmod 755 /tmp/rustup-init& Z# Z% Z" M9 [1 Z+ ]8 z! H
- $ /tmp/rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION: L s1 l5 o# a( u
- $ rm -fv /tmp/rustup-init
% L- B0 H, y+ [( m - $ chmod -R a+w ${RUSTUP_HOME} ${CARGO_HOME}- q, T2 H; @+ ^% v+ |
- $ 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 a% ]) S3 l1 @' c& W! o
- aarch64-linux-android
& }7 W8 O4 ~; Y t - i686-linux-android
. k& I9 j+ [( Z6 B/ x' j - x86_64-linux-android
复制代码 安装过程如下。- $ rustup install stable- j5 P3 N" a9 r! i5 P- B. ^
- $ rustup default stable% C5 c/ U p: w# |/ V
- $ rustup target add armv7-linux-androideabi0 B* K- u7 r( E& b
- $ rustup target add i686-linux-android
# O9 M! s. m1 e! B: Y+ o" ^ - $ rustup target add aarch64-linux-android
- B# a9 J$ l* Q/ ]- h0 Q% u+ ? - $ rustup target add x86_64-linux-android
复制代码
" \ x0 U6 }7 C% E$ a1 w! a5. 持久化环境变量上面的安装步骤是通过 export 来定义系统 PATH 的,在退出当前登录后就会丢失设置。
1 X' H0 V# w/ s4 D3 a, k! \因此需要持久化一些环境变量。
3 [9 P# l, _! \8 c# Q; |+ E编辑 ~/.bash_profile 文件。添加 ANDROID_HOME,RUSTUP_HOME,CARGO_HOME 的定义以及增加 PATH 定义。
1 K0 ~" N: Y- F( q; S8 v! z" u5 q% o6 h最后呈现内容如下。
5 R9 [' S) a; H+ m- # .bash_profile
! ]$ c. c: X/ u1 I8 R6 ~
6 C+ ]# G# {$ J. |: u. ?- # Get the aliases and functions4 ^" J" X: |9 |# K* H
- if [ -f ~/.bashrc ]; then/ I+ c' ]7 f# K- W
- . ~/.bashrc
) Q, ?9 Q4 _, k2 e2 z U8 Y4 Z* c - fi
1 _: S6 v: m+ u/ w% F1 d* _ - ! c3 c! ^; f/ a; ~9 E) [8 y! D
- # User specific environment and startup programs
! F! W" k% B! U- @ - , @2 N5 @1 |+ F/ n$ ~' g7 L
- export ANDROID_HOME=/opt/sdk RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo; u9 |8 r5 S7 y2 @" n( A
- 3 ~1 J# s4 T" e: K" c
- PATH=$PATH:$HOME/bin:$ANDROID_HOME/tools/bin:/usr/local/go/bin:/usr/local/cargo/bin6 L8 E( A, f! Q( i/ l9 n' ]
- k- \4 W" l7 ~0 k5 u
- export PATH
复制代码
- B1 L! y; z2 `9 c% g) v6. 编译 Android 项目这里选一个比较简单的项目来练手:v2ray-plugin-android。
5 u( u, ^) K; K _8 [编译过程如下。
3 {" P R; Z0 Z8 d- $ git clone https://github.com/shadowsocks/v2ray-plugin-android.git2 u. X; w% A: r8 m' _
- $ cd v2ray-plugin-android
! d* G) u' D* _' W7 X# \* m3 [3 W - $ git submodule update --init --recursive
/ H8 X4 S% |. A ]3 w! \ - $ ./gradlew assembleRelease
复制代码 3 O" a, l! H+ ?8 z& [5 n, f3 \
完成后,编译好的 apk 文件位于 app/build/outputs/apk/release 路径下。9 e5 M4 y4 s R
Android 系统要求所有 apk 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。4 h# c; B$ _1 [
因此这些 apk 文件还不能被直接拿来安装。: G. b& `: ?4 `
至于如何签名,请参考以下链接,过程省略。
9 a: k: T0 }( a# ?% V% ~# Bhttps://developer.android.com/studio/publish/app-signing- I+ K1 h& {8 y) y3 s8 q* ~
7. 总结当你习惯于用命令行做事的时候,你会发现效率往往会有很大的提升。编译代码亦是如此。 @0 l: R" F- O$ z4 [
7 l2 @0 {& F4 x0 Q1 B, U
. e# m7 d0 a7 A+ L3 b
9 b1 J) @9 v" ~( E5 v& A
. K; p/ K$ g; f! r0 W5 x; y3 T o3 g0 S; e) a( P
% F1 |, j+ d6 T( O; U4 m) u
3 C' [ l) t; a t
0 B' d. ~) g" k |
|