Appcenter: Please support .obb uploading for Android distribution

Created on 29 Apr 2019  路  8Comments  路  Source: microsoft/appcenter

Describe the solution you'd like
Our Android app requires over 2GB of data, which means we're unable to package our binaries and .obb files into a single .apk (using Gradle to build, we get an error when packaging due to hitting the max array size of 2GB in JVM). This means we're unable to distribute an Android build on AppCenter.

Please support uploading .obb files alongside a .apk to resolve this issue.

Describe alternatives you've considered
Using Google Play for build distribution.

Additional context
We really want to use AppCenter for Android because we're using it for iOS and like the workflow. However currently we're unable to publish Android builds on it.

Thanks!

Stale distribute feature request

Most helpful comment

This is a feature we would very much like added to the existing distribution features for use in our Unity project. Please add this.

All 8 comments

Hi Samuel, thanks for the suggestion! I'll take this request back to the team to prioritize.

@samuelbigos I haven't done it yet, but plan on uploading using a post-build script and this python script.

Have you gone about it a different way? Would love to hear how you did it.

Example usage
python uploadApk.py -p $ANDROID_IDENTIFIER -a output/android-release.apk -s service_account.json -n ${APPLICATION_VERSION_NAME} -v ${APPLICATION_VERSION_CODE} -e output/main.${APPLICATION_VERSION_CODE}.${ANDROID_IDENTIFIER}.obb -t internal

#!/usr/bin/env python
#
# Copyright 2014 Marta Rodriguez.
#
# 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
#
#      http://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.

"""Uploads an apk to the alpha track."""

import sys
#required on OSX to prevent the default 'six' library from interfering with the needed newer package, as of the 1.4.1 google-api library
#sys.path.insert(1, '/Library/Python/2.7/site-packages')

import argparse
import httplib2
import json

from oauth2client.service_account import ServiceAccountCredentials
from oauth2client.client import AccessTokenRefreshError
from apiclient.discovery import build

def upload(package, service, apk, track, versionCode, obbFilePath, versionName):

  # Create an httplib2.Http object to handle our HTTP requests and authorize it
  # with the Credentials. Note that the first parameter, service_account_name,
  # is the Email address created for the Service account. It must be the email
  # address associated with the key that was created.
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      service, ['https://www.googleapis.com/auth/androidpublisher'])

  http_auth = credentials.authorize(http=httplib2.Http())
  service = build('androidpublisher', 'v3', http=http_auth)

  try:
    edit_request = service.edits().insert(body={}, packageName=package)
    result = edit_request.execute()
    edit_id = result['id']

    apk_response = service.edits().apks().upload(
        editId=edit_id,
        packageName=package,
        media_body=apk).execute()

    obb_response = service.edits().expansionfiles().upload(
            apkVersionCode=versionCode,
            editId=edit_id,
            expansionFileType="main",
            packageName=package,
            media_body=obbFilePath,
            media_mime_type='application/octet-stream').execute()

    print apk_response
    print 'Version code %d has been successfully uploaded' % apk_response['versionCode']

    track_response = service.edits().tracks().update(
        editId=edit_id,
        track=track,
        packageName=package,
        body={u'releases': [{
            u'name': versionName,
            u'versionCodes': [ apk_response['versionCode'] ],
            u'releaseNotes': [
                {u'language': u'en-US', u'text': 'Bug fixes and improvements'},
            ],
            u'status': u'completed',
        }]}).execute()

    print 'Track response= "%s"' % (
        track_response)

    commit_request = service.edits().commit(
        editId=edit_id, packageName=package).execute()

    print 'Edit commit request= "%s"' % (commit_request)

  except AccessTokenRefreshError, e:
    print ('The credentials have been revoked or expired, please re-run the '
           'application to re-authorize')
    raise e

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('-p', '--package', required=True, help='The package name. Example: com.android.sample')
  parser.add_argument('-s', '--service', required=True, help='The service account json file.')
  parser.add_argument('-a', '--apk', required=True, help='The path to the APK file to upload.')
  parser.add_argument('-t', '--track', choices=['alpha', 'beta', 'production','rollout','internal'], default='alpha')
  parser.add_argument('-v', '--version', required=True, help='The versionCode number (integer)')
  parser.add_argument('-e', '--extension', required=True, help='The path to the OBB file to upload.')
  parser.add_argument('-n', '--name', required=True, help='The versionCode name')

  args = parser.parse_args()

  upload(args.package, args.service, args.apk, args.track, args.version, args.extension, args.name)

if __name__ == "__main__":
  main()

Would also love to know how to use .obb files to distribute...

We would also love to have this.

This is a feature we would very much like added to the existing distribution features for use in our Unity project. Please add this.

@botatoes Has this been added to the roadmap? We don't want to migrate away from app center's wonderful features simply because it can't handle the OBB files when using it with unity projects!

This issue has been automatically marked as stale because it has not had any activity for 60 days. It will be closed if no further activity occurs within 15 days of this comment.

This issue will now be closed because it hasn't had any activity for 15 days after stale. Please feel free to open a new issue if you still have a question/issue or suggestion.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

thabemmz picture thabemmz  路  3Comments

KSemenenko picture KSemenenko  路  3Comments

invariant picture invariant  路  3Comments

botatoes picture botatoes  路  4Comments

egorikftp picture egorikftp  路  3Comments