Android NDK build tools
This CL enables building with Android NDK in the way that Chromium buildbots do it.
== Overview ==
* Add Android dependencies to DEPS (SDK, NDK, Android test runner). This also makes it possible to use Android's build/android/run_tests.py script to execute tests on Android devices.
* Add a Python script to build the WebRTC Video demo for Android using ndk-build and Ant. This is designed as an annotation script for Buildbots but is also fine to run locally.
* Update Android.mk so it works with the compiler output from a build performed by build/android/buildbot/bb_run_bot.py (which is how Chrome buildbots build).
== Syncing Android dependencies ==
To get the dependencies added in DEPS synced out, you must change the last line
of your .gclient file to look like this:
];target_os = ["android"]
That will append another variable to the .gclient file that causes these
dependencies to be synced during gclient sync.
If you want to get additional platform-specific dependencies in the same
checkout, add them to the list too, e.g. target_os = ["android", "unix"].
== Android.mk ==
The fix in Android.mk is needed since Chrome is building using build/android/buildbot/bb_run_bot.py, which only output the libraries into out/Debug. With the change it works for both that and a normal build (which copies the library files from out/Debug/obj.target/subpath to out/Debug anyway as a part of the build).
== svn:ignore ==
NOTICE: Before submitting, the following directories should be added to svn:ignore in third_party to avoid them from being removed and re-synced for every build:
* android_testrunner
* android_tools
* WebKit
This has to be done in a manual SVN commit since it's not possible to include in a git-svn CL (and I don't want to migrate this to a SVN CL).
BUG=none
TEST=local builds
Review URL: https://webrtc-codereview.appspot.com/1024009
git-svn-id: http://webrtc.googlecode.com/svn/trunk@3497 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/.gitignore b/.gitignore
index d5d64cd..ff7a557f7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,6 +40,8 @@
/out
/resources
/testing
+/third_party/android_testrunner
+/third_party/android_tools
/third_party/asan
/third_party/cygwin
/third_party/directxsdk
@@ -62,13 +64,16 @@
/third_party/valgrind
/third_party/winsdk_samples/src
/third_party/yasm
+/third_party/WebKit/Tools/Scripts
/tools/clang
/tools/gyp
/tools/python
/tools/valgrind
/tools/win
/webrtc/supplement.gypi
-/webrtc/video_engine/main/test/android_test/bin
-/webrtc/video_engine/main/test/android_test/gen
+/webrtc/video_engine/test/android/bin
+/webrtc/video_engine/test/android/gen
+/webrtc/video_engine/test/android/libs
+/webrtc/video_engine/test/android/obj
/x86-generic_out/
/xcodebuild
diff --git a/DEPS b/DEPS
index dc3e72a..5b94e08 100644
--- a/DEPS
+++ b/DEPS
@@ -106,6 +106,16 @@
"third_party/gold":
From("chromium_deps", "src/third_party/gold"),
},
+ "android": {
+ "third_party/android_tools":
+ From("chromium_deps", "src/third_party/android_tools"),
+
+ "third_party/android_testrunner":
+ Var("chromium_trunk") + "/src/third_party/android_testrunner@" + Var("chromium_revision"),
+
+ "third_party/WebKit/Tools/Scripts":
+ From("chromium_deps", "src/third_party/WebKit/Tools/Scripts"),
+ },
}
hooks = [
diff --git a/OWNERS b/OWNERS
index b110a52..58b9be3 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,4 +2,9 @@
niklas.enbom@webrtc.org
andrew@webrtc.org
tina.legrand@webrtc.org
-tommi@webrtc.org
\ No newline at end of file
+tommi@webrtc.org
+per-file .gitignore=*
+per-file DEPS=*
+per-file AUTHORS=*
+per-file WATCHLISTS=*
+
diff --git a/webrtc/video_engine/test/android/build_demo.py b/webrtc/video_engine/test/android/build_demo.py
new file mode 100755
index 0000000..92758ab
--- /dev/null
+++ b/webrtc/video_engine/test/android/build_demo.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
+#
+# Use of this source code is governed by a BSD-style license
+# that can be found in the LICENSE file in the root of the source
+# tree. An additional intellectual property rights grant can be found
+# in the file PATENTS. All contributing project authors may
+# be found in the AUTHORS file in the root of the source tree.
+
+
+"""Builds the WebRTC Video Demo for Android.
+
+This script is designed as an annotation script to be run by a Chrome Buildbot.
+
+PREREQUISITES: You must have built WebRTC with the right environment set (the
+one you get when sourcing build/android/envsetup.sh) before building with this
+script.
+
+NOTICE: To build successfully, you have to have Ant installed and have your
+.gclient file setup with the target_os = ["android"] variable appended to the
+last line of your WebRTC solution, so it looks like this:
+];target_os = ["android"]
+Then run 'gclient sync' to sync out the required Android SDK and NDK files into
+the third_party directory.
+If you want to get additional platform-specific dependencies in the same
+checkout, add them to the list too, e.g. target_os = ["android", "unix"].
+"""
+
+import optparse
+import os
+import subprocess
+import sys
+
+_CURRENT_DIR = os.path.abspath(os.path.dirname(__file__))
+_ROOT_DIR = os.path.abspath(os.path.join(_CURRENT_DIR, '..', '..', '..', '..'))
+_ANDROID_ENV_SCRIPT = os.path.join(_ROOT_DIR, 'build', 'android', 'envsetup.sh')
+
+def main():
+ parser = optparse.OptionParser('usage: %prog -t <target>')
+
+ parser.add_option('-t', '--target', default='debug',
+ help='Compile target (debug/release). Default: %default')
+ # Build and factory properties are currently unused but are required to avoid
+ # errors when the script is executed by the buildbots.
+ parser.add_option('--build-properties', help='Build properties (unused)')
+ parser.add_option('--factory-properties', help='Factory properties (unused)')
+ options, _args = parser.parse_args()
+
+ def RunInAndroidEnv(cmd):
+ return 'source %s && %s' % (_ANDROID_ENV_SCRIPT, cmd)
+
+ print '@@@BUILD_STEP ndk-build@@@'
+ cmd = RunInAndroidEnv('ndk-build')
+ print cmd
+ try:
+ subprocess.check_call(cmd, cwd=_CURRENT_DIR, shell=True)
+ except subprocess.CalledProcessError as e:
+ print 'NDK build failed: %s' % e
+ print '@@@STEP_FAILURE@@@'
+ return 1
+
+ print '@@@BUILD_STEP ant-build@@@'
+ cmd = RunInAndroidEnv('ant %s' % options.target.lower())
+ print cmd
+ try:
+ subprocess.check_call(cmd, cwd=_CURRENT_DIR, shell=True)
+ except subprocess.CalledProcessError as e:
+ print 'Ant build failed: %s' % e
+ print '@@@STEP_FAILURE@@@'
+ return 2
+
+ print 'WebRTC Demo build completed.'
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/webrtc/video_engine/test/android/jni/Android.mk b/webrtc/video_engine/test/android/jni/Android.mk
index 4f5dd89..ae06c3e 100644
--- a/webrtc/video_engine/test/android/jni/Android.mk
+++ b/webrtc/video_engine/test/android/jni/Android.mk
@@ -13,275 +13,275 @@
# Specify BUILDTYPE=Release on the command line for a release build.
BUILDTYPE ?= Debug
-MY_LIBS_PATH := ../../../../../out/$(BUILDTYPE)/obj.target
+MY_LIBS_PATH := ../../../../../out/$(BUILDTYPE)
include $(CLEAR_VARS)
LOCAL_MODULE := libvoice_engine_core
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/voice_engine/libvoice_engine_core.a
+ $(MY_LIBS_PATH)/libvoice_engine_core.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libvideo_engine_core
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/video_engine/libvideo_engine_core.a
+ $(MY_LIBS_PATH)/libvideo_engine_core.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libvideo_processing
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libvideo_processing.a
+ $(MY_LIBS_PATH)/libvideo_processing.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libwebrtc_video_coding
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libwebrtc_video_coding.a
+ $(MY_LIBS_PATH)/libwebrtc_video_coding.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libvideo_render_module
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libvideo_render_module.a
+ $(MY_LIBS_PATH)/libvideo_render_module.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libvideo_capture_module
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libvideo_capture_module.a
+ $(MY_LIBS_PATH)/libvideo_capture_module.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaudio_coding_module
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libaudio_coding_module.a
+ $(MY_LIBS_PATH)/libaudio_coding_module.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaudio_processing
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libaudio_processing.a
+ $(MY_LIBS_PATH)/libaudio_processing.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaudio_processing_neon
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libaudio_processing_neon.a
+ $(MY_LIBS_PATH)/libaudio_processing_neon.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libPCM16B
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libPCM16B.a
+ $(MY_LIBS_PATH)/libPCM16B.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libCNG
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libCNG.a
+ $(MY_LIBS_PATH)/libCNG.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libNetEq
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libNetEq.a
+ $(MY_LIBS_PATH)/libNetEq.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libG722
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libG722.a
+ $(MY_LIBS_PATH)/libG722.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libiSAC
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libiSAC.a
+ $(MY_LIBS_PATH)/libiSAC.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libG711
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libG711.a
+ $(MY_LIBS_PATH)/libG711.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libiLBC
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libiLBC.a
+ $(MY_LIBS_PATH)/libiLBC.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libiSACFix
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libiSACFix.a
+ $(MY_LIBS_PATH)/libiSACFix.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libisac_neon
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libisac_neon.a
+ $(MY_LIBS_PATH)/libisac_neon.a
include $(PREBUILT_STATIC_LIBRARY)
# Remove the following file existense check when opus is always enabled.
-ifneq ($(wildcard jni/$(MY_LIBS_PATH)/third_party/opus/libopus.a),)
+ifneq ($(wildcard jni/$(MY_LIBS_PATH)/libopus.a),)
include $(CLEAR_VARS)
LOCAL_MODULE := libopus
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/third_party/opus/libopus.a
+ $(MY_LIBS_PATH)/libopus.a
include $(PREBUILT_STATIC_LIBRARY)
endif
-ifneq ($(wildcard jni/$(MY_LIBS_PATH)/webrtc/modules/libwebrtc_opus.a),)
+ifneq ($(wildcard jni/$(MY_LIBS_PATH)/libwebrtc_opus.a),)
include $(CLEAR_VARS)
LOCAL_MODULE := libwebrtc_opus
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libwebrtc_opus.a
+ $(MY_LIBS_PATH)/libwebrtc_opus.a
include $(PREBUILT_STATIC_LIBRARY)
endif
include $(CLEAR_VARS)
LOCAL_MODULE := libvad
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/common_audio/libvad.a
+ $(MY_LIBS_PATH)/libvad.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libbitrate_controller
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libbitrate_controller.a
+ $(MY_LIBS_PATH)/libbitrate_controller.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libresampler
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/common_audio/libresampler.a
+ $(MY_LIBS_PATH)/libresampler.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libsignal_processing
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/common_audio/libsignal_processing.a
+ $(MY_LIBS_PATH)/libsignal_processing.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libsignal_processing_neon
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/common_audio/libsignal_processing_neon.a
+ $(MY_LIBS_PATH)/libsignal_processing_neon.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libcommon_video
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/common_video/libcommon_video.a
+ $(MY_LIBS_PATH)/libcommon_video.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libsystem_wrappers
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/system_wrappers/source/libsystem_wrappers.a
+ $(MY_LIBS_PATH)/libsystem_wrappers.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libcpu_features_android
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/system_wrappers/source/libcpu_features_android.a
+ $(MY_LIBS_PATH)/libcpu_features_android.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaudio_device
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libaudio_device.a
+ $(MY_LIBS_PATH)/libaudio_device.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libremote_bitrate_estimator
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libremote_bitrate_estimator.a
+ $(MY_LIBS_PATH)/libremote_bitrate_estimator.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := librtp_rtcp
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/librtp_rtcp.a
+ $(MY_LIBS_PATH)/librtp_rtcp.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libmedia_file
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libmedia_file.a
+ $(MY_LIBS_PATH)/libmedia_file.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libudp_transport
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libudp_transport.a
+ $(MY_LIBS_PATH)/libudp_transport.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libwebrtc_utility
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libwebrtc_utility.a
+ $(MY_LIBS_PATH)/libwebrtc_utility.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaudio_conference_mixer
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libaudio_conference_mixer.a
+ $(MY_LIBS_PATH)/libaudio_conference_mixer.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libyuv
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/third_party/libyuv/libyuv.a
+ $(MY_LIBS_PATH)/libyuv.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libwebrtc_i420
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libwebrtc_i420.a
+ $(MY_LIBS_PATH)/libwebrtc_i420.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libwebrtc_vp8
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/video_coding/codecs/vp8/libwebrtc_vp8.a
+ $(MY_LIBS_PATH)/libwebrtc_vp8.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libjpeg_turbo
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/third_party/libjpeg_turbo/libjpeg_turbo.a
+ $(MY_LIBS_PATH)/libjpeg_turbo.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libaudioproc_debug_proto
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libaudioproc_debug_proto.a
+ $(MY_LIBS_PATH)/libaudioproc_debug_proto.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libprotobuf_lite
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/third_party/protobuf/libprotobuf_lite.a
+ $(MY_LIBS_PATH)/libprotobuf_lite.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libvpx
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/third_party/libvpx/libvpx.a
+ $(MY_LIBS_PATH)/libvpx.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libvpx_arm_neon
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/third_party/libvpx/libvpx_arm_neon.a
+ $(MY_LIBS_PATH)/libvpx_arm_neon.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libpaced_sender
LOCAL_SRC_FILES := \
- $(MY_LIBS_PATH)/webrtc/modules/libpaced_sender.a
+ $(MY_LIBS_PATH)/libpaced_sender.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)