From 18a21a03c6cedb41e2dea377240221611d3dfcb1 Mon Sep 17 00:00:00 2001 From: "kjellander@webrtc.org" Date: Mon, 11 Feb 2013 17:43:19 +0000 Subject: [PATCH] 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 --- .gitignore | 9 +- DEPS | 10 ++ OWNERS | 7 +- .../video_engine/test/android/build_demo.py | 77 +++++++++++++++ .../video_engine/test/android/jni/Android.mk | 94 +++++++++---------- 5 files changed, 147 insertions(+), 50 deletions(-) create mode 100755 webrtc/video_engine/test/android/build_demo.py diff --git a/.gitignore b/.gitignore index d5d64cdb8f..ff7a557f73 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 dc3e72a130..5b94e086db 100644 --- a/DEPS +++ b/DEPS @@ -106,6 +106,16 @@ deps_os = { "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 b110a52ba7..58b9be3d55 100644 --- a/OWNERS +++ b/OWNERS @@ -2,4 +2,9 @@ henrika@webrtc.org 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 0000000000..92758aba4c --- /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 ') + + 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 4f5dd89433..ae06c3e037 100644 --- a/webrtc/video_engine/test/android/jni/Android.mk +++ b/webrtc/video_engine/test/android/jni/Android.mk @@ -13,275 +13,275 @@ include $(call all-makefiles-under, $(LOCAL_PATH)) # 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)