1
0
Fork 0
mirror of https://github.com/syncthing/syncthing-android.git synced 2024-11-29 07:41:17 +00:00

Build Syncthing with CGO and target android (fixes #873)

This commit is contained in:
Felix Ableitner 2017-10-13 15:59:19 +09:00
parent 9840076f31
commit 1660479b6e
14 changed files with 67 additions and 277 deletions

1
.gitignore vendored
View file

@ -15,6 +15,7 @@ gen/
src/main/jniLibs/ src/main/jniLibs/
obj/ obj/
.gradle/ .gradle/
gobuild/
# Local configuration file (sdk path, etc) # Local configuration file (sdk path, etc)
local.properties local.properties

13
.gitmodules vendored
View file

@ -1,12 +1,3 @@
[submodule "ext/syncthing/src/github.com/syncthing/syncthing"] [submodule "syncthing"]
path = ext/syncthing/src/github.com/syncthing/syncthing path = go/src/github.com/syncthing/syncthing
url = https://github.com/syncthing/syncthing.git url = https://github.com/syncthing/syncthing.git
ignore = dirty
[submodule "ext/golang/go"]
path = ext/golang/go
url = https://github.com/golang/go.git
ignore = dirty
[submodule "ext/golang/go1.4"]
path = ext/golang/go1.4
url = https://github.com/golang/go.git
ignore = dirty

View file

@ -1,6 +1,7 @@
sudo: required sudo: required
language: android language: android
jdk: oraclejdk8 jdk: oraclejdk8
dist: trusty
# Install Android SDK # Install Android SDK
android: android:
@ -13,10 +14,18 @@ android:
- android-26 - android-26
- extra-android-m2repository - extra-android-m2repository
# Install Android NDK (apparently there is no easier way to do this)
# https://github.com/travis-ci/travis-ci/issues/5395
before_script:
- curl -L https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip -O
- unzip -q android-ndk-r15c-linux-x86_64.zip
- export ANDROID_NDK_HOME=`pwd`/android-ndk-r15c
# Install Golang # Install Golang
before_install: before_install:
- sudo add-apt-repository ppa:gophers/archive -y
- sudo apt-get update -qq - sudo apt-get update -qq
- sudo apt-get install golang -y - sudo apt-get install golang-1.9-go -y
# Cache gradle dependencies # Cache gradle dependencies
# https://docs.travis-ci.com/user/languages/android/#Caching # https://docs.travis-ci.com/user/languages/android/#Caching
@ -29,5 +38,5 @@ cache:
- $HOME/.gradle/wrapper/ - $HOME/.gradle/wrapper/
script: script:
- ./gradlew clean lint - ./gradlew lintVitalRelease
- ./gradlew buildNative assembleDebug - ./gradlew buildNative assembleDebug

View file

@ -35,7 +35,7 @@ Use `./gradlew assembleDebug` in the project directory to compile the APK.
To prepare a new release, execute `./prepare-release.bash`, and follow the instructions. To prepare a new release, execute `./prepare-release.bash`, and follow the instructions.
To check for updated gradle dependencies, run `gradle dependencyUpdates`. Additionally, the git submodule in `ext/syncthing/src/github.com/syncthing/syncthing` may need to be updated. To check for updated gradle dependencies, run `gradle dependencyUpdates`. Additionally, the git submodule in `go/src/github.com/syncthing/syncthing/` may need to be updated.
### Building on Windows ### Building on Windows

View file

@ -83,13 +83,11 @@ android {
task buildNative(type: Exec) { task buildNative(type: Exec) {
outputs.upToDateWhen { false } outputs.upToDateWhen { false }
executable = './make-all.bash' executable = './make-syncthing.bash'
} }
task cleanNative(type: Delete) { task cleanNative(type: Delete) {
delete 'src/main/jniLibs/' delete 'src/main/jniLibs/'
delete 'ext/syncthing/bin/'
delete 'ext/syncthing/pkg/'
} }
play { play {

@ -1 +0,0 @@
Subproject commit cd6b6202dd1559b3ac63179b45f1833fcfbe7eca

@ -1 +0,0 @@
Subproject commit 50eb39bb23e8b03e823c38e844f0410d0b5325d2

@ -1 +0,0 @@
Subproject commit 5aade9a4a5506e5b71b2a9ab863790dca488700e

@ -0,0 +1 @@
Subproject commit cdbb32d0f043c56c6787df3f036feabc8891fd3c

View file

@ -1,12 +0,0 @@
#!/bin/bash -e
# Build the syncthing library
./make-go.bash arm
./make-syncthing.bash arm
./make-go.bash 386
./make-syncthing.bash 386
./make-go.bash arm64
./make-syncthing.bash arm64

View file

@ -1,96 +0,0 @@
#!/usr/bin/env bash
set -e
MYDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export CGO_ENABLED=0
if [ -z "$GOROOT_BOOTSTRAP" ]; then
# We need Go 1.4 to bootstrap Go 1.5
if [ -z $GOROOT ] || [[ $(go version) != go\ version\ go1.4* ]] ; then
git submodule update --init ext/golang/go1.4
# Build Go 1.4 for host
pushd ext/golang/go1.4/src
./make.bash --no-clean
popd
# Add Go 1.4 to the environment
export GOROOT="$(pwd)/ext/golang/go1.4"
fi
# Add Go 1.4 compiler to PATH
export GOROOT_BOOTSTRAP=$GOROOT
fi
case "$1" in
arm)
export GOOS=linux
export GOARCH=arm
export GOARM=5
;;
arm64)
export GOOS=linux
export GOARCH=arm64
unset GOARM
;;
386)
export GOOS=linux
export GOARCH=386
export GO386=387
;;
*)
echo "Invalid architecture"
exit 1
esac
unset GOPATH
export GOROOT_FINAL=${MYDIR}/ext/golang/dist/go-${GOOS}-${GOARCH}
if [ -d "$GOROOT_FINAL" ]; then
rm -r "$GOROOT_FINAL"
fi
mkdir -p "$GOROOT_FINAL"
pushd ext/golang/go/src
git reset --hard HEAD
# Apply patches to Golang
for PATCH in $MYDIR/patches/golang/all/*.patch; do
echo "Applying $PATCH"
patch -p1 <$PATCH
done
set +e
./clean.bash
rm -r ../bin
rm -r ../pkg
set -e
if [ ! -e ../VERSION ]; then
echo "$(git describe --tags)" > ../VERSION
fi
BUILDER_EXT=bash
case "$(uname)" in
*MINGW* | *WIN32* | *CYGWIN*)
BUILDER_EXT=bat
;;
esac
./make.${BUILDER_EXT} --no-banner
cp -a ../bin "${GOROOT_FINAL}"/
cp -a ../pkg "${GOROOT_FINAL}"/
cp -a ../src "${GOROOT_FINAL}"/
if [[ -e ./make.${BUILDER_EXT} ]]; then
pushd ../
git clean -f
popd
fi
popd
echo "Complete"

View file

@ -2,72 +2,63 @@
set -e set -e
MYDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
JNIDIR="/src/main/jniLibs" TARGET_SDK=$(grep "targetSdkVersion" "${ROOT_DIR}/build.gradle" -m 1 | awk '{print $2}')
# Use seperate build dir so standalone ndk isn't deleted by `gradle clean`
BUILD_DIR="${ROOT_DIR}/gobuild"
export GOPATH="${ROOT_DIR}/go/"
case "$1" in cd "${ROOT_DIR}/go/src/github.com/syncthing/syncthing"
arm)
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=arm
export GOARM=5
export TARGETDIR=$MYDIR$JNIDIR/armeabi
;;
arm64)
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=arm64
unset GOARM
export TARGETDIR=$MYDIR$JNIDIR/arm64-v8a
;;
386)
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=386
export GO386=387
export TARGETDIR=$MYDIR$JNIDIR/x86
;;
*)
echo "Invalid architecture"
exit 1
esac
unset GOPATH #Set by build.go
export GOROOT=${MYDIR}/ext/golang/dist/go-${GOOS}-${GOARCH}
export PATH=${GOROOT}/bin:${PATH}
case "$(uname)" in
*CYGWIN*)
export GOROOT=`cygpath -w $GOROOT`
;;
esac
pushd ext/syncthing/src/github.com/syncthing/syncthing
_GOOS=$GOOS
unset GOOS
_GOARCH=$GOARCH
unset GOARCH
# Make sure all tags are available for git describe # Make sure all tags are available for git describe
# https://github.com/syncthing/syncthing-android/issues/872 # https://github.com/syncthing/syncthing-android/issues/872
git fetch --tags git fetch --tags
go run build.go -goos=${_GOOS} -goarch=${_GOARCH} clean for ANDROID_ARCH in arm x86 arm64; do
go run build.go -goos=${_GOOS} -goarch=${_GOARCH} -no-upgrade build echo -e "Starting build for ${ANDROID_ARCH}\n"
case ${ANDROID_ARCH} in
arm)
GOARCH=arm
JNI_DIR="armeabi"
GCC="arm-linux-androideabi-gcc"
;;
arm64)
GOARCH=arm64
JNI_DIR="arm64-v8a"
GCC="aarch64-linux-android-gcc"
;;
x86)
GOARCH=386
JNI_DIR="x86"
GCC="i686-linux-android-gcc"
;;
*)
echo "Invalid architecture"
exit 1
esac
export GOOS=$_GOOS # Build standalone NDK toolchain if it doesn't exist.
export GOARCH=$_GOARCH # https://developer.android.com/ndk/guides/standalone_toolchain.html
STANDALONE_NDK_DIR="${BUILD_DIR}/standalone-ndk/android-${TARGET_SDK}-${GOARCH}"
mkdir -p ${TARGETDIR} if [ ! -d "$STANDALONE_NDK_DIR" ]; then
mv syncthing ${TARGETDIR}/libsyncthing.so echo -e "Building standalone NDK\n"
chmod 644 ${TARGETDIR}/libsyncthing.so ${ANDROID_NDK_HOME}/build/tools/make-standalone-toolchain.sh \
--platform=android-${TARGET_SDK} --arch=${ANDROID_ARCH} \
--install-dir=${STANDALONE_NDK_DIR}
fi
if [[ -e ./build.go ]]; then echo -e "Building Syncthing\n"
git clean -f CGO_ENABLED=1 CC="${STANDALONE_NDK_DIR}/bin/${GCC}" \
fi go run build.go -goos android -goarch ${GOARCH} -pkgdir "${BUILD_DIR}/go-packages" -no-upgrade build
popd # Copy compiled binary to jniLibs folder
TARGET_DIR="$ROOT_DIR/src/main/jniLibs/$JNI_DIR"
mkdir -p ${TARGET_DIR}
mv syncthing ${TARGET_DIR}/libsyncthing.so
echo "Build Complete" echo -e "Finished build for ${ANDROID_ARCH}\n"
done
echo -e "All builds finished"

View file

@ -1,90 +0,0 @@
--- /net/dnsconfig_unix.go 2016-08-20 08:14:05.763235602 -0400
+++ /net/dnsconfig_unix.go 2016-08-20 08:14:05.763235602 -0400
@@ -9,16 +9,59 @@
package net
import (
+ "fmt"
"os"
+ "os/exec"
+ "strings"
"sync/atomic"
"time"
)
var (
- defaultNS = []string{"127.0.0.1:53", "[::1]:53"}
+ currentNS []string
getHostname = os.Hostname // variable for testing
)
+func getDefaultNS() []string {
+ var servers []string
+ for _, prop := range []string{"net.dns1", "net.dns2"} {
+ cmd := exec.Command("getprop", prop)
+ outputBytes, err := cmd.Output()
+ if err != nil {
+ continue
+ }
+ output := strings.Trim(string(outputBytes), "\n")
+ if ParseIP(output) != nil {
+ servers = append(servers, JoinHostPort(output, "53"))
+ }
+ }
+
+ if len(servers) == 0 {
+ servers = []string{"8.8.8.8:53", "8.8.4.4:53", "4.2.2.1:53"}
+ }
+
+ if !slicesEqual(currentNS, servers) {
+ fmt.Println("Using DNS servers:", servers)
+ currentNS = servers
+ }
+
+ return currentNS
+}
+
+func slicesEqual(a, b []string) bool {
+ if len(a) != len(b) {
+ return false
+ }
+
+ for i := range a {
+ if a[i] != b[i] {
+ return false
+ }
+ }
+
+ return true
+}
+
type dnsConfig struct {
servers []string // server addresses (in host:port form) to use
search []string // rooted suffixes to append to local name
@@ -42,7 +85,7 @@ func dnsReadConfig(filename string) *dnsConfig {
}
file, err := open(filename)
if err != nil {
- conf.servers = defaultNS
+ conf.servers = getDefaultNS()
conf.search = dnsDefaultSearch()
conf.err = err
return conf
@@ -51,7 +94,7 @@ func dnsReadConfig(filename string) *dnsConfig {
if fi, err := file.file.Stat(); err == nil {
conf.mtime = fi.ModTime()
} else {
- conf.servers = defaultNS
+ conf.servers = getDefaultNS()
conf.search = dnsDefaultSearch()
conf.err = err
return conf
@@ -130,7 +173,7 @@ func dnsReadConfig(filename string) *dnsConfig {
}
}
if len(conf.servers) == 0 {
- conf.servers = defaultNS
+ conf.servers = getDefaultNS()
}
if len(conf.search) == 0 {
conf.search = dnsDefaultSearch()

View file

@ -16,7 +16,7 @@ Checking for Syncthing Update
----------------------------- -----------------------------
" "
PROJECT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJECT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "ext/syncthing/src/github.com/syncthing/syncthing/" cd "go/src/github.com/syncthing/syncthing/"
git fetch git fetch
CURRENT_TAG=$(git describe) CURRENT_TAG=$(git describe)
LATEST_TAG=$(git tag --sort=taggerdate | awk '!/rc/' | tail -1) LATEST_TAG=$(git tag --sort=taggerdate | awk '!/rc/' | tail -1)
@ -24,7 +24,7 @@ if [ ${CURRENT_TAG} != ${LATEST_TAG} ]
then then
git checkout -f ${LATEST_TAG} git checkout -f ${LATEST_TAG}
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
git add "ext/syncthing/src/github.com/syncthing/syncthing" git add "go/src/github.com/syncthing/syncthing/"
git commit -m "Updated Syncthing to $LATEST_TAG" git commit -m "Updated Syncthing to $LATEST_TAG"
./gradlew cleanNative buildNative ./gradlew cleanNative buildNative
fi fi