webrtc android 打包成aar

我的环境:webrtc最新的, ubuntu20.04, python2.7

webrtc android 打包成aar,执行 tools_webrtc/android/release_aar.py --verbose --build-dir out/aar_release  会出现下面一些错误:

Traceback (most recent call last):
  File "tools_webrtc/android/release_aar.py", line 31, in <module>
    import requests
ImportError: No module named requests

错误明显是没安装requests,

需要对 src/gedit tools_webrtc/android/release_aar.py 做修改,而且支持python2.7,需要安装pip,再用pip 安装requests,具体怎么安装网上查找实现,

安装好requests后,再执行上面的命令出现如下错误:

INFO:root:Releasing AAR version 1.0.33829 with hash 448d18b18d57871d1030fc8748b34250e48be385
Traceback (most recent call last):
  File "tools_webrtc/android/release_aar.py", line 307, in <module>
    sys.exit(main())
  File "tools_webrtc/android/release_aar.py", line 303, in main
    ReleaseAar(args.use_goma, args.skip_tests, args.publish, args.build_dir)
  File "tools_webrtc/android/release_aar.py", line 255, in ReleaseAar
    'Environment variables BINTRAY_USER and BINTRAY_API_KEY '
Exception: Environment variables BINTRAY_USER and BINTRAY_API_KEY must be defined.

这是需要你验证用户信息,因为发布到api.bintray.com上去需要验证用户信息,但我们现在用不上,解决方法是,修改release_aar.py ,把其他没用的注释掉即可,修改如下:

#!/usr/bin/env python

# Copyright (c) 2017 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.
"""Script for publishing WebRTC AAR on Bintray.

Set BINTRAY_USER and BINTRAY_API_KEY environment variables before running
this script for authentication.
"""

import argparse
import json
import logging
import os
import re
import shutil
import subprocess
import sys
import tempfile
import time

SCRIPT_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir))

sys.path.append(os.path.join(CHECKOUT_ROOT, 'third_party'))
import requests
import jinja2

sys.path.append(os.path.join(CHECKOUT_ROOT, 'tools_webrtc'))
from android.build_aar import BuildAar

ARCHS = ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64']
MAVEN_REPOSITORY = 'https://google.bintray.com/webrtc'
API = 'https://api.bintray.com'
PACKAGE_PATH = 'google/webrtc/google-webrtc'
CONTENT_API = API + '/content/' + PACKAGE_PATH
PACKAGES_API = API + '/packages/' + PACKAGE_PATH
GROUP_ID = 'org/webrtc'
ARTIFACT_ID = 'google-webrtc'
COMMIT_POSITION_REGEX = r'^Cr-Commit-Position: refs/heads/master@{#(\d+)}$'
API_TIMEOUT_SECONDS = 10.0
UPLOAD_TRIES = 3
# The sleep time is increased exponentially.
UPLOAD_RETRY_BASE_SLEEP_SECONDS = 2.0
GRADLEW_BIN = os.path.join(CHECKOUT_ROOT,
                           'examples/androidtests/third_party/gradle/gradlew')
ADB_BIN = os.path.join(CHECKOUT_ROOT,
                       'third_party/android_sdk/public/platform-tools/adb')
AAR_PROJECT_DIR = os.path.join(CHECKOUT_ROOT, 'examples/aarproject')
AAR_PROJECT_GRADLE = os.path.join(AAR_PROJECT_DIR, 'build.gradle')
AAR_PROJECT_APP_GRADLE = os.path.join(AAR_PROJECT_DIR, 'app', 'build.gradle')
AAR_PROJECT_DEPENDENCY = "implementation 'org.webrtc:google-webrtc:1.0.+'"
AAR_PROJECT_VERSION_DEPENDENCY = "implementation 'org.webrtc:google-webrtc:%s'"


def _ParseArgs():
    parser = argparse.ArgumentParser(description='Releases WebRTC on Bintray.')
    parser.add_argument('--use-goma',
                        action='store_true',
                        default=False,
                        help='Use goma.')
    parser.add_argument('--skip-tests',
                        action='store_true',
                        default=False,
                        help='Skips running the tests.')
    parser.add_argument(
        '--publish',
        action='store_true',
        default=False,
        help='Automatically publishes the library if the tests pass.')
    parser.add_argument(
        '--build-dir',
        default=None,
        help='Temporary directory to store the build files. If not specified, '
        'a new directory will be created.')
    parser.add_argument('--verbose',
                        action='store_true',
                        default=False,
                        help='Debug logging.')
    return parser.parse_args()


def _GetCommitHash():
    commit_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'],
                                          cwd=CHECKOUT_ROOT).strip()
    return commit_hash


def _GetCommitPos():
    commit_message = subprocess.check_output(
        ['git', 'rev-list', '--format=%B', '--max-count=1', 'HEAD'],
        cwd=CHECKOUT_ROOT)
    commit_pos_match = re.search(COMMIT_POSITION_REGEX, commit_message,
                                 re.MULTILINE)
    if not commit_pos_match:
        raise Exception('Commit position not found in the commit message: %s' %
                        commit_message)
    return commit_pos_match.group(1)


def _UploadFile(user, password, filename, version, target_file):
    # URL is of format:
    # <repository_api>/<version>/<group_id>/<artifact_id>/<version>/<target_file>
    # Example:
    # https://api.bintray.com/content/google/webrtc/google-webrtc/1.0.19742/org/webrtc/google-webrtc/1.0.19742/google-webrtc-1.0.19742.aar

    target_dir = version + '/' + GROUP_ID + '/' + ARTIFACT_ID + '/' + version
    target_path = target_dir + '/' + target_file
    url = CONTENT_API + '/' + target_path

    logging.info('Uploading %s to %s', filename, url)
    with open(filename) as fh:
        file_data = fh.read()

    for attempt in xrange(UPLOAD_TRIES):
        try:
            response = requests.put(url,
                                    data=file_data,
                                    auth=(user, password),
                                    timeout=API_TIMEOUT_SECONDS)
            break
        except requests.exceptions.Timeout as e:
            logging.warning('Timeout while uploading: %s', e)
            time.sleep(UPLOAD_RETRY_BASE_SLEEP_SECONDS**attempt)
    else:
        raise Exception('Failed to upload %s' % filename)

    if not response.ok:
        raise Exception('Failed to upload %s. Response: %s' %
                        (filename, response))
    logging.info('Uploaded %s: %s', filename, response)


def _GeneratePom(target_file, version, commit):
    env = jinja2.Environment(loader=jinja2.PackageLoader('release_aar'), )
    template = env.get_template('pom.jinja')
    pom = template.render(version=version, commit=commit)
    with open(target_file, 'w') as fh:
        fh.write(pom)


def _TestAAR(tmp_dir, username, password, version):
    """Runs AppRTCMobile tests using the AAR. Returns true if the tests pass."""
    logging.info('Testing library.')
    env = jinja2.Environment(loader=jinja2.PackageLoader('release_aar'), )

    gradle_backup = os.path.join(tmp_dir, 'build.gradle.backup')
    app_gradle_backup = os.path.join(tmp_dir, 'app-build.gradle.backup')

    # Make backup copies of the project files before modifying them.
    shutil.copy2(AAR_PROJECT_GRADLE, gradle_backup)
    shutil.copy2(AAR_PROJECT_APP_GRADLE, app_gradle_backup)

    try:
        maven_repository_template = env.get_template('maven-repository.jinja')
        maven_repository = maven_repository_template.render(
            url=MAVEN_REPOSITORY, username=username, password=password)

        # Append Maven repository to build file to download unpublished files.
        with open(AAR_PROJECT_GRADLE, 'a') as gradle_file:
            gradle_file.write(maven_repository)

        # Read app build file.
        with open(AAR_PROJECT_APP_GRADLE, 'r') as gradle_app_file:
            gradle_app = gradle_app_file.read()

        if AAR_PROJECT_DEPENDENCY not in gradle_app:
            raise Exception('%s not found in the build file.' %
                            AAR_PROJECT_DEPENDENCY)
        # Set version to the version to be tested.
        target_dependency = AAR_PROJECT_VERSION_DEPENDENCY % version
        gradle_app = gradle_app.replace(AAR_PROJECT_DEPENDENCY,
                                        target_dependency)

        # Write back.
        with open(AAR_PROJECT_APP_GRADLE, 'w') as gradle_app_file:
            gradle_app_file.write(gradle_app)

        # Uninstall any existing version of AppRTCMobile.
        logging.info(
            'Uninstalling previous AppRTCMobile versions. It is okay for '
            'these commands to fail if AppRTCMobile is not installed.')
        subprocess.call([ADB_BIN, 'uninstall', 'org.appspot.apprtc'])
        subprocess.call([ADB_BIN, 'uninstall', 'org.appspot.apprtc.test'])

        # Run tests.
        try:
            # First clean the project.
            subprocess.check_call([GRADLEW_BIN, 'clean'], cwd=AAR_PROJECT_DIR)
            # Then run the tests.
            subprocess.check_call([GRADLEW_BIN, 'connectedDebugAndroidTest'],
                                  cwd=AAR_PROJECT_DIR)
        except subprocess.CalledProcessError:
            logging.exception('Test failure.')
            return False  # Clean or tests failed

        return True  # Tests pass
    finally:
        # Restore backups.
        shutil.copy2(gradle_backup, AAR_PROJECT_GRADLE)
        shutil.copy2(app_gradle_backup, AAR_PROJECT_APP_GRADLE)


def _PublishAAR(user, password, version, additional_args):
    args = {
        'publish_wait_for_secs': 0  # Publish asynchronously.
    }
    args.update(additional_args)

    url = CONTENT_API + '/' + version + '/publish'
    response = requests.post(url,
                             data=json.dumps(args),
                             auth=(user, password),
                             timeout=API_TIMEOUT_SECONDS)

    if not response.ok:
        raise Exception('Failed to publish. Response: %s' % response)


def _DeleteUnpublishedVersion(user, password, version):
    url = PACKAGES_API + '/versions/' + version
    response = requests.get(url,
                            auth=(user, password),
                            timeout=API_TIMEOUT_SECONDS)
    if not response.ok:
        raise Exception('Failed to get version info. Response: %s' % response)

    version_info = json.loads(response.content)
    if version_info['published']:
        logging.info('Version has already been published, not deleting.')
        return

    logging.info('Deleting unpublished version.')
    response = requests.delete(url,
                               auth=(user, password),
                               timeout=API_TIMEOUT_SECONDS)
    if not response.ok:
        raise Exception('Failed to delete version. Response: %s' % response)


def ReleaseAar(use_goma, skip_tests, publish, build_dir):
    version = '1.0.' + _GetCommitPos()
    commit = _GetCommitHash()
    logging.info('Releasing AAR version %s with hash %s', version, commit)

    user = os.environ.get('BINTRAY_USER', None)
    api_key = os.environ.get('BINTRAY_API_KEY', None)
    #if not user or not api_key:
    #    raise Exception(
    #        'Environment variables BINTRAY_USER and BINTRAY_API_KEY '
    #        'must be defined.')

    # If build directory is not specified, create a temporary directory.
    use_tmp_dir = not build_dir
    if use_tmp_dir:
        build_dir = tempfile.mkdtemp()

    try:
        base_name = ARTIFACT_ID + '-' + version
        aar_file = os.path.join(build_dir, base_name + '.aar')
        third_party_licenses_file = os.path.join(build_dir, 'LICENSE.md')
        pom_file = os.path.join(build_dir, base_name + '.pom')

        logging.info('Building at %s', build_dir)
        BuildAar(ARCHS,
                 aar_file,
                 use_goma=use_goma,
                 ext_build_dir=os.path.join(build_dir, 'aar-build'))
        _GeneratePom(pom_file, version, commit)

        #_UploadFile(user, api_key, aar_file, version, base_name + '.aar')
        #_UploadFile(user, api_key, third_party_licenses_file, version,
        #            'THIRD_PARTY_LICENSES.md')
        #_UploadFile(user, api_key, pom_file, version, base_name + '.pom')

        tests_pass = skip_tests or _TestAAR(build_dir, user, api_key, version)
        if not tests_pass:
            logging.info('Discarding library.')
            #_PublishAAR(user, api_key, version, {'discard': True})
            _DeleteUnpublishedVersion(user, api_key, version)
            raise Exception('Test failure. Discarded library.')

        if publish:
            logging.info('Publishing library.')
            #_PublishAAR(user, api_key, version, {})
        else:
            logging.info(
                'Note: The library has not not been published automatically.'
                ' Please do so manually if desired.')
    finally:
        if use_tmp_dir:
            shutil.rmtree(build_dir, True)


def main():
    args = _ParseArgs()
    logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO)
    ReleaseAar(args.use_goma, args.skip_tests, args.publish, args.build_dir)


if __name__ == '__main__':
    sys.exit(main())

再进入src目下,执行:tools_webrtc/android/release_aar.py --verbose --build-dir out/aar_release 

--build-dir是只输出目录

输出结果如下:

INFO:root:Releasing AAR version 1.0.33829 with hash 448d18b18d57871d1030fc8748b34250e48be385
INFO:root:Building at out/aar_release
INFO:root:Building: armeabi-v7a
DEBUG:root:Running: ['/usr/bin/python', '/home/proj/webrtc_linux/src/third_party/depot_tools/gn.py', 'gen', 'out/aar_release/aar-build/armeabi-v7a', '--args=arm_version=7 use_goma=false target_cpu="arm" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 5367 targets from 299 files in 5600ms
DEBUG:root:Running: ['/home/proj/webrtc_linux/src/third_party/depot_tools/ninja', '-C', 'out/aar_release/aar-build/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `out/aar_release/aar-build/armeabi-v7a'
[3774/3774] STAMP obj/sdk/android/libwebrtc.stamp
INFO:root:Building: arm64-v8a
DEBUG:root:Running: ['/usr/bin/python', '/home/proj/webrtc_linux/src/third_party/depot_tools/gn.py', 'gen', 'out/aar_release/aar-build/arm64-v8a', '--args=use_goma=false target_cpu="arm64" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 5364 targets from 299 files in 1442ms
DEBUG:root:Running: ['/home/proj/webrtc_linux/src/third_party/depot_tools/ninja', '-C', 'out/aar_release/aar-build/arm64-v8a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `out/aar_release/aar-build/arm64-v8a'
[3709/3709] STAMP obj/sdk/android/libwebrtc.stamp
INFO:root:Building: x86
DEBUG:root:Running: ['/usr/bin/python', '/home/proj/webrtc_linux/src/third_party/depot_tools/gn.py', 'gen', 'out/aar_release/aar-build/x86', '--args=use_goma=false target_cpu="x86" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 5383 targets from 301 files in 1083ms
DEBUG:root:Running: ['/home/proj/webrtc_linux/src/third_party/depot_tools/ninja', '-C', 'out/aar_release/aar-build/x86', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `out/aar_release/aar-build/x86'
[3896/3896] STAMP obj/sdk/android/libwebrtc.stamp
INFO:root:Building: x86_64
DEBUG:root:Running: ['/usr/bin/python', '/home/proj/webrtc_linux/src/third_party/depot_tools/gn.py', 'gen', 'out/aar_release/aar-build/x86_64', '--args=use_goma=false target_cpu="x64" is_component_build=false is_debug=false rtc_include_tests=false target_os="android"']
Done. Made 5383 targets from 301 files in 1024ms
DEBUG:root:Running: ['/home/proj/webrtc_linux/src/third_party/depot_tools/ninja', '-C', 'out/aar_release/aar-build/x86_64', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']
ninja: Entering directory `out/aar_release/aar-build/x86_64'
[3892/3892] STAMP obj/sdk/android/libwebrtc.stamp
INFO:root:Collecting common files.
INFO:root:Collecting: armeabi-v7a
INFO:root:Collecting: arm64-v8a
INFO:root:Collecting: x86
INFO:root:Collecting: x86_64

到最后生成的文件如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值