1# ndkports 2 3A collection of Android build scripts for various third-party libraries and the 4tooling to build them. 5 6If you're an Android app developer looking to *consume* these libraries, this is 7probably not what you want. This project builds AARs to be published to Maven. 8You most likely want to use the AAR, not build it yourself. 9 10Note: Gradle support for consuming these artifacts from an AAR is a work in 11progress. 12 13## Ports 14 15Each third-party project is called a "port". Ports consist of a description of 16where to fetch the source, apply any patches needed, build, install, and package 17the library into an AAR. 18 19A port is a subclass of the abstract Kotlin class `com.android.ndkports.Port`. 20Projects define the name and version of the port, the URL to fetch source from, 21a list of modules (libraries) to build, and the build steps. 22 23```kotlin 24abstract class Port { 25 abstract val name: String 26 abstract val version: String 27 abstract val url: String 28 29 open val dependencies: List<String> = emptyList() 30 abstract val modules: List<Module> 31 32 open fun fetchSource( 33 sourceDirectory: File, 34 workingDirectory: File 35 ): Result<Unit, String> 36 37 open fun configure( 38 toolchain: Toolchain, 39 sourceDirectory: File, 40 buildDirectory: File, 41 installDirectory: File, 42 workingDirectory: File 43 ): Result<Unit, String> 44 45 open fun build( 46 toolchain: Toolchain, 47 buildDirectory: File 48 ): Result<Unit, String> 49 50 open fun install( 51 toolchain: Toolchain, 52 buildDirectory: File, 53 installDirectory: File 54 ): Result<Unit, String> 55} 56``` 57 58Individual port files are kept in `ports/$name/port.kts`. For example, the cURL 59port is [ports/curl/port.kts](ports/curl/port.kts). 60 61## Building a Port 62 63ndkports requires an NDK to be used for building to be specified on the command 64line as well as a list of packages to build. For example, to build cURL: 65 66```bash 67$ ./gradlew run --args='--ndk /path/to/android-ndk-r20 openssl curl' 68Build output... 69$ find -name '*.aar' 70./out/curl/curl.aar 71./out/openssl/openssl.aar 72``` 73 74Note that dependencies currently need to be already built or ordered explicitly. 75 76To build all ports using Docker, use `scripts/build.sh`. 77