Skip to content

Commit

Permalink
Fix #3803, #3804, #3853, #3669, #3383: Add basic KitKat support in Ba…
Browse files Browse the repository at this point in the history
…zel (#3910)

* Initial commit for drawable->SVG conversion script.

At the moment, about ~40% of drawables can be successfully converted
(with some coordinate system inconsistencies for their gradients that
need to be corrected). Some other SVG constructs still need to be added
for the remaining drawables (such as groups & clip regions).

* Add basic KitKat support.

This includes:
- Defining KitKat-specific flavors
- Utilizing a manual main dex file list (minimized) so that the
  Bazel-built KitKat flavor of the app can start successfully
- Migrating all drawable usage over to compat-compatible so that vectors
  can load properly in the KitKat world (+ opted-in compatibility layer)
- Adding a missing permission that seems only needed on KitKat with
  WorkManager (but isn't unreasonable to request in general)

* Flavor updates & move main dex file.

* Fix alpha KitKat flavor.

* Remove script changes.

* Add regex checks + tests.

Lock vector compat call behind KitKat gate.

* Address TODOs.

* Fix broken tests (potentially round 1).

* Test fixes (round 2).

* Add new test suite for NetworkModule.

* Post-merge + lint fixes.

* Fixes & remove files post-merge.

The removed files were accidentally re-added upon merge.

* Fix broken instrumentation build.

This came from an unrelated previously merged PR.

* Fix syntax error in workflow script.

* Add codeowner for new file.

* Actually fix syntax mistake in workflow.

* Gradle build fixes.

The styles simplification comes from
https://stackoverflow.com/a/50854279/3689782. Apparently, Bazel is more
permissive about this sort of thing than Gradle, but it might have
actually been wrong before (i.e. this version seems more correct).

* Use deep fetch for binary build workflow.

The develop branch needs to also be pulled for building //:oppia dev now
since it uses a transformed manifest.
  • Loading branch information
BenHenning committed Oct 8, 2021
1 parent 5b888db commit 9bf7365
Show file tree
Hide file tree
Showing 106 changed files with 850 additions and 364 deletions.
3 changes: 3 additions & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ NOTICE @BenHenning
# Language configuration files.
config/**/languages/*.textproto @BenHenning

# Configuration for KitKat-specific curated builds.
config/kitkat_main_dex_class_list.txt @BenHenning

#####################################################################################
# app module #
#####################################################################################
Expand Down
78 changes: 70 additions & 8 deletions .github/workflows/build_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ jobs:
CACHE_DIRECTORY: ~/.bazel_cache
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0

- name: Set up JDK 9
uses: actions/setup-java@v1
Expand Down Expand Up @@ -130,16 +132,36 @@ jobs:
run: |
bazel build -- //:oppia
- name: Copy Oppia APK for uploading
run: cp $GITHUB_WORKSPACE/bazel-bin/oppia.apk /home/runner/work/oppia-android/oppia-android/
# Note that caching only works on non-forks.
- name: Build Oppia KitKat binary (with caching, non-fork only)
if: ${{ env.ENABLE_CACHING == 'true' && github.event.pull_request.head.repo.full_name == 'oppia/oppia-android' }}
env:
BAZEL_REMOTE_CACHE_URL: ${{ secrets.BAZEL_REMOTE_CACHE_URL }}
run: |
bazel build --remote_http_cache=$BAZEL_REMOTE_CACHE_URL --google_credentials=./config/oppia-dev-workflow-remote-cache-credentials.json -- //:oppia_kitkat
- name: Build Oppia binary KitKat (without caching, or on a fork)
if: ${{ env.ENABLE_CACHING == 'false' || github.event.pull_request.head.repo.full_name != 'oppia/oppia-android' }}
run: |
bazel build -- //:oppia_kitkat
- name: Copy Oppia dev APKs for uploading
run: |
cp $GITHUB_WORKSPACE/bazel-bin/oppia.apk /home/runner/work/oppia-android/oppia-android/
cp $GITHUB_WORKSPACE/bazel-bin/oppia_kitkat.apk /home/runner/work/oppia-android/oppia-android/
- uses: actions/upload-artifact@v2
with:
name: oppia-bazel.apk
path: /home/runner/work/oppia-android/oppia-android/oppia.apk

- uses: actions/upload-artifact@v2
with:
name: oppia-bazel-kitkat.apk
path: /home/runner/work/oppia-android/oppia-android/oppia_kitkat.apk

build_oppia_dev_aab:
name: Build Oppia AAB (developer flavor)
name: Build Oppia AAB (developer flavors)
runs-on: ${{ matrix.os }}
strategy:
matrix:
Expand Down Expand Up @@ -259,16 +281,36 @@ jobs:
run: |
bazel build -- //:oppia_dev
- name: Copy Oppia APK for uploading
run: cp $GITHUB_WORKSPACE/bazel-bin/oppia_dev.aab /home/runner/work/oppia-android/oppia-android/
# Note that caching only works on non-forks.
- name: Build Oppia developer KitKat AAB (with caching, non-fork only)
if: ${{ env.ENABLE_CACHING == 'true' && github.event.pull_request.head.repo.full_name == 'oppia/oppia-android' }}
env:
BAZEL_REMOTE_CACHE_URL: ${{ secrets.BAZEL_REMOTE_CACHE_URL }}
run: |
bazel build --remote_http_cache=$BAZEL_REMOTE_CACHE_URL --google_credentials=./config/oppia-dev-workflow-remote-cache-credentials.json -- //:oppia_dev_kitkat
- name: Build Oppia developer KitKat AAB (without caching, or on a fork)
if: ${{ env.ENABLE_CACHING == 'false' || github.event.pull_request.head.repo.full_name != 'oppia/oppia-android' }}
run: |
bazel build -- //:oppia_dev_kitkat
- name: Copy Oppia developer AABs for uploading
run: |
cp $GITHUB_WORKSPACE/bazel-bin/oppia_dev.aab /home/runner/work/oppia-android/oppia-android/
cp $GITHUB_WORKSPACE/bazel-bin/oppia_dev_kitkat.aab /home/runner/work/oppia-android/oppia-android/
- uses: actions/upload-artifact@v2
with:
name: oppia_dev.aab
path: /home/runner/work/oppia-android/oppia-android/oppia_dev.aab

- uses: actions/upload-artifact@v2
with:
name: oppia_dev_kitkat.aab
path: /home/runner/work/oppia-android/oppia-android/oppia_dev_kitkat.aab

build_oppia_alpha_aab:
name: Build Oppia AAB (alpha flavor)
name: Build Oppia AAB (alpha flavors)
runs-on: ${{ matrix.os }}
strategy:
matrix:
Expand Down Expand Up @@ -388,10 +430,30 @@ jobs:
run: |
bazel build --compilation_mode=opt -- //:oppia_alpha
- name: Copy Oppia APK for uploading
run: cp $GITHUB_WORKSPACE/bazel-bin/oppia_alpha.aab /home/runner/work/oppia-android/oppia-android/
# Note that caching only works on non-forks.
- name: Build Oppia alpha KitKat AAB (with caching, non-fork only)
if: ${{ env.ENABLE_CACHING == 'true' && github.event.pull_request.head.repo.full_name == 'oppia/oppia-android' }}
env:
BAZEL_REMOTE_CACHE_URL: ${{ secrets.BAZEL_REMOTE_CACHE_URL }}
run: |
bazel build --compilation_mode=opt --remote_http_cache=$BAZEL_REMOTE_CACHE_URL --google_credentials=./config/oppia-dev-workflow-remote-cache-credentials.json -- //:oppia_alpha_kitkat
- name: Build Oppia alpha KitKat AAB (without caching, or on a fork)
if: ${{ env.ENABLE_CACHING == 'false' || github.event.pull_request.head.repo.full_name != 'oppia/oppia-android' }}
run: |
bazel build --compilation_mode=opt -- //:oppia_alpha_kitkat
- name: Copy Oppia alpha AABs for uploading
run: |
cp $GITHUB_WORKSPACE/bazel-bin/oppia_alpha.aab /home/runner/work/oppia-android/oppia-android/
cp $GITHUB_WORKSPACE/bazel-bin/oppia_alpha_kitkat.aab /home/runner/work/oppia-android/oppia-android/
- uses: actions/upload-artifact@v2
with:
name: oppia_alpha.aab
path: /home/runner/work/oppia-android/oppia-android/oppia_alpha.aab

- uses: actions/upload-artifact@v2
with:
name: oppia_alpha_kitkat.aab
path: /home/runner/work/oppia-android/oppia-android/oppia_alpha_kitkat.aab
80 changes: 61 additions & 19 deletions BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# TODO(#1532): Rename file to 'BUILD' post-Gradle.

load("//:build_flavors.bzl", "AVAILABLE_FLAVORS", "define_oppia_binary_flavor")
load("//:build_flavors.bzl", "AVAILABLE_FLAVORS", "define_oppia_aab_binary_flavor", "transform_android_manifest")
load("//:version.bzl", "MAJOR_VERSION", "MINOR_VERSION", "OPPIA_DEV_KITKAT_VERSION_CODE", "OPPIA_DEV_VERSION_CODE")

# This is exported here since config/ isn't a Bazel package.
exports_files(["config/kitkat_main_dex_class_list.txt"])

# Corresponds to being accessible to all Oppia targets. This should be used for production APIs &
# modules that may be used both in production targets and in tests.
Expand Down Expand Up @@ -68,28 +72,66 @@ package_group(
)

# TODO(#1640): Move binary manifest to top-level package post-Gradle.
android_binary(
name = "oppia",
custom_package = "org.oppia.android",
enable_data_binding = True,
manifest = "//app:src/main/AndroidManifest.xml",
manifest_values = {
"applicationId": "org.oppia.android",
"minSdkVersion": "19",
"targetSdkVersion": "29",
"versionCode": "0",
"versionName": "0.1-alpha",
},
multidex = "native",
deps = [
"//app",
],
)
[
transform_android_manifest(
name = "oppia_apk_%s_transformed_manifest" % apk_flavor_metadata["flavor"],
build_flavor = apk_flavor_metadata["flavor"],
input_file = "//app:src/main/AndroidManifest.xml",
major_version = MAJOR_VERSION,
minor_version = MINOR_VERSION,
output_file = "AndroidManifest_transformed_%s.xml" % apk_flavor_metadata["flavor"],
version_code = apk_flavor_metadata["version_code"],
)
for apk_flavor_metadata in [
{
"flavor": "oppia",
"version_code": OPPIA_DEV_VERSION_CODE,
},
{
"flavor": "oppia_kitkat",
"version_code": OPPIA_DEV_KITKAT_VERSION_CODE,
},
]
]

[
android_binary(
name = apk_flavor_metadata["flavor"],
custom_package = "org.oppia.android",
enable_data_binding = True,
main_dex_list = apk_flavor_metadata.get("main_dex_list"),
manifest = "oppia_apk_%s_transformed_manifest" % apk_flavor_metadata["flavor"],
manifest_values = {
"applicationId": "org.oppia.android",
"minSdkVersion": "%d" % apk_flavor_metadata["min_sdk_version"],
"targetSdkVersion": "%d" % apk_flavor_metadata["target_sdk_version"],
},
multidex = apk_flavor_metadata["multidex"],
deps = [
"//app",
],
)
for apk_flavor_metadata in [
{
"flavor": "oppia",
"min_sdk_version": 21,
"multidex": "native",
"target_sdk_version": 29,
},
{
"flavor": "oppia_kitkat",
"main_dex_list": "//:config/kitkat_main_dex_class_list.txt",
"min_sdk_version": 19,
"multidex": "manual_main_dex",
"target_sdk_version": 29,
},
]
]

# Define all binary flavors that can be built. Note that these are AABs, not APKs, and can be
# be installed on a local device or emulator using a 'bazel run' command like so:
# bazel run //:install_oppia_dev
[
define_oppia_binary_flavor(flavor = flavor)
define_oppia_aab_binary_flavor(flavor = flavor)
for flavor in AVAILABLE_FLAVORS
]
2 changes: 1 addition & 1 deletion app/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,6 @@ android_library(
# Library for layout resource files.
android_library(
name = "databinding_resources",
srcs = BINDING_ADAPTERS,
custom_package = "org.oppia.android.app.databinding",
enable_data_binding = True,
exports_manifest = True,
Expand Down Expand Up @@ -685,6 +684,7 @@ android_library(
"//third_party:androidx_lifecycle_lifecycle-livedata-ktx",
"//third_party:circularimageview_circular_image_view",
"//third_party:com_google_android_material_material",
"//third_party:de_hdodenhof_circleimageview",
"//third_party:io_github_chaosleung_pinview",
"//utility",
"//utility/src/main/java/org/oppia/android/util/system:oppia_clock",
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<!-- TODO(#56): Reenable landscape support. -->
<application
android:name=".app.application.OppiaApplication"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package org.oppia.android.app.application

import android.annotation.SuppressLint
import android.app.Application
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.multidex.MultiDexApplication
import androidx.work.Configuration
import androidx.work.WorkManager
Expand Down Expand Up @@ -29,8 +32,17 @@ class OppiaApplication :

override fun getApplicationInjector(): ApplicationInjector = component

@SuppressLint("ObsoleteSdkInt") // Incorrect warning.
override fun onCreate() {
super.onCreate()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// Ensure vector drawables can be properly loaded on KitKat devices. Note that this can
// introduce memory issues, but it's an easier-to-maintain solution that replacing all image
// binding with custom hook-ins (especially when it comes to databinding which isn't
// configurable in how it loads drawables), or building a custom vector drawable->PNG pipeline
// in Bazel.
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
}
FirebaseApp.initializeApp(applicationContext)
WorkManager.initialize(applicationContext, workManagerConfiguration)
component.getApplicationStartupListeners().forEach(ApplicationStartupListener::onCreate)
Expand Down

0 comments on commit 9bf7365

Please sign in to comment.