2021-12-17 18:09:10 +01:00
# Building mobile libraries
2019-07-09 15:36:56 +02:00
2021-12-17 18:09:10 +01:00
## Prerequisites
2019-07-09 15:36:56 +02:00
2022-01-22 09:23:48 +01:00
To build for iOS, you need to run macOS with either
[Command Line Tools ](https://developer.apple.com/download/all/?q=command%20line%20tools )
or [Xcode ](https://apps.apple.com/app/xcode/id497799835 ) installed.
2022-01-04 19:42:11 +01:00
2022-01-22 09:23:48 +01:00
To build for Android, you need either
[Android Studio ](https://developer.android.com/studio ) or
[Command Line Tools ](https://developer.android.com/studio#downloads ) installed, which in turn must be used to install [Android NDK ](https://developer.android.com/ndk/ ).
2022-01-04 19:42:11 +01:00
2019-07-09 15:36:56 +02:00
2022-01-22 09:23:48 +01:00
### Go and Go mobile
2021-12-17 18:09:10 +01:00
2023-01-27 21:38:38 +01:00
First, follow the instructions to [install
Go](https://github.com/lightningnetwork/lnd/blob/master/docs/INSTALL.md#building-a-development-version-from-source).
2022-01-04 19:42:11 +01:00
2022-01-22 09:23:48 +01:00
### Docker
2022-01-04 19:42:11 +01:00
2022-01-22 09:23:48 +01:00
Install and run [Docker ](https://www.docker.com/products/docker-desktop ).
2021-12-17 18:09:10 +01:00
2022-01-22 09:23:48 +01:00
### Make
2019-07-09 15:36:56 +02:00
2022-01-22 09:23:48 +01:00
Check that `make` is available by running the following command without errors:
2021-12-17 18:09:10 +01:00
```shell
2022-10-28 19:29:10 +02:00
make --version
2021-12-17 18:09:10 +01:00
```
2022-01-22 09:23:48 +01:00
## Building the libraries
2019-07-09 15:36:56 +02:00
2022-01-22 09:23:48 +01:00
Note that `gomobile` only supports building projects from `$GOPATH` at this
point. However, with the introduction of Go modules, the source code files are
no longer installed there by default.
2019-07-09 15:36:56 +02:00
2022-01-04 19:42:11 +01:00
```shell
2023-01-27 21:38:38 +01:00
git clone https://github.com/lightningnetwork/lnd.git $GOPATH/src/github.com/lightningnetwork/lnd
2022-01-04 19:42:11 +01:00
```
2022-01-22 09:23:48 +01:00
Finally, let’ s change directory to the newly created lnd folder inside `$GOPATH` :
2022-01-04 19:42:11 +01:00
```shell
2022-10-28 19:29:10 +02:00
cd $GOPATH/src/github.com/lightningnetwork/lnd
2022-01-04 19:42:11 +01:00
```
2023-01-27 21:38:38 +01:00
It is not recommended building from the master branch for mainnet. To check out
2022-01-22 09:23:48 +01:00
the latest tagged release of lnd, run
2022-01-04 19:42:11 +01:00
```shell
2022-10-28 19:29:10 +02:00
git checkout $(git describe --match "v[0-9]*" --abbrev=0)
2022-01-04 19:42:11 +01:00
```
2023-01-27 21:38:38 +01:00
Then, install [Go mobile ](https://github.com/golang/go/wiki/Mobile ) and
initialize it:
```shell
go install golang.org/x/mobile/cmd/gomobile
gomobile init
```
2022-01-22 09:23:48 +01:00
### iOS
2021-12-17 18:09:10 +01:00
2021-01-17 14:59:23 +01:00
```shell
2022-10-28 19:29:10 +02:00
make ios
2019-07-09 15:36:56 +02:00
```
2022-01-22 09:23:48 +01:00
The Xcode framework file will be found in `mobile/build/ios/Lndmobile.xcframework` .
2021-12-17 18:09:10 +01:00
2022-01-22 09:23:48 +01:00
### Android
2022-01-04 19:42:11 +01:00
2021-01-17 14:59:23 +01:00
```shell
2022-10-28 19:29:10 +02:00
make android
2019-07-09 15:36:56 +02:00
```
2022-01-22 09:23:48 +01:00
The AAR library file will be found in `mobile/build/android/Lndmobile.aar` .
2019-07-09 15:36:56 +02:00
2022-01-22 09:23:48 +01:00
---
Tip: `make mobile` will build both iOS and Android libraries.
2021-12-17 18:09:10 +01:00
2022-01-22 09:23:48 +01:00
---
2019-07-09 15:36:56 +02:00
2021-12-17 18:09:10 +01:00
## Generating proto definitions
2019-11-21 12:35:52 +01:00
In order to call the methods in the generated library, the serialized proto for
the given RPC call must be provided. Similarly, the response will be a
serialized proto.
2019-07-09 15:36:56 +02:00
2021-12-17 18:09:10 +01:00
### iOS
2021-10-26 12:48:17 +02:00
In order to generate protobuf definitions for iOS, add `--swift_out=.` to the
2021-12-17 18:09:10 +01:00
first `protoc` invocation found in [ `gen_protos.sh` ](../lnrpc/gen_protos.sh ).
2021-10-26 12:48:17 +02:00
2021-12-17 18:09:10 +01:00
Then, some changes to [Dockerfile ](../lnrpc/Dockerfile ) need to be done in
2021-10-26 12:48:17 +02:00
order to use the [Swift protobuf ](https://github.com/apple/swift-protobuf )
plugin with protoc:
1. Replace the base image with `FROM swift:focal` so that Swift can be used.
2. `clang-format='1:7.0*'` is unavailable in Ubuntu Focal. Change that to
2022-01-28 23:23:08 +01:00
`clang-format='1:10.0*'` .
2021-10-26 12:48:17 +02:00
3. On the next line, install Go and set the environment variables by adding the
following commands:
```
RUN apt-get install -y wget \
2022-01-22 09:23:48 +01:00
& & wget -c https://golang.org/dl/go1.17.6.linux-amd64.tar.gz -O - \
2021-10-26 12:48:17 +02:00
| tar -xz -C /usr/local
ENV GOPATH=/go
ENV PATH=$PATH:/usr/local/go/bin:/go/bin
```
4. At the end of the file, just above `CMD` , add the following `RUN` command.
This will download and compile the latest tagged release of Swift protobuf.
```
RUN git clone https://github.com/apple/swift-protobuf.git \
&& cd swift-protobuf \
& & git checkout $(git describe --tags --abbrev=0) \
& & swift build -c release \
& & mv .build/release/protoc-gen-swift /bin
```
Finally, run `make rpc` .
2021-12-17 18:09:10 +01:00
Tip: The generated Swift files will be found in various folders. If you’ d like
to move them to the same folder as the framework file, run
```shell
2022-10-28 19:29:10 +02:00
find . -name "*.swift" -print0 | xargs -0 -I {} mv {} mobile/build/ios
2021-12-17 18:09:10 +01:00
```
`Lndmobile.xcframework` and all Swift files should now be added to your Xcode
project. You will also need to add [Swift Protobuf ](https://github.com/apple/swift-protobuf )
to your project to support the generated code.
### Android
2021-10-26 12:48:17 +02:00
2022-01-04 19:42:11 +01:00
#### First option:
2021-10-26 12:48:17 +02:00
In order to generate protobuf definitions for Android, add `--java_out=.`
2021-12-17 18:09:10 +01:00
2021-10-26 12:48:17 +02:00
to the first `protoc` invocation found in
2021-12-17 18:09:10 +01:00
[ `gen_protos.sh` ](../lnrpc/gen_protos.sh ). Then, run `make rpc` .
2022-01-04 19:42:11 +01:00
#### Second option (preferable):
- You have to install the profobuf plugin to your Android application.
Please, follow this link https://github.com/google/protobuf-gradle-plugin.
- Add this line to your `app build.gradle` file.
```shell
classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.17"
```
- Create a `proto` folder under the `main` folder.
![proto_folder ](docs/proto_folder.png )
- Add `aar` file to libs folder.
- After that add these lines to your `module's` `build.gradle` file:
```shell
plugins {
id "com.google.protobuf"
}
android {
sourceSets {
main {
proto {
}
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.google.protobuf:protobuf-javalite:${rootProject.ext.javalite_version}"
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:${rootProject.ext.protoc_version}"
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option "lite"
}
}
}
}
}
```
- Then, copy all the proto files from `lnd/lnrpc` to your `proto` folder, saving the structure.
- Build the project and wait until you see the generated Java proto files in the `build` folder.
2022-01-22 09:23:48 +01:00
---
*Note:*
2022-01-04 19:42:11 +01:00
If Android Studio tells you that the `aar` file cannot be included into the `app-bundle` , this is a workaround:
1. Create a separate gradle module
2. Remove everything from there and leave only `aar` and `build.gradle` .
![separate_gradle_module ](docs/separate_gradle_module.png )
2022-01-13 17:29:43 +01:00
3. Gradle file should contain only these lines:
2022-01-04 19:42:11 +01:00
```shell
configurations.maybeCreate("default")
artifacts.add("default", file('Lndmobile.aar'))
```
4. In `dependencies` add this line instead of depending on `libs` folder:
```shell
implementation project(":lndmobile", { "default" })
```
2022-01-22 09:23:48 +01:00
---
2022-01-04 19:42:11 +01:00
2022-05-11 19:18:50 +02:00
## Calling the API
2019-07-09 15:36:56 +02:00
2022-05-11 19:18:50 +02:00
In LND v0.15+ all API methods have prefixed the generated methods with the subserver name. This is required to support subservers with name conflicts.
2019-07-09 15:36:56 +02:00
2024-07-15 09:59:00 +02:00
e.g. `QueryScores` is now `AutopilotQueryScores` . `GetBlockHeader` is now `NeutrinoKitGetBlockHeader` .
2019-07-09 15:36:56 +02:00
2021-12-17 18:09:10 +01:00
## API docs
2022-01-22 09:23:48 +01:00
- [LND gRPC API Reference ](https://api.lightning.community )
2022-01-28 23:23:08 +01:00
- [LND Builder’ s Guide ](https://docs.lightning.engineering )