github.com/psiphon-labs/psiphon-tunnel-core@v2.0.28+incompatible/MobileLibrary/Android/make.bash (about) 1 #!/usr/bin/env bash 2 3 set -e -u -x 4 5 if [ ! -f make.bash ]; then 6 echo "make.bash must be run from $GOPATH/src/github.com/Psiphon-Labs/psiphon-tunnel-core/MobileLibrary/Android" 7 exit 1 8 fi 9 10 # $1, if specified, is go build tags 11 if [ -z ${1+x} ]; then BUILD_TAGS=""; else BUILD_TAGS="$1"; fi 12 13 # At this time, psiphon-tunnel-core doesn't support modules 14 export GO111MODULE=off 15 16 BUILDINFOFILE="psiphon-tunnel-core_buildinfo.txt" 17 BUILDDATE=$(date --iso-8601=seconds) 18 BUILDREPO=$(git config --get remote.origin.url) 19 BUILDREV=$(git rev-parse --short HEAD) 20 GOVERSION=$(go version | perl -ne '/go version (.*?) / && print $1') 21 GOMOBILEVERSION=$(gomobile version | perl -ne '/gomobile version (.*?) / && print $1') 22 23 # DEPENDENCIES 24 # 25 # - this script produces a JSON object listing all Go package dependencies, 26 # excluding packages under github.com/Psiphon-Labs/psiphon-tunnel-core/ 27 # (thus also excluding vendored packages) which will all have the same rev 28 # as BUILDREV 29 # 30 # - starts the string with a `{` and ends with a `}` 31 # 32 # - uses the `go list` command and passes it a template string (using the Go 33 # template syntax) saying I want all the dependencies of the package in the 34 # current directory, printing 1/line via printf 35 # 36 # - pipes to `xargs` to run a command on each line output from the first 37 # command and uses `go list` with a template string to print the "Import 38 # Path" (from just below `$GOPATH/src`) if the package is not part of the 39 # standard library 40 # 41 # - pipes to `xargs` again, specifiying `pkg` as the placeholder name for each 42 # item being operated on (which is the list of non standard library import 43 # paths from the previous step); `xargs` runs a bash script (via `-c`) which 44 # changes to each import path in sequence, then echoes out, after the 45 # exclusion check, `"<import path>":"<subshell output of getting the short 46 # git revision>",` 47 # 48 # - for non-empty dependency lists, the last command leaves a trailing `,\n` at 49 # the end, so use `sed` and `tr` to remove the suffix. 50 # 51 DEPENDENCIES=$(cd ../psi && echo -n "{" && GOOS=android go list -tags "${BUILD_TAGS}" -f '{{range $dep := .Deps}}{{printf "%s\n" $dep}}{{end}}' | GOOS=android xargs go list -tags "${BUILD_TAGS}" -f '{{if not .Standard}}{{.ImportPath}}{{end}}' | xargs -I pkg bash -c 'cd $GOPATH/src/$0 && if echo -n "$0" | grep -vEq "^github.com/Psiphon-Labs/psiphon-tunnel-core/" ; then echo -n "\"$0\":\"$(git rev-parse --short HEAD)\"," ; fi' pkg | sed 's/,$//' | tr -d '\n' && echo -n "}") 52 53 LDFLAGS="\ 54 -s \ 55 -w \ 56 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.buildDate=$BUILDDATE \ 57 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.buildRepo=$BUILDREPO \ 58 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.buildRev=$BUILDREV \ 59 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.goVersion=$GOVERSION \ 60 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.gomobileVersion=$GOMOBILEVERSION \ 61 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.dependencies=$DEPENDENCIES \ 62 " 63 64 echo -e "${BUILDDATE}\n${BUILDREPO}\n${BUILDREV}\n" > $BUILDINFOFILE 65 66 echo "Variables for ldflags:" 67 echo " Build date: ${BUILDDATE}" 68 echo " Build repo: ${BUILDREPO}" 69 echo " Build revision: ${BUILDREV}" 70 echo " Go version: ${GOVERSION}" 71 echo " Gomobile version: ${GOMOBILEVERSION}" 72 echo " Dependencies: ${DEPENDENCIES}" 73 echo "" 74 75 # Note: android/386 is x86, which is used on both x86 and x86_64 Android 76 # devices. We are excluding the android/amd64, x86_64, ABI as it causes a 77 # crash in Android x86_64 emulators: "seccomp prevented call to disallowed 78 # x86_64 system call 22". x86/linux syscall 22 is pipe. 79 # 80 # In Android seccomp config, pipe is permitted only for 32-bit platforms: 81 # https://android.googlesource.com/platform/bionic/+/2b499046f10487802bfbaaf4429160595d08b22c/libc/SECCOMP_WHITELIST_APP.TXT#7. 82 # 83 # The Go syscall.Pipe on linux(android)/amd64 is the disallowed pipe: 84 # https://github.com/golang/go/blob/release-branch.go1.14/src/syscall/syscall_linux_amd64.go#L115-L126 85 # 86 # A potential future fix is to use the allowed pipe2, 87 # https://android.googlesource.com/platform/bionic/+/2b499046f10487802bfbaaf4429160595d08b22c/libc/SYSCALLS.TXT#129, 88 # which is what linux(android)/arm64 uses, for example: 89 # https://github.com/golang/go/blob/release-branch.go1.14/src/syscall/syscall_linux_arm64.go#L150-L159. 90 91 gomobile bind -v -x -target=android/arm,android/arm64,android/386 -tags="${BUILD_TAGS}" -ldflags="$LDFLAGS" github.com/Psiphon-Labs/psiphon-tunnel-core/MobileLibrary/psi 92 if [ $? != 0 ]; then 93 echo "..'gomobile bind' failed, exiting" 94 exit $? 95 fi 96 97 mkdir -p build-tmp/psi 98 unzip -o psi.aar -d build-tmp/psi 99 yes | cp -f PsiphonTunnel/AndroidManifest.xml build-tmp/psi/AndroidManifest.xml 100 yes | cp -f PsiphonTunnel/libs/armeabi-v7a/libtun2socks.so build-tmp/psi/jni/armeabi-v7a/libtun2socks.so 101 yes | cp -f PsiphonTunnel/libs/arm64-v8a/libtun2socks.so build-tmp/psi/jni/arm64-v8a/libtun2socks.so 102 yes | cp -f PsiphonTunnel/libs/x86/libtun2socks.so build-tmp/psi/jni/x86/libtun2socks.so 103 mkdir -p build-tmp/psi/res/xml 104 yes | cp -f PsiphonTunnel/ca_psiphon_psiphontunnel_backup_rules.xml build-tmp/psi/res/xml/ca_psiphon_psiphontunnel_backup_rules.xml 105 106 javac -d build-tmp -bootclasspath $ANDROID_HOME/platforms/android-$ANDROID_PLATFORM_VERSION/android.jar -source 1.8 -target 1.8 -classpath build-tmp/psi/classes.jar PsiphonTunnel/PsiphonTunnel.java 107 if [ $? != 0 ]; then 108 echo "..'javac' compiling PsiphonTunnel failed, exiting" 109 exit $? 110 fi 111 112 cd build-tmp 113 114 jar uf psi/classes.jar ca/psiphon/*.class 115 if [ $? != 0 ]; then 116 echo "..'jar' failed to add classes, exiting" 117 exit $? 118 fi 119 120 cd - 121 cd build-tmp/psi 122 echo -e "-keep class psi.** { *; }\n-keep class ca.psiphon.** { *; }\n" >> proguard.txt 123 rm -f ../../ca.psiphon.aar 124 zip -r ../../ca.psiphon.aar ./ 125 cd - 126 rm -rf build-tmp 127 echo "Done"