{ "id": "172389", "key": "TIMOB-26434", "fields": { "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "20033", "name": "Release 9.0.0", "archived": false, "released": true, "releaseDate": "2020-03-18" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2020-01-30T16:44:01.000+0000", "created": "2018-10-03T12:38:18.000+0000", "priority": { "name": "High", "id": "2" }, "labels": [ "2019-cl", "android", "build", "production" ], "versions": [], "issuelinks": [ { "id": "57989", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "171082", "key": "TIMOB-26373", "fields": { "summary": "Android: Option to split apk's produced from builds based on CPU architecture arm64-v8a armeabi-v7a x86", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Critical", "id": "1" }, "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false } } } } ], "assignee": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2020-01-30T16:44:01.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10202", "name": "Android", "description": "Android Platform" } ], "description": "*Summary:*\r\nGoogle Play allows you to upload your app as an \"app bundle\" (aka: an {{*.aab}} file) instead of an APK. How this works is that Google will generate multiple APKs from the app bundle, split by architecture and image density, and digitally sign each APK with a keystore you've uploaded for you. This is a similar feature to what Apple provides on iOS and allows for smaller apps to be downloaded to the Android device.\r\nhttps://developer.android.com/guide/app-bundle\r\n\r\n*Note:*\r\nYou cannot install/run an app bundle on an Android devices. That is, Android devices still only support APKs. An app bundle is only a Google Play publishing feature.\r\n\r\nThis is why a Titanium \"test\" or \"development\" build should not build an app bundle, because it's useless for local testing purposes. It only makes sense for \"production\" builds for publishing.\r\n\r\n*Recommended Solution:*\r\nWhen doing a \"production\" build, Titanium should generate both an APK and app-bundle to the destination directory. No configuration required.\r\n\r\nNote that building a \"production\" APK is still useful. Some features such as push notifications, in-app billing, Google LVL licensing, etc. can't be tested with a \"debug.keystore\" signed APK. Also, app bundles do not support Google expansion files. Nor are app bundles supported on other Android app stores such as Amazon (ie: only supported on Google Play).\r\n\r\nWe can implement app bundle support once we've adopted gradle build support.\r\nhttps://developer.android.com/studio/build/building-cmdline\r\n\r\nThe {{gradlew}} command line would be something like this...\r\n{code}\r\n./gradlew :app:bundleRelease\r\n{code}\r\n", "attachment": [], "flagged": false, "summary": "Android: Support building \"app bundles\"", "creator": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "subtasks": [], "reporter": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "environment": null, "closedSprints": [ { "id": 1175, "state": "closed", "name": "2019 Sprint 26", "startDate": "2019-12-16T06:12:12.044Z", "endDate": "2019-12-21T06:12:00.000Z", "completeDate": "2019-12-22T03:07:15.802Z", "originBoardId": 114 }, { "id": 1177, "state": "closed", "name": "2020 Sprint 2", "startDate": "2020-01-20T17:44:37.733Z", "endDate": "2020-01-31T17:44:00.000Z", "completeDate": "2020-01-31T16:57:44.689Z", "originBoardId": 114 } ], "comment": { "comments": [ { "id": "442958", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Note that this should be a build \"option\" and not a replacement. Reasons are:\r\n* App bundle \".aab\" files are only supported by Google Play and no other Android app store, such as Amazon.\r\n* App bundles do not support Google Expansion Files. _(This is a huge negative.)_\r\n* It would likely mean dropping Android 4.x OS support, but that may be okay.\r\nhttps://developer.android.com/guide/app-bundle/#known_issues\r\n\r\nI'm fine with us supporting AAB app bundles since it offers us a solution to split apps by architecture (ARMv7, ARM64, and x86). The C/C++ .so libraries is where most of the binary bloat a Titanium app has (the Java side is very small in comparison). But doing separate APK builds per architecture is still a good option as well because it doesn't have the above mentioned limitations. And it's the only option if you want to publish to other Android app stores.", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-10-25T19:22:52.000+0000", "updated": "2018-10-25T19:22:52.000+0000" }, { "id": "442978", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "I agree! It should not even be the default, but an optional parameter to enable it would be awesome. It seems like we could invoke indeed trigger it with the CLI (usually it's enabled with Gradle / Android Studio). *If* Studio wants to support it, we need some new input forms for it I think, as well as prompts for the CLI. Bumping to Android 5 for it should be worth it. Exciting topic for sure. ", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2018-10-26T07:48:50.000+0000", "updated": "2018-10-26T07:48:50.000+0000" }, { "id": "445024", "author": { "name": "dxgx82", "key": "dxgx82", "displayName": "Darius G", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Waiting for this feature!", "updateAuthor": { "name": "dxgx82", "key": "dxgx82", "displayName": "Darius G", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2019-01-07T10:49:49.000+0000", "updated": "2019-01-07T10:49:49.000+0000" }, { "id": "446168", "author": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "body": "+1 for this.\r\n\r\nApp Bundles are needed for \"App Signing by Google Play\" and it seems that this is the new \"recommended\" way for signing apps in the future as it is much more flexible (and safe?!) towards signing keys since it is all managed by Google.\r\n\r\nIt also enables Dynamic Delivery as mentioned before according to https://developer.android.com/guide/app-bundle/#dynamic_delivery\r\n\r\nAs for other stores, Google mentions in the docs that you should generate your own signing keys and provide them to Google in the opt-in process so you still be able to sign apks for other stores.\r\n\r\nbq. \"Note: When you opt in to App signing by Google Play, you aren’t able to download the signing key from Google. If you want to use the same signing key across multiple stores, make sure to provide your own signing key when you opt in to App signing by Google Play, instead of having Google generate one for you.\"", "updateAuthor": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "created": "2019-02-19T20:53:08.000+0000", "updated": "2019-02-19T20:53:08.000+0000" }, { "id": "448769", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Starting today, Google play officially warns you your APK's is not optimized and that app bundles should be used. Can someone just write a CLI plugin to use the official [{{bundletool}} CLI tools|https://github.com/google/bundletool]? It saves between 20 and 40 % app size in general, which is quite important to compete these days. Thanks!", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2019-06-03T05:13:08.000+0000", "updated": "2019-06-03T05:13:08.000+0000" }, { "id": "449074", "author": { "name": "trevor.crawford", "key": "trevor.crawford", "displayName": "Trevor Crawford", "active": true, "timeZone": "America/Chicago" }, "body": "I'd really like to see this feature get implemented!", "updateAuthor": { "name": "trevor.crawford", "key": "trevor.crawford", "displayName": "Trevor Crawford", "active": true, "timeZone": "America/Chicago" }, "created": "2019-06-13T20:27:49.000+0000", "updated": "2019-06-13T20:27:49.000+0000" }, { "id": "449958", "author": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "body": "I'm receiving the Play Store warns on every build since June as well...", "updateAuthor": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "created": "2019-07-19T19:23:59.000+0000", "updated": "2019-07-19T19:23:59.000+0000" }, { "id": "449984", "author": { "name": "chmiiller", "key": "chmiiller", "displayName": "Carlos Henrique Zinato", "active": true, "timeZone": "America/Los_Angeles" }, "body": "+1 waiting for this feature", "updateAuthor": { "name": "chmiiller", "key": "chmiiller", "displayName": "Carlos Henrique Zinato", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2019-07-22T11:00:56.000+0000", "updated": "2019-07-22T11:00:56.000+0000" }, { "id": "449996", "author": { "name": "lvdwiele", "key": "lvdwiele", "displayName": "Louis van de Wiele", "active": true, "timeZone": "Europe/Amsterdam" }, "body": "+1 Love to see this soon :)", "updateAuthor": { "name": "lvdwiele", "key": "lvdwiele", "displayName": "Louis van de Wiele", "active": true, "timeZone": "Europe/Amsterdam" }, "created": "2019-07-22T21:36:19.000+0000", "updated": "2019-07-22T21:36:19.000+0000" }, { "id": "451339", "author": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "body": "any news on this?", "updateAuthor": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "created": "2019-09-12T19:23:45.000+0000", "updated": "2019-09-12T19:23:45.000+0000" }, { "id": "453277", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "PR (master): https://github.com/appcelerator/titanium_mobile/pull/11407", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2019-12-21T02:26:01.000+0000", "updated": "2019-12-21T02:26:01.000+0000" }, { "id": "453866", "author": { "name": "ssekhri", "key": "ssekhri", "displayName": "Satyam Sekhri", "active": true, "timeZone": "America/Los_Angeles" }, "body": "FR Passed. Creating a production build for a project created a .apk and .aab file. The app bundle uploads successfully on play store.\r\n\r\nWaiting on Jenkins build.", "updateAuthor": { "name": "ssekhri", "key": "ssekhri", "displayName": "Satyam Sekhri", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2020-01-28T22:56:38.000+0000", "updated": "2020-01-28T22:56:38.000+0000" }, { "id": "453932", "author": { "name": "cwilliams", "key": "cwilliams", "displayName": "Christopher Williams", "active": true, "timeZone": "America/New_York" }, "body": "merged to master for 9.0.0", "updateAuthor": { "name": "cwilliams", "key": "cwilliams", "displayName": "Christopher Williams", "active": true, "timeZone": "America/New_York" }, "created": "2020-01-30T15:17:24.000+0000", "updated": "2020-01-30T15:17:24.000+0000" }, { "id": "453937", "author": { "name": "ssaddique", "key": "ssaddique", "displayName": "Sohail Saddique", "active": true, "timeZone": "Europe/London" }, "body": "Ticket verified on build: 9.0.0.v20200130071742. APK and AAB files are both generated as expected. Ticket closed.", "updateAuthor": { "name": "ssaddique", "key": "ssaddique", "displayName": "Sohail Saddique", "active": true, "timeZone": "Europe/London" }, "created": "2020-01-30T16:43:54.000+0000", "updated": "2020-01-30T16:43:54.000+0000" } ], "maxResults": 16, "total": 16, "startAt": 0 } } }