summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Obenhuber <flxo@users.noreply.github.com>2024-04-02 11:39:24 +0200
committerGitHub <noreply@github.com>2024-04-02 17:39:24 +0800
commit9354683481ff3c1a874d25f2a4082f14ec253698 (patch)
treef4fd5dcaaf39ca7c4b9d8bb114d8459208435cbe
parent6ef2d569b531faf0c0b9dce2f3b0588ca6645e47 (diff)
Enable Android build (#384)
* Support build for target_os android The target_os `android` is quite similar to `linux` but must be mentioned in the guards explicitly. Tested for target `aarch64-linux-android`. * Add target aarch64-linux-android to ci Use `cross` for building target `aarch64-linux-android`. In the `ci` workflow the matrix branch of `os` `ubuntu-latest` is used because the matrix organization is host os centric instead of target. Releases are build with `cross` for target `aarch64-linux-android`. Install `cross` if needed for a run. At the time of writing the latest release of `cross` can't build binaries for target `aarch64-linux-android` and it's common sense that the latest git tag or `master` shall be used [1]. [1] https://github.com/cross-rs/cross/issues/1222 * Add android related readme section
-rw-r--r--.github/workflows/ci.yaml21
-rw-r--r--.github/workflows/release.yaml12
-rw-r--r--CHANGELOG.md5
-rw-r--r--Cargo.toml2
-rw-r--r--README.md15
-rw-r--r--src/os/mod.rs2
-rw-r--r--src/os/shared.rs4
7 files changed, 54 insertions, 7 deletions
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index f06f6cc..19fbac6 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -47,13 +47,25 @@ jobs:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy
+ - name: Install Cross on Ubuntu
+ if: matrix.os == 'ubuntu-latest'
+ # The latest realese of `cross` is not able to build/link for `aarch64-linux-android`
+ # See: https://github.com/cross-rs/cross/issues/1222
+ # This is fixed on `main` but not yet released. To avoid a breakage somewhen in the future
+ # pin the cross revision used to the latest HEAD at 04/2024.
+ # Remove the git source and revision once cross 0.3 is released.
+ run: cargo install --git https://github.com/cross-rs/cross.git --rev 085092c cross
+
- name: Check formatting
run: cargo fmt --all -- --check
- name: Build
- id: build
run: cargo build --verbose
+ - name: Build target aarch64-linux-android
+ if: matrix.os == 'ubuntu-latest'
+ run: cross build --target aarch64-linux-android --verbose
+
# This is useful for debugging problems when the expected build artifacts
# (like shell completions and man pages) aren't generated.
- name: Show build.rs stderr
@@ -103,6 +115,13 @@ jobs:
name: ${{ matrix.os }}-${{ matrix.rust }}-failed_snapshots
path: '**/*.snap.new'
+ - name: Upload android binary
+ if: ${{ matrix.os == 'ubuntu-latest' && ( success() || steps.build.outcome == 'success' ) }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: aarch64-linux-android-${{ matrix.rust }}
+ path: target/aarch64-linux-android/debug/bandwhich
+
- name: Upload unix binary
if: ${{ matrix.os != 'windows-latest' && ( success() || steps.build.outcome == 'success' ) }}
uses: actions/upload-artifact@v3
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index a9ea033..630cadd 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -52,11 +52,17 @@ jobs:
strategy:
matrix:
build:
+ - aarch64-linux-android
- linux-x64-gnu
- linux-x64-musl
- macos-x64
- windows-x64-msvc
include:
+ - cargo: cargo # default; overwrite with `cross` if necessary
+ - build: aarch64-linux-android
+ os: ubuntu-latest
+ target: aarch64-linux-android
+ cargo: cross
- build: linux-x64-gnu
os: ubuntu-latest
target: x86_64-unknown-linux-gnu
@@ -84,13 +90,17 @@ jobs:
if: matrix.target == 'x86_64-unknown-linux-musl'
run: sudo apt-get install -y --no-install-recommends musl-tools
+ - name: Install cross
+ if: matrix.cargo == 'cross'
+ run: cargo install --git https://github.com/cross-rs/cross.git --rev 085092c cross
+
- name: Build release binary
shell: bash
env:
RUSTFLAGS: "-C strip=symbols"
run: |
mkdir -p "$BANDWHICH_GEN_DIR"
- cargo build --verbose --release --target ${{ matrix.target }}
+ ${{ matrix.cargo }} build --verbose --release --target ${{ matrix.target }}
- name: Collect build artifacts
shell: bash
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1d678f1..514557b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,17 +7,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
## [Unreleased]
## Fixed
+
* Remove redundant imports #377 - @cyqsimon
* CI: use GitHub API to exempt dependabot from changelog requirement #378 - @cyqsimon
* Remove unnecessary logging synchronisation #381 - @cyqsimon
* Apply suggestions from new clippy lint clippy::assigning_clones #382 - @cyqsimon
* Fix IPv6 socket detect logic #383 - @cyqsimon
+* Support build for `target_os`` `android` #384 - @flxo
## Added
+
* CI: include generated assets in release archive #359 - @cyqsimon
* Add PID column to the process table #379 - @notjedi
+* CI: add builds for target `aarch64-linux-android` #384 - @flxo
## Changed
+
* CI: strip release binaries for all targets #358 - @cyqsimon
* Bump MSRV to 1.74 (required by clap 4.5; see #373)
* CI: Configure dependabot grouping #395 - @cyqsimon
diff --git a/Cargo.toml b/Cargo.toml
index 102708e..3f84c5b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -43,7 +43,7 @@ trust-dns-resolver = "0.23.2"
unicode-width = "0.1.11"
strum = { version = "0.26.2", features = ["derive"] }
-[target.'cfg(target_os = "linux")'.dependencies]
+[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
procfs = "0.16.0"
[target.'cfg(any(target_os = "macos", target_os = "freebsd"))'.dependencies]
diff --git a/README.md b/README.md
index c967518..73e0fbe 100644
--- a/README.md
+++ b/README.md
@@ -56,7 +56,7 @@ For more details, see [The Future of Bandwhich #275](https://github.com/imsnif/b
### Download a prebuilt binary
-If you're on linux, you can download the generic binary from the releases.
+If you're on `android` or `linux`, you can download the generic binary from the [releases](https://github.com/imsnif/bandwhich/releases)
### Arch Linux
@@ -123,6 +123,19 @@ The minimum supported Rust version is **1.70.0**.
cargo install bandwhich
```
+#### Building from source for Android (`aarch64-linux-android`)
+
+Building for target `aarch64-linux-android` is supported via [cross](https://github.com/cross-rs/cross). Until [#1222](https://github.com/cross-rs/cross/issues/1222) is solved, use the latest HEAD:
+
+```sh
+cargo install --git https://github.com/cross-rs/cross.git cross
+cross build --release --target aarch64-linux-android
+```
+
+Kindly be aware that this process generates a pure binary file and not an APK suitable for installation on any arbitrary Android device.
+
+The Android support for bandwhich beyond its build is *not* endorsed by this project and may be unstable or non-functional.
+
### OpenWRT
To install `bandwhich` on OpenWRT, you'll need to compile a binary that would fit its processor architecture. This might mean you would have to cross compile if, for example, you're working on an `x86_64` and the OpenWRT is installed on an `arm7`.
diff --git a/src/os/mod.rs b/src/os/mod.rs
index 7770de9..434c9d7 100644
--- a/src/os/mod.rs
+++ b/src/os/mod.rs
@@ -1,4 +1,4 @@
-#[cfg(target_os = "linux")]
+#[cfg(any(target_os = "android", target_os = "linux"))]
mod linux;
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
diff --git a/src/os/shared.rs b/src/os/shared.rs
index fbe3559..bb0e532 100644
--- a/src/os/shared.rs
+++ b/src/os/shared.rs
@@ -13,7 +13,7 @@ use tokio::runtime::Runtime;
use crate::{network::dns, os::errors::GetInterfaceError, OsInputOutput};
-#[cfg(target_os = "linux")]
+#[cfg(any(target_os = "android", target_os = "linux"))]
use crate::os::linux::get_open_sockets;
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
use crate::os::lsof::get_open_sockets;
@@ -220,7 +220,7 @@ fn eperm_message() -> &'static str {
}
#[inline]
-#[cfg(target_os = "linux")]
+#[cfg(any(target_os = "android", target_os = "linux"))]
fn eperm_message() -> &'static str {
r#"
Insufficient permissions to listen on network interface(s). You can work around