From d1ccb43d8f99a5fae085cf49256b337fa6af2286 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Tue, 3 Jan 2023 13:10:59 -0800 Subject: [PATCH] Build Android products independently of WebRTC This should still be consistent with the previous behavior, down to the output aar paths and support for Maven. Some highlights: - Some Gradle files move to the top level of the repository so IDEs can pick them up when opening the repo root. - javadoc is now handled through Gradle (though build-javadoc still exists as a thin wrapper). - The "dependencies" we were pulling down weren't really needed at all. --- .github/workflows/ringrtc.yml | 2 +- .gitignore | 1 + bin/build-aar | 2 +- bin/build-aar.py | 179 ++++++++------ bin/build-javadoc | 20 +- bin/env-android.sh | 10 - bin/env.sh | 3 - bin/fetch-android-deps | 30 --- build.gradle | 11 + config/android/.gitignore | 1 - config/android/README.md | 17 -- config/android/build.gradle | 22 -- config/android/gradle.properties | 6 - .../gradle/wrapper/gradle-wrapper.properties | 5 - config/android/gradlew | 172 ------------- config/android/gradlew.bat | 84 ------- config/version.properties | 5 + config/version.sh | 21 +- gradle.properties | 13 + .../wrapper/gradle-wrapper.jar | Bin 55190 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 234 ++++++++++++++++++ publish/android/gradlew.bat => gradlew.bat | 49 ++-- .../local.properties => local.properties | 4 +- publish/android/.gitignore | 2 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 53324 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - publish/android/gradlew | 164 ------------ publish/android/src/main/AndroidManifest.xml | 3 - settings.gradle | 13 + src/BUILD.gn | 4 +- src/android/.gitignore | 1 + src/android/AndroidManifest.xml | 11 - src/android/BUILD.gn | 72 ------ src/android/README | 1 - .../api/org/signal/ringrtc/Testing.java | 41 --- {publish => src}/android/build.gradle | 107 +++++--- src/android/jniLibs/.gitignore | 4 + src/android/libs/.gitignore | 1 + {publish => src}/android/proguard-rules.pro | 0 src/android/src/main/AndroidManifest.xml | 6 + 41 files changed, 515 insertions(+), 819 deletions(-) delete mode 100755 bin/fetch-android-deps create mode 100644 build.gradle delete mode 100644 config/android/.gitignore delete mode 100644 config/android/README.md delete mode 100644 config/android/build.gradle delete mode 100644 config/android/gradle.properties delete mode 100644 config/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 config/android/gradlew delete mode 100644 config/android/gradlew.bat create mode 100644 config/version.properties mode change 100644 => 100755 config/version.sh create mode 100644 gradle.properties rename {config/android/gradle => gradle}/wrapper/gradle-wrapper.jar (50%) create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew rename publish/android/gradlew.bat => gradlew.bat (64%) rename publish/android/local.properties => local.properties (61%) delete mode 100644 publish/android/.gitignore delete mode 100644 publish/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 publish/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 publish/android/gradlew delete mode 100644 publish/android/src/main/AndroidManifest.xml create mode 100644 settings.gradle create mode 100644 src/android/.gitignore delete mode 100644 src/android/AndroidManifest.xml delete mode 100644 src/android/BUILD.gn delete mode 100644 src/android/README delete mode 100644 src/android/api/org/signal/ringrtc/Testing.java rename {publish => src}/android/build.gradle (54%) create mode 100644 src/android/jniLibs/.gitignore create mode 100644 src/android/libs/.gitignore rename {publish => src}/android/proguard-rules.pro (100%) create mode 100644 src/android/src/main/AndroidManifest.xml diff --git a/.github/workflows/ringrtc.yml b/.github/workflows/ringrtc.yml index 21617902..7400e357 100644 --- a/.github/workflows/ringrtc.yml +++ b/.github/workflows/ringrtc.yml @@ -29,7 +29,7 @@ jobs: run: sudo apt-get update && sudo apt-get install -y protobuf-compiler - uses: actions/checkout@v3 - run: rustup toolchain install $(cat rust-toolchain) --profile minimal --component clippy --target aarch64-linux-android,aarch64-apple-ios - - run: shellcheck **/*.sh bin/build-aar bin/build-cli bin/build-electron bin/build-gctc bin/build-ios bin/build-javadoc bin/build-rustdoc bin/build-target bin/fetch-android-deps bin/gsync-webrtc bin/prepare-workspace bin/rust-lint-check src/rust/scripts/run-tests + - run: shellcheck **/*.sh bin/build-aar bin/build-cli bin/build-electron bin/build-gctc bin/build-ios bin/build-javadoc bin/build-rustdoc bin/build-target bin/gsync-webrtc bin/prepare-workspace bin/rust-lint-check src/rust/scripts/run-tests - name: Clippy run: cargo clippy --tests --features sim -- -D warnings working-directory: src/rust diff --git a/.gitignore b/.gitignore index 271f8a73..c5db05a4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ cscope.* .DS_Store .dir-locals.el .cargo +.gradle/ *.code-workspace **/.vscode .idea diff --git a/bin/build-aar b/bin/build-aar index 86dfbc08..aa09622f 100755 --- a/bin/build-aar +++ b/bin/build-aar @@ -13,6 +13,6 @@ set -e "${0}.py" \ --build-dir="${OUTPUT_DIR}" \ --webrtc-src-dir="${WEBRTC_SRC_DIR}" \ - --gradle-dir="${ANDROID_GRADLE_DIR}" \ + --gradle-dir="${PROJECT_DIR}" \ --publish-version="${PROJECT_VERSION}" \ "$@" diff --git a/bin/build-aar.py b/bin/build-aar.py index 36e02def..f9155c71 100755 --- a/bin/build-aar.py +++ b/bin/build-aar.py @@ -16,6 +16,7 @@ This script generates libringrtc.aar for distribution try: import argparse + import enum import logging import subprocess import os @@ -28,7 +29,6 @@ except ImportError as e: DEFAULT_ARCHS = ['arm', 'arm64', 'x86', 'x64'] NINJA_TARGETS = ['ringrtc'] JAR_FILES = [ - 'lib.java/ringrtc/libringrtc.jar', 'lib.java/sdk/android/libwebrtc.jar', ] SO_LIBS = [ @@ -36,6 +36,16 @@ SO_LIBS = [ 'libringrtc.so', ] +class Project(enum.Flag): + WEBRTC = enum.auto() + RINGRTC = enum.auto() + AAR = enum.auto() + ALL = WEBRTC | RINGRTC | AAR + + def __sub__(self, other): + return self & ~other + + # ------------------------------------------------------------------------------ # # Main @@ -125,9 +135,15 @@ def ParseArgs(): parser.add_argument('-u', '--unstripped', action='store_true', help='Store the unstripped libraries in the .aar. Default is false') - parser.add_argument('-c', '--compile-only', - action='store_true', + parser.add_argument('-c', '--compile-only', dest='disabled_projects', + action='append_const', const=Project.AAR, help='Only compile the code, do not build the .aar. Default is false') + parser.add_argument('--webrtc-only', dest='disabled_projects', + action='append_const', const=Project.RINGRTC | Project.AAR, + help='''Compile WebRTC's libraries only, then stop building''') + parser.add_argument('--ringrtc-only', dest='disabled_projects', + action='append_const', const=Project.WEBRTC, + help='Compile RingRTC only, assuming WebRTC is already built') parser.add_argument('--clean', action='store_true', help='Remove all the build products. Default is false') @@ -170,80 +186,82 @@ def GetGradleBuildDir(build_dir): return os.path.join(build_dir, 'gradle') def BuildArch(dry_run, project_dir, build_dir, arch, debug_build, extra_gn_args, - extra_gn_flags, extra_ninja_flags, extra_cargo_flags, jobs): + extra_gn_flags, extra_ninja_flags, extra_cargo_flags, jobs, build_projects): logging.info('Building: {} ...'.format(arch)) output_dir = GetArchBuildDir(build_dir, arch, debug_build) - gn_args = { - 'target_os' : '"android"', - 'target_cpu' : '"{}"'.format(arch), - 'is_debug' : 'false', - 'rtc_include_tests' : 'false', - 'rtc_build_examples' : 'false', - 'rtc_build_tools' : 'false', - 'rtc_enable_protobuf' : 'false', - 'rtc_enable_sctp' : 'false', - 'rtc_libvpx_build_vp9': 'false', - 'rtc_include_ilbc' : 'false', - } - if debug_build is True: - gn_args['is_debug'] = 'true' - gn_args['symbol_level'] = '2' + if Project.WEBRTC in build_projects: + gn_args = { + 'target_os' : '"android"', + 'target_cpu' : '"{}"'.format(arch), + 'is_debug' : 'false', + 'rtc_include_tests' : 'false', + 'rtc_build_examples' : 'false', + 'rtc_build_tools' : 'false', + 'rtc_enable_protobuf' : 'false', + 'rtc_enable_sctp' : 'false', + 'rtc_libvpx_build_vp9': 'false', + 'rtc_include_ilbc' : 'false', + } + if debug_build is True: + gn_args['is_debug'] = 'true' + gn_args['symbol_level'] = '2' - gn_args_string = '--args=' + ' '.join( - [k + '=' + v for k, v in gn_args.items()] + extra_gn_args) + gn_args_string = '--args=' + ' '.join( + [k + '=' + v for k, v in gn_args.items()] + extra_gn_args) - gn_total_args = [ 'gn', 'gen', output_dir, gn_args_string ] + extra_gn_flags - RunCmd(dry_run, gn_total_args) + gn_total_args = [ 'gn', 'gen', output_dir, gn_args_string ] + extra_gn_flags + RunCmd(dry_run, gn_total_args) - ninja_args = [ 'ninja', '-C', output_dir ] + NINJA_TARGETS + [ '-j', jobs ] + extra_ninja_flags - RunCmd(dry_run, ninja_args) + ninja_args = [ 'ninja', '-C', output_dir ] + NINJA_TARGETS + [ '-j', jobs ] + extra_ninja_flags + RunCmd(dry_run, ninja_args) - # FIXME: Shouldn't hardcode Linux, but eventually this won't use WebRTC's NDK anyway. - ndk_toolchain_dir = os.path.join( - os.getcwd(), - 'third_party', - 'android_ndk', - 'toolchains', - 'llvm', - 'prebuilt', - 'linux-x86_64' - ) - cargo_args = [ - 'cargo', 'rustc', - '--target', GetCargoTarget(arch), - '--target-dir', output_dir, - '--manifest-path', os.path.join(project_dir, 'src', 'rust', 'Cargo.toml'), - ] - if not debug_build: - cargo_args += ['--release'] - cargo_args += extra_cargo_flags - # Arguments directly for rustc - cargo_args += [ - '--', - '-C', 'debuginfo=2', - '-C', 'linker={}/bin/{}{}-clang'.format(ndk_toolchain_dir, GetClangTarget(arch), GetAndroidApiLevel(arch)), - '-C', 'link-arg=-fuse-ld=lld', - '-L', 'native=' + output_dir, - ] - RunCmd(dry_run, cargo_args) + if Project.RINGRTC in build_projects: + # FIXME: Shouldn't hardcode Linux, but eventually this won't use WebRTC's NDK anyway. + ndk_toolchain_dir = os.path.join( + os.getcwd(), + 'third_party', + 'android_ndk', + 'toolchains', + 'llvm', + 'prebuilt', + 'linux-x86_64' + ) + cargo_args = [ + 'cargo', 'rustc', + '--target', GetCargoTarget(arch), + '--target-dir', output_dir, + '--manifest-path', os.path.join(project_dir, 'src', 'rust', 'Cargo.toml'), + ] + if not debug_build: + cargo_args += ['--release'] + cargo_args += extra_cargo_flags + # Arguments directly for rustc + cargo_args += [ + '--', + '-C', 'debuginfo=2', + '-C', 'linker={}/bin/{}{}-clang'.format(ndk_toolchain_dir, GetClangTarget(arch), GetAndroidApiLevel(arch)), + '-C', 'link-arg=-fuse-ld=lld', + '-L', 'native=' + output_dir, + ] + RunCmd(dry_run, cargo_args) - if dry_run: - return + if dry_run: + return - # Copy the built library alongside libringrtc_rffi.so. - shutil.copyfile( - os.path.join(output_dir, GetCargoTarget(arch), 'debug' if debug_build else 'release', 'libringrtc.so'), - os.path.join(output_dir, 'lib.unstripped', 'libringrtc.so')) - # And strip another copy. - strip_args = [ - '{}/bin/llvm-strip'.format(ndk_toolchain_dir), - '-s', - os.path.join(output_dir, 'lib.unstripped', 'libringrtc.so'), - '-o', os.path.join(output_dir, 'libringrtc.so'), - ] - RunCmd(dry_run, strip_args) + # Copy the built library alongside libringrtc_rffi.so. + shutil.copyfile( + os.path.join(output_dir, GetCargoTarget(arch), 'debug' if debug_build else 'release', 'libringrtc.so'), + os.path.join(output_dir, 'lib.unstripped', 'libringrtc.so')) + # And strip another copy. + strip_args = [ + '{}/bin/llvm-strip'.format(ndk_toolchain_dir), + '-s', + os.path.join(output_dir, 'lib.unstripped', 'libringrtc.so'), + '-o', os.path.join(output_dir, 'libringrtc.so'), + ] + RunCmd(dry_run, strip_args) def GetABI(arch): if arch == 'arm': @@ -283,13 +301,16 @@ def GetAndroidApiLevel(arch): def CreateLibs(dry_run, project_dir, build_dir, archs, output, debug_build, unstripped, extra_gn_args, extra_gn_flags, extra_ninja_flags, - extra_cargo_flags, jobs, compile_only): + extra_cargo_flags, jobs, build_projects): for arch in archs: BuildArch(dry_run, project_dir, build_dir, arch, debug_build, extra_gn_args, - extra_gn_flags, extra_ninja_flags, extra_cargo_flags, jobs) + extra_gn_flags, extra_ninja_flags, extra_cargo_flags, jobs, build_projects) - if compile_only is True: + # The rest is considered part of the AAR build rather than the WebRTC or + # RingRTC Rust builds mostly by process of elimination: sometimes we want + # to do a "compile-only" build that skips assembling the libs/ directory. + if Project.AAR not in build_projects: return output_dir = os.path.join(GetOutputDir(build_dir, debug_build), @@ -331,7 +352,7 @@ def RunGradle(dry_run, args): def CreateAar(dry_run, extra_gradle_args, version, gradle_dir, sonatype_repo, sonatype_user, sonatype_password, signing_keyid, signing_password, signing_secret_keyring, - compile_only, + build_projects, install_local, install_dir, project_dir, build_dir, archs, output, debug_build, release_build, unstripped, extra_gn_args, extra_gn_flags, extra_ninja_flags, @@ -380,20 +401,22 @@ def CreateAar(dry_run, extra_gradle_args, version, gradle_dir, output_dir = GetOutputDir(build_dir, build_debug) lib_dir = os.path.join(output_dir, 'libs') gradle_args = gradle_args + [ - "-PdebugRingrtcLibDirs=['{}']".format(lib_dir), + "-PdebugRingrtcLibDir={}".format(lib_dir), + "-PwebrtcJar={}/libwebrtc.jar".format(lib_dir), ] else: build_debug = False output_dir = GetOutputDir(build_dir, build_debug) lib_dir = os.path.join(output_dir, 'libs') gradle_args = gradle_args + [ - "-PreleaseRingrtcLibDirs=['{}']".format(lib_dir), + "-PreleaseRingrtcLibDir={}".format(lib_dir), + "-PwebrtcJar={}/libwebrtc.jar".format(lib_dir), ] CreateLibs(dry_run, project_dir, build_dir, archs, output, build_debug, unstripped, extra_gn_args, extra_gn_flags, extra_ninja_flags, - extra_cargo_flags, jobs, compile_only) + extra_cargo_flags, jobs, build_projects) - if compile_only is True: + if Project.AAR not in build_projects: return gradle_args.extend(('assembleDebug' if build_type == 'debug' else 'assembleRelease' for build_type in build_types)) @@ -461,6 +484,10 @@ def main(): args.extra_ninja_flags = args.extra_ninja_flags + ['-v'] args.extra_cargo_flags = args.extra_cargo_flags + ['-v'] + build_projects = Project.ALL + for disabled_project in (args.disabled_projects or []): + build_projects -= disabled_project + gradle_dir = os.path.abspath(args.gradle_dir) logging.debug('Using gradle directory: {}'.format(gradle_dir)) @@ -495,7 +522,7 @@ def main(): CreateAar(args.dry_run, args.extra_gradle_args, args.publish_version, args.gradle_dir, args.upload_sonatype_repo, args.upload_sonatype_user, args.upload_sonatype_password, args.signing_keyid, args.signing_password, args.signing_secret_keyring, - args.compile_only, + build_projects, args.install_local, args.install_dir, args.project_dir, build_dir, args.arch, args.output, args.debug_build, args.release_build, args.unstripped, args.extra_gn_args, diff --git a/bin/build-javadoc b/bin/build-javadoc index 117b64ae..8ad6ecb7 100755 --- a/bin/build-javadoc +++ b/bin/build-javadoc @@ -10,19 +10,7 @@ set -e # shellcheck source=bin/env.sh . "$(dirname "$0")"/env.sh -SOURCEPATH="${ANDROID_SRC_DIR}/api" -CLASSPATH="${OUTPUT_DIR}/release/libs/libwebrtc.jar" - -ANDROID_SDK="${WEBRTC_SRC_DIR}/third_party/android_sdk/public/platforms/android-28" -ANDROID_ANNOTATIONS="${WEBRTC_SRC_DIR}/third_party/android_deps/libs/androidx_annotation_annotation" - -for d in "$ANDROID_DEPS_DIR" "$ANDROID_SDK" "$ANDROID_ANNOTATIONS" ; do - CLASSPATH="$CLASSPATH:$(find -L "$d" -type f -name '*.jar' -print | paste -sd ':' -)" -done - -OUTPUT_DIR="${OUTPUT_DIR}/javadoc" -rm -rf "$OUTPUT_DIR" -mkdir "$OUTPUT_DIR" - -# Treat all warns as errors -javadoc -quiet -Xdoclint:all -d "$OUTPUT_DIR" -sourcepath "$SOURCEPATH" -classpath "$CLASSPATH" org.signal.ringrtc +cd "${PROJECT_ROOT}" +./gradlew javadoc \ + -PwebrtcJar="${OUTPUT_DIR}/release/libs/libwebrtc.jar" \ + -PdocsDir="${OUTPUT_DIR}" diff --git a/bin/env-android.sh b/bin/env-android.sh index c9fbd79b..69dd2859 100644 --- a/bin/env-android.sh +++ b/bin/env-android.sh @@ -9,17 +9,7 @@ # shellcheck disable=SC2034 # Android specific environment variables -ANDROID_CONFIG_DIR="${CONFIG_DIR}/android" - -ANDROID_DEPS_DIR="${OUTPUT_DIR}/android-deps" - -# android gradle directory -ANDROID_GRADLE_DIR="${PUBLISH_DIR}/android" - -ANDROID_SRC_DIR="${RINGRTC_SRC_DIR}/android" prepare_workspace_platform() { echo "Preparing workspace for Android..." - - "$BIN_DIR"/fetch-android-deps } diff --git a/bin/env.sh b/bin/env.sh index 7d1df333..3cdf12a6 100644 --- a/bin/env.sh +++ b/bin/env.sh @@ -30,9 +30,6 @@ RINGRTC_SRC_DIR="${PROJECT_DIR}/src" # build products OUTPUT_DIR=$(realpath "${OUTPUT_DIR:-${PROJECT_DIR}/out}") -# publish directory -PUBLISH_DIR="${PROJECT_DIR}/publish" - # patch hash file PATCH_HASH="${OUTPUT_DIR}/patch-hash" diff --git a/bin/fetch-android-deps b/bin/fetch-android-deps deleted file mode 100755 index a63140b9..00000000 --- a/bin/fetch-android-deps +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -# -# Copyright 2019-2021 Signal Messenger, LLC -# SPDX-License-Identifier: AGPL-3.0-only -# - -set -e - -# shellcheck source=bin/env.sh -. "$(dirname "$0")"/env.sh - -echo "Fetching Android dependencies..." - -cd "$ANDROID_CONFIG_DIR" -rm -rf "${ANDROID_DEPS_DIR}" -./gradlew -PjarCacheDir="${ANDROID_DEPS_DIR}" getDeps - -# expand aar files -AAR_FILES=$(ls "${ANDROID_DEPS_DIR}"/*.aar || true) -for aar in $AAR_FILES ; do - DIR="${aar%.aar}" - mkdir -p "$DIR" - cd "$DIR" - jar xf "$aar" -done - -JAR_LIST="${RINGRTC_WEBRTC_SRC_DIR}/jar.list" -rm -f "$JAR_LIST" -find "${ANDROID_DEPS_DIR}" -type f -name '*.jar' > "$JAR_LIST" diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..a27fa7ef --- /dev/null +++ b/build.gradle @@ -0,0 +1,11 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/config/android/.gitignore b/config/android/.gitignore deleted file mode 100644 index 3bb19ffd..00000000 --- a/config/android/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.gradle/ diff --git a/config/android/README.md b/config/android/README.md deleted file mode 100644 index 2c5ac8b8..00000000 --- a/config/android/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Android Dependencies for RingRTC Build Time - -This configuration defines the build time Java dependencies for RingRTC. - -To add/update dependencies edit `build.gradle` and make modifications -to the `dependencies` section. - -These dependencies are fetched as part of `prepare_workspace`. - -## SDK versions - -There are a few places where minSdkVersion and targetSdkVersion show -up in the build of RingRTC for Android. Generally try to keep them in -sync with Signal-Android/build.gradle. - -1. src/android/AndroidManifest.xml -- what supported versions in our .aar - diff --git a/config/android/build.gradle b/config/android/build.gradle deleted file mode 100644 index fa25ae9f..00000000 --- a/config/android/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright 2019-2021 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -// - -apply plugin: 'java' - -repositories { - jcenter() -} - -dependencies { - - compile 'org.whispersystems:signal-service-android:2.15.3' - -} - -task getDeps(type: Copy) { - from sourceSets.main.runtimeClasspath - println "Using JAR cache dir: " + jarCacheDir - into jarCacheDir -} diff --git a/config/android/gradle.properties b/config/android/gradle.properties deleted file mode 100644 index baf161a2..00000000 --- a/config/android/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -# -# Copyright 2019-2021 Signal Messenger, LLC -# SPDX-License-Identifier: AGPL-3.0-only -# - -org.gradle.jvmargs=-Xmx2048m \ No newline at end of file diff --git a/config/android/gradle/wrapper/gradle-wrapper.properties b/config/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 1b2b07cf..00000000 --- a/config/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/config/android/gradlew b/config/android/gradlew deleted file mode 100755 index af6708ff..00000000 --- a/config/android/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/config/android/gradlew.bat b/config/android/gradlew.bat deleted file mode 100644 index 0f8d5937..00000000 --- a/config/android/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/config/version.properties b/config/version.properties new file mode 100644 index 00000000..990a57ff --- /dev/null +++ b/config/version.properties @@ -0,0 +1,5 @@ +webrtc.version=5005b + +ringrtc.version.major=2 +ringrtc.version.minor=22 +ringrtc.version.revision=0 diff --git a/config/version.sh b/config/version.sh old mode 100644 new mode 100755 index 6e9b50ef..1cf09be4 --- a/config/version.sh +++ b/config/version.sh @@ -8,13 +8,23 @@ # Allow non-exported environment variables # shellcheck disable=SC2034 +if [ -n "${PROJECT_DIR}" ]; then + SCRIPT_DIR="${PROJECT_DIR}/config" +else + SCRIPT_DIR=$(dirname "$0") +fi + +property() { + grep "${1}" "${SCRIPT_DIR}/version.properties" | cut -d'=' -f2 +} + # Specify WebRTC version. This corresponds to the # branch or tag of the signalapp/webrtc repository. -WEBRTC_VERSION=5005b +WEBRTC_VERSION=$(property 'webrtc.version') -RINGRTC_MAJOR_VERSION=2 -RINGRTC_MINOR_VERSION=22 -RINGRTC_REVISION=0 +RINGRTC_MAJOR_VERSION=$(property 'ringrtc.version.major') +RINGRTC_MINOR_VERSION=$(property 'ringrtc.version.minor') +RINGRTC_REVISION=$(property 'ringrtc.version.revision') # Specify RingRTC version to publish. RINGRTC_VERSION="${RINGRTC_MAJOR_VERSION}.${RINGRTC_MINOR_VERSION}.${RINGRTC_REVISION}" @@ -24,3 +34,6 @@ RINGRTC_VERSION="${RINGRTC_MAJOR_VERSION}.${RINGRTC_MINOR_VERSION}.${RINGRTC_REV # Project version is the combination of the two PROJECT_VERSION="${OVERRIDE_VERSION:-${RINGRTC_VERSION}}${RC_VERSION:+-$RC_VERSION}" + +echo "WebRTC : ${WEBRTC_VERSION}" +echo "RingRTC: ${RINGRTC_VERSION}" diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..4bb7163f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,13 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true diff --git a/config/android/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar similarity index 50% rename from config/android/gradle/wrapper/gradle-wrapper.jar rename to gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 26986 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 delta 22520 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
IA&%cW_eA0aRkj43NJ!y{{iGp}3 zYgv8~@%tF0so9}97;ic=h}M@K(eDUHTI%8!2J!q|GQt)%eAdnEi_GSBEIGWJXMYsU3)--|dW z$Jm+o-3iV)RM$M$^sB^oiZv+)(|VIWP%YOY5IAm}HC5Z(9OFTDhEIYBto2l1fh!Dj z4GL4TE9;CD>YofWSSyoP*#?AmJ4_tXeaW)nDAvU<|5E;NGhM`o;RiSpQ!B?rJNcz) z?NN~>V;0@BXI!IUE!9NQ<=@Z54jP~tl*#<+t$>m%JD-;IrE=^0kiB26Hk*r&jSoRt zhy>AC@~e(*<9+QH2Tvzc?0Sg_-)IX{NTX^x^+hzO2iMQKAG2B2ys&Hk zR5&o5Yn)9IdFN(dZ*Df};=E$C7ryx1vX8yg%B9&G&sC&J={0{5^7526IrQQ$NG930 z6Hl>=5AjO-ektkDxkA?rj$DTKFU&#_Os)jIrZzoW)+L|5R+GPL=)}yMsLtlT%7Du; z#R&z%y@py|K-~^fEwe9*h3^Hl-Q(DaH06xHC!P8e}>W;i1J9 zTd0@y;k|48Ahw!dl8~%En|LqP_(t3{2*L6$Kh=I--3d+3Zib-!F5xoLFPQkG@_}C$>l3xS zP=WD0ePfUcr|A@J+wV|U*BITQSOOZtDPfj1vuCy6u#ZV!df0?WD|&xCLyGJU%SyeN zpHsD0rqGD23k>X_?Hb37dr`V!aC$*{x{nUEO#doe$6U=Y?1{M3m@_>^7>C%G_cl~p zWhS2`7s__;%5c-1-ohWkHH7$a@HMATJtcIC`tYV%0J$I%(#p4dIYa#Tkxatir^WaZ zyYM$Mmf&|odgUDf(7+}}%n^5h1Kxi?ja`8q^pZTU>v zHv|#MR@K?P0W`6KJ+!i-oDmUX9-X;wpZU_buj*VvuKdX=N=8~EsfgTP$fXBkUB@BI z;|*6zaG00Y!-flL6k+jBt}1qFc_rr1wafPS_nR3tqlLqa+0nV0zj4T+Ct$_?pbkCW z({l{Qb-Je45N}9a^X7GFxd{#Od1{h&LQEkk-Gcn`{M}2eAt8TR5~8~mrS#!C4G7RB z&8UzOIJg6&J|Q=a4BcEm^GiL)J2E2DthU)-o^HqPYrJD|RtVt>wpm2bUcK(eUwF*_ z+gA+#rso+d`xuP~b<&_tD;E=UdkYRTdmEs|lN!7UhmW!ij;J+apaDFyuzH&riaYoJ z+wv0)jRT0A6#^LNxIuQ9fHONO5XX2AaGis|{%CoJBL2^(C_o+SU!WKs1)z!~fc>|- z85$bhe~_r(qJTE+f5BWtn1Im&0Z@*Ff?6T}n5lttBpg&majPPjXaR$HIH;BurE&q! z771Ygts+N5ga5(&iU9?p1T?t_0lWn`=!E^2LSumj_TTy_RQ35EK1&?8pj;H_N$LOO zZT|rZ5cmg#1!ygDgT5)=jZwK_p_RAlBX{xutzjtFG0L~Ht?2onlKfp!m|A2`B zqa`@#TIcV3E-8TU3~t4%C0P)*(LW*<@M4)7_V3yTiizP5HghW=eOU_7^g_q|+fIPC zFV$lONUey1j;(+IFFs&ml>q2kfr9*OQ7Q#+x}px^dmuGD<>;!hbOWGpH+$sX$k$2*9xg2ic|H zf&#Y$K~`C};`){(=xOdP+ei%|iktwj*@lA3@^4MF_0)fvV1LCe87c{xJ!e{{!pa B4=Mlv diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..a0c86dbe --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +# Note: Check https://gradle.org/release-checksums/ before updating wrapper or distribution +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionSha256Sum=8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..1b6c7873 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/publish/android/gradlew.bat b/gradlew.bat similarity index 64% rename from publish/android/gradlew.bat rename to gradlew.bat index f6d5974e..ac1b06f9 100644 --- a/publish/android/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,34 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/publish/android/local.properties b/local.properties similarity index 61% rename from publish/android/local.properties rename to local.properties index bb4e20b3..ea0c9464 100644 --- a/publish/android/local.properties +++ b/local.properties @@ -1,4 +1,4 @@ # We ought to be able to put this in .gradle/gradle.properties, but it doesn't work. -sdk.dir=../../src/webrtc/src/third_party/android_sdk/public +sdk.dir=src/webrtc/src/third_party/android_sdk/public # This one does work in .gradle/gradle.properties, but we might as well have them both here. -ndk.dir=../../src/webrtc/src/third_party/android_ndk +ndk.dir=src/webrtc/src/third_party/android_ndk diff --git a/publish/android/.gitignore b/publish/android/.gitignore deleted file mode 100644 index 0b626936..00000000 --- a/publish/android/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.gradle -/build diff --git a/publish/android/gradle/wrapper/gradle-wrapper.jar b/publish/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 3baa851b28c65f87dd36a6748e1a85cf360c1301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53324 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

*Ou)7mZ_?&1& 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 diff --git a/publish/android/gradle/wrapper/gradle-wrapper.properties b/publish/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 0f4e75ad..00000000 --- a/publish/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue Nov 19 15:51:24 PST 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip diff --git a/publish/android/gradlew b/publish/android/gradlew deleted file mode 100755 index 27309d92..00000000 --- a/publish/android/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/publish/android/src/main/AndroidManifest.xml b/publish/android/src/main/AndroidManifest.xml deleted file mode 100644 index cb9a1984..00000000 --- a/publish/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..f4de2e5d --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +rootProject.name = "RingRtcGradle" +include ':ringrtc' +project(':ringrtc').projectDir = file('src') + +include ':ringrtc:android' diff --git a/src/BUILD.gn b/src/BUILD.gn index c13921c8..86da9aff 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -4,13 +4,11 @@ # if (is_android) { - import("//build/config/android/config.gni") - import("//build/config/android/rules.gni") import("//webrtc.gni") group("ringrtc") { public_deps = [ - "android", + "//sdk/android:libwebrtc", "rffi:libringrtc_rffi", ] } diff --git a/src/android/.gitignore b/src/android/.gitignore new file mode 100644 index 00000000..378eac25 --- /dev/null +++ b/src/android/.gitignore @@ -0,0 +1 @@ +build diff --git a/src/android/AndroidManifest.xml b/src/android/AndroidManifest.xml deleted file mode 100644 index 0d5d9685..00000000 --- a/src/android/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/src/android/BUILD.gn b/src/android/BUILD.gn deleted file mode 100644 index def8e3c3..00000000 --- a/src/android/BUILD.gn +++ /dev/null @@ -1,72 +0,0 @@ -# -# Copyright 2019-2021 Signal Messenger, LLC -# SPDX-License-Identifier: AGPL-3.0-only -# - -if (is_android) { - import("//build/config/android/config.gni") - import("//build/config/android/rules.gni") - import("//webrtc.gni") - - android_sdk = "//sdk/android" - group("android") { - public_deps = [ - ":libringrtc", - ] - } - - dist_jar("libringrtc") { - output = "${root_out_dir}/lib.java/ringrtc/${target_name}.jar" - direct_deps_only = true - use_unprocessed_jars = true - requires_android = true - no_build_hooks = true - - deps = [ - ":ringrtc_java", - ] - } - - # This is split into a separate target so that the dependency jars - # are considered "indirect" and thus won't get packaged in libringrtc.jar. - java_group("ringrtc_java_deps") { - _libwebrtc_jar_dir = get_label_info("${android_sdk}:libwebrtc", "dir") - libwebrtc_jar_path = "${root_out_dir}/lib.java${_libwebrtc_jar_dir}/libwebrtc.jar" - - # Note: "//ringrtc/jar.list" is generated by - # bin/fetch-android-deps during bin/prepare-workspace. - jar_list = read_file("//ringrtc/jar.list", "list lines") - input_jars_paths = [ - "$libwebrtc_jar_path", - ] + jar_list - } - - rtc_android_library("ringrtc_java") { - sources = [ - "api/org/signal/ringrtc/BuildInfo.java", - "api/org/signal/ringrtc/CalledByNative.java", - "api/org/signal/ringrtc/CallId.java", - "api/org/signal/ringrtc/CallException.java", - "api/org/signal/ringrtc/CallManager.java", - "api/org/signal/ringrtc/CameraControl.java", - "api/org/signal/ringrtc/Connection.java", - "api/org/signal/ringrtc/GroupCall.java", - "api/org/signal/ringrtc/HttpHeader.java", - "api/org/signal/ringrtc/Log.java", - "api/org/signal/ringrtc/NetworkRoute.java", - "api/org/signal/ringrtc/PeekInfo.java", - "api/org/signal/ringrtc/Remote.java", - "api/org/signal/ringrtc/Testing.java", - "api/org/signal/ringrtc/Util.java", - "api/org/signal/ringrtc/WebRtcLogger.java", - ] - - deps = [ - "//third_party/androidx:androidx_annotation_annotation_java", - "//sdk/android:libwebrtc", - ":ringrtc_java_deps" - ] - - } - -} diff --git a/src/android/README b/src/android/README deleted file mode 100644 index 6af204f9..00000000 --- a/src/android/README +++ /dev/null @@ -1 +0,0 @@ -Android interface to RingRTC diff --git a/src/android/api/org/signal/ringrtc/Testing.java b/src/android/api/org/signal/ringrtc/Testing.java deleted file mode 100644 index 044d9deb..00000000 --- a/src/android/api/org/signal/ringrtc/Testing.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2019-2021 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.signal.ringrtc; - -import java.io.IOException; - -import org.whispersystems.libsignal.IdentityKey; -import org.whispersystems.libsignal.ecc.Curve; -import org.whispersystems.libsignal.ecc.ECKeyPair; -import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; -import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; - -/** -* Testing is a class for generating various exceptions for the purpose of testing. -* -* A typical use case is in the implementation of the SignalMessageRecipient interface. -* -*/ -public class Testing { - - /* For testing */ - public static IOException fakeIOException() { - return new IOException("fake network problem"); - } - - /* For testing */ - public static UnregisteredUserException fakeUnregisteredUserException() { - return new UnregisteredUserException("+123456", new IOException("fake unregistered user problem")); - } - - /* For testing */ - public static UntrustedIdentityException fakeUntrustedIdentityException() { - ECKeyPair keyPair = Curve.generateKeyPair(); - IdentityKey identityKey = new IdentityKey(keyPair.getPublicKey()); - return new UntrustedIdentityException("fake identity problem", "+123456", identityKey); - } - -} diff --git a/publish/android/build.gradle b/src/android/build.gradle similarity index 54% rename from publish/android/build.gradle rename to src/android/build.gradle index 04eb9c02..da919e62 100644 --- a/publish/android/build.gradle +++ b/src/android/build.gradle @@ -1,59 +1,52 @@ -buildscript { - repositories { - jcenter() - google() - } - dependencies { - classpath 'com.android.tools.build:gradle:7.0.3' - } +plugins { + id 'com.android.library' version '7.0.0' + id 'maven-publish' + id 'signing' } repositories { - jcenter() google() + mavenCentral() + mavenLocal() } -ext.version_number = project.hasProperty("ringrtcVersion") ? ringrtcVersion : "0.0.1-SNAPSHOT" -ext.isReleaseVersion = ext.version_number.indexOf("-") == -1; -ext.group_info = "org.signal" +def versionProperties = new Properties() +file("../../config/version.properties").withInputStream { versionProperties.load(it) } -ext.debug_jni_lib_dirs = project.hasProperty("debugRingrtcLibDirs") ? Eval.me(debugRingrtcLibDirs) : [] -ext.release_jni_lib_dirs = project.hasProperty("releaseRingrtcLibDirs") ? Eval.me(releaseRingrtcLibDirs) : [] -ext.releaseRepoUrl = project.hasProperty("sonatypeRepo") ? sonatypeRepo - : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" -ext.releaseRepoUsername = project.hasProperty("signalSonatypeUsername") ? signalSonatypeUsername : "" -ext.releaseRepoPassword = project.hasProperty("signalSonatypePassword") ? signalSonatypePassword : "" - -ext.proguard_file = rootDir.getAbsolutePath() + '/proguard-rules.pro' - -tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') +if (!project.hasProperty("ringrtcVersion")) { + ext.ringrtcVersion = + "${versionProperties.getProperty("ringrtc.version.major")}." + + "${versionProperties.getProperty("ringrtc.version.minor")}." + + "${versionProperties.getProperty("ringrtc.version.revision")}" } +ext.isReleaseVersion = ringrtcVersion.indexOf("-") == -1; -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'signing' - -archivesBaseName = "ringrtc-android" -version = version_number +ext.debug_jni_lib_dirs = project.hasProperty("debugRingrtcLibDir") ? [debugRingrtcLibDir] : ["jniLibs"] +ext.release_jni_lib_dirs = project.hasProperty("releaseRingrtcLibDir") ? [releaseRingrtcLibDir] : ["jniLibs"] +ext.webrtc_jar = project.hasProperty("webrtcJar") ? webrtcJar : "libs/libwebrtc.jar" android { - compileSdkVersion 30 - buildToolsVersion '30.0.2' + compileSdk 30 + + defaultConfig { + minSdk 19 + targetSdk 31 + versionName ringrtcVersion + archivesBaseName = "ringrtc-android" + consumerProguardFiles "proguard-rules.pro" + } sourceSets { release { jniLibs.srcDirs = release_jni_lib_dirs + java.srcDirs = ['api/'] } debug { jniLibs.srcDirs = debug_jni_lib_dirs + java.srcDirs = ['api/'] } } - defaultConfig { - consumerProguardFiles proguard_file - } - packagingOptions { // Libraries are already stripped if necessary when linked. doNotStrip "**/*.so" @@ -61,23 +54,44 @@ android { } dependencies { - for (String dir : release_jni_lib_dirs) { - releaseImplementation fileTree(dir: dir, include: ['*.jar']) + api files(webrtc_jar) + api 'androidx.annotation:annotation:1.2.0' +} + +task javadoc(type: Javadoc) { + source = android.sourceSets.release.java.sourceFiles + classpath += files(android.bootClasspath) + // There doesn't seem to be a convenient way to do this with just one variant. + android.libraryVariants.all { v -> + classpath += v.getCompileClasspath(null) } - for (String dir : debug_jni_lib_dirs) { - debugImplementation fileTree(dir: dir, include: ['*.jar']) + // Normally this is set by the 'java' plugin, but that's not compatible with 'android-library' + if (project.hasProperty("docsDir")) { + destinationDir = new File(docsDir, "javadoc") } } +ext.releaseRepoUrl = project.hasProperty("sonatypeRepo") ? sonatypeRepo + : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" +ext.releaseRepoUsername = project.hasProperty("signalSonatypeUsername") ? signalSonatypeUsername : "" +ext.releaseRepoPassword = project.hasProperty("signalSonatypePassword") ? signalSonatypePassword : "" + afterEvaluate { publishing { publications { + debug(MavenPublication) { + from components.debug + + groupId = 'org.signal' + artifactId = archivesBaseName + version = "${ringrtcVersion}-DEBUG" + } mavenJava(MavenPublication) { from components.release - group = group_info + group = 'org.signal' artifactId = archivesBaseName - version = version_number + version = ringrtcVersion pom { name = 'ringrtc-android' @@ -124,3 +138,14 @@ afterEvaluate { sign publishing.publications.mavenJava } } + +ext.webrtc_version = "${versionProperties.getProperty("webrtc.version")}" + +task version { + group 'Info' + description = 'Prints the versions as read from the version config file.' + doLast { + println "RingRTC version: " + version + println "WebRTC version : " + project.webrtc_version + } +} diff --git a/src/android/jniLibs/.gitignore b/src/android/jniLibs/.gitignore new file mode 100644 index 00000000..0846d220 --- /dev/null +++ b/src/android/jniLibs/.gitignore @@ -0,0 +1,4 @@ +arm64-v8a/ +armeabi-v7a/ +x86/ +x86_64/ diff --git a/src/android/libs/.gitignore b/src/android/libs/.gitignore new file mode 100644 index 00000000..5dd6a185 --- /dev/null +++ b/src/android/libs/.gitignore @@ -0,0 +1 @@ +libwebrtc.jar diff --git a/publish/android/proguard-rules.pro b/src/android/proguard-rules.pro similarity index 100% rename from publish/android/proguard-rules.pro rename to src/android/proguard-rules.pro diff --git a/src/android/src/main/AndroidManifest.xml b/src/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..42bf55b5 --- /dev/null +++ b/src/android/src/main/AndroidManifest.xml @@ -0,0 +1,6 @@ + + +