From b5e4dbf5d2c76c5400b0c3bf96bc160c8d4beb2f Mon Sep 17 00:00:00 2001 From: Alex Humesky Date: Thu, 5 Dec 2024 15:46:05 -0500 Subject: [PATCH 1/2] test bundles --- .bazelci/presubmit.yml | 20 +++++ examples/bundle/.bazelrc | 10 +++ examples/bundle/.gitignore | 1 + examples/bundle/BUILD | 1 + examples/bundle/MODULE.bazel | 55 +++++++++++++ examples/bundle/README.md | 12 +++ examples/bundle/WORKSPACE | 73 ++++++++++++++++++ examples/bundle/WORKSPACE.bzlmod | 1 + examples/bundle/app/AndroidManifest.xml | 22 ++++++ examples/bundle/app/BUILD | 19 +++++ examples/bundle/app/BasicActivity.java | 52 +++++++++++++ .../app/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 1678 bytes .../bundle/app/res/layout/basic_activity.xml | 23 ++++++ examples/bundle/app/res/values/strings.xml | 8 ++ examples/bundle/features/assets/BUILD | 17 ++++ .../features/assets/src/AndroidManifest.xml | 13 ++++ .../bundle/features/assets/src/assets.txt | 1 + rules/android_application/BUILD | 7 -- .../android_feature_module_rule.bzl | 8 +- rules/android_application/attrs.bzl | 6 +- .../feature_module_validation.sh | 0 .../gen_priority_android_feature_manifest.sh | 0 rules/rules.bzl | 5 ++ toolchains/android/BUILD | 16 ++++ toolchains/android/toolchain.bzl | 5 ++ 25 files changed, 361 insertions(+), 14 deletions(-) create mode 100644 examples/bundle/.bazelrc create mode 100644 examples/bundle/.gitignore create mode 100644 examples/bundle/BUILD create mode 100644 examples/bundle/MODULE.bazel create mode 100644 examples/bundle/README.md create mode 100644 examples/bundle/WORKSPACE create mode 100644 examples/bundle/WORKSPACE.bzlmod create mode 100644 examples/bundle/app/AndroidManifest.xml create mode 100644 examples/bundle/app/BUILD create mode 100644 examples/bundle/app/BasicActivity.java create mode 100644 examples/bundle/app/res/drawable-hdpi/ic_launcher.png create mode 100644 examples/bundle/app/res/layout/basic_activity.xml create mode 100644 examples/bundle/app/res/values/strings.xml create mode 100644 examples/bundle/features/assets/BUILD create mode 100644 examples/bundle/features/assets/src/AndroidManifest.xml create mode 100644 examples/bundle/features/assets/src/assets.txt mode change 100644 => 100755 rules/android_application/feature_module_validation.sh mode change 100644 => 100755 rules/android_application/gen_priority_android_feature_manifest.sh diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index cd8bc4bea..3584b8e49 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -175,3 +175,23 @@ tasks: <<: *rules_flags build_targets: - "//java/com/basicapp:basic_app" + ubuntu2004_bundle: + name: "Bundle app ubuntu" + platform: ubuntu2004 + bazel: ${{ bazel }} + working_directory: examples/bundle + build_flags: + <<: *rules_flags + build_targets: + - "//app:assests" + ubuntu2004_bundle_bzlmod: + name: "Bundle app ubuntu bzlmod" + platform: ubuntu2004 + bazel: ${{ bazel }} + working_directory: examples/bundle + build_flags: + <<: *rules_flags + ? "--enable_bzlmod" + ? "--enable_workspace=false" + build_targets: + - "//app:assests" diff --git a/examples/bundle/.bazelrc b/examples/bundle/.bazelrc new file mode 100644 index 000000000..a28203e1e --- /dev/null +++ b/examples/bundle/.bazelrc @@ -0,0 +1,10 @@ +# Flags needed while the Android rules are being migrated to Starlark. +common --experimental_google_legacy_api +common --experimental_enable_android_migration_apis +common --android_sdk=@androidsdk//:sdk +common:core_library_desugaring --desugar_java8_libs + +# Flags to enable mobile-install v3 +mobile-install --mode=skylark --mobile_install_aspect=@rules_android//mobile_install:mi.bzl --mobile_install_supported_rules=android_binary +# Required to invoke the Studio deployer jar +mobile-install --tool_java_runtime_version=17 diff --git a/examples/bundle/.gitignore b/examples/bundle/.gitignore new file mode 100644 index 000000000..63f1fef0e --- /dev/null +++ b/examples/bundle/.gitignore @@ -0,0 +1 @@ +*.lock diff --git a/examples/bundle/BUILD b/examples/bundle/BUILD new file mode 100644 index 000000000..a09fce916 --- /dev/null +++ b/examples/bundle/BUILD @@ -0,0 +1 @@ +# Empty build file to satisfy gazelle for rules_go. \ No newline at end of file diff --git a/examples/bundle/MODULE.bazel b/examples/bundle/MODULE.bazel new file mode 100644 index 000000000..ef2860cd8 --- /dev/null +++ b/examples/bundle/MODULE.bazel @@ -0,0 +1,55 @@ +module( + name = "bundle", +) + +bazel_dep(name = "rules_java", version = "7.4.0") +bazel_dep(name = "bazel_skylib", version = "1.3.0") + +bazel_dep( + name = "rules_android", + version = "0.5.1", +) + +local_path_override( + module_name = "rules_android", + path = "../../", +) + +remote_android_extensions = use_extension( + "@rules_android//bzlmod_extensions:android_extensions.bzl", + "remote_android_tools_extensions") +use_repo(remote_android_extensions, "android_gmaven_r8", "android_tools") + +register_toolchains( + "@rules_android//toolchains/android:android_default_toolchain", + "@rules_android//toolchains/android_sdk:android_sdk_tools", +) + +android_sdk_repository_extension = use_extension("@rules_android//rules/android_sdk_repository:rule.bzl", "android_sdk_repository_extension") +use_repo(android_sdk_repository_extension, "androidsdk") + +register_toolchains("@androidsdk//:sdk-toolchain", "@androidsdk//:all") + +bazel_dep(name = "rules_jvm_external", version = "5.3") + +# Load the maven extension from rules_jvm_external +maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven") + +maven.install( + name = "maven", + aar_import_bzl_label = "@rules_android//rules:rules.bzl", + artifacts = [ + "com.google.guava:guava:32.1.2-android", + "com.arthenica:ffmpeg-kit-https:4.4.LTS", + ], + repositories = [ + "https://maven.google.com", + "https://repo1.maven.org/maven2", + ], + use_starlark_android_rules = True, +) +use_repo(maven, "maven") + + + + diff --git a/examples/bundle/README.md b/examples/bundle/README.md new file mode 100644 index 000000000..0d923e32d --- /dev/null +++ b/examples/bundle/README.md @@ -0,0 +1,12 @@ +To build, ensure that the `ANDROID_HOME` environment variable is set to the path +to an Android SDK, and run: + +``` +bazel build app:assets +``` + +This will build application bundle containing a dynamic feature containing assets (named assets.txt). Verify with : + +``` +jar -tf bazel-bin/app/assets_unsigned.aab | grep assets.txt +``` diff --git a/examples/bundle/WORKSPACE b/examples/bundle/WORKSPACE new file mode 100644 index 000000000..73a42c522 --- /dev/null +++ b/examples/bundle/WORKSPACE @@ -0,0 +1,73 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") + +local_repository( + name = "rules_android", + path = "../..", # rules_android's WORKSPACE relative to this inner workspace +) + +# rules_license +http_archive( + name = "rules_license", + urls = [ + "https://github.com/bazelbuild/rules_license/releases/download/1.0.0/rules_license-1.0.0.tar.gz", + ], + sha256 = "26d4021f6898e23b82ef953078389dd49ac2b5618ac564ade4ef87cced147b38", +) + +# rules_jvm_external +RULES_JVM_EXTERNAL_TAG = "6.5" +RULES_JVM_EXTERNAL_SHA = "3a4d56357851cf5b0dae538b3f3e0612a4f58925dfb3cadb2e0c4e87d51e629e" + +http_archive( + name = "rules_jvm_external", + strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, + sha256 = RULES_JVM_EXTERNAL_SHA, + url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/%s/rules_jvm_external-%s.tar.gz" % (RULES_JVM_EXTERNAL_TAG, RULES_JVM_EXTERNAL_TAG) +) + +# bazel_features +BAZEL_FEATURES_VERSION = "1.20.0" +BAZEL_FEATURES_HASH = "c2596994cf63513bd44180411a4ac3ae95d32bf59148fcb6087a4642b3ffef11" +maybe( + http_archive, + name = "bazel_features", + sha256 = BAZEL_FEATURES_HASH, + strip_prefix = "bazel_features-" + BAZEL_FEATURES_VERSION, + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v" + BAZEL_FEATURES_VERSION + "/bazel_features-v" + BAZEL_FEATURES_VERSION + ".tar.gz", +) +maybe( + http_archive, + name = "proto_bazel_features", + sha256 = BAZEL_FEATURES_HASH, + strip_prefix = "bazel_features-" + BAZEL_FEATURES_VERSION, + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v" + BAZEL_FEATURES_VERSION + "/bazel_features-v" + BAZEL_FEATURES_VERSION + ".tar.gz", +) +load("@bazel_features//:deps.bzl", "bazel_features_deps") +bazel_features_deps() + +# Skylib +http_archive( + name = "bazel_skylib", + sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f", + urls = [ + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz", + ], +) +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") +bazel_skylib_workspace() + +load("@rules_android//:prereqs.bzl", "rules_android_prereqs") +rules_android_prereqs() +load("@rules_android//:defs.bzl", "rules_android_workspace") +rules_android_workspace() + +load("@rules_android//rules:rules.bzl", "android_sdk_repository") +android_sdk_repository( + name = "androidsdk", +) + +register_toolchains( + "@rules_android//toolchains/android:android_default_toolchain", + "@rules_android//toolchains/android_sdk:android_sdk_tools", +) diff --git a/examples/bundle/WORKSPACE.bzlmod b/examples/bundle/WORKSPACE.bzlmod new file mode 100644 index 000000000..df9ed0ec9 --- /dev/null +++ b/examples/bundle/WORKSPACE.bzlmod @@ -0,0 +1 @@ +workspace(name = "bundle") diff --git a/examples/bundle/app/AndroidManifest.xml b/examples/bundle/app/AndroidManifest.xml new file mode 100644 index 000000000..1a4a7a99d --- /dev/null +++ b/examples/bundle/app/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/examples/bundle/app/BUILD b/examples/bundle/app/BUILD new file mode 100644 index 000000000..029acad09 --- /dev/null +++ b/examples/bundle/app/BUILD @@ -0,0 +1,19 @@ +load("@rules_android//android:rules.bzl", "android_application", "android_library") + +android_application( + name = "assets", + manifest_values = { + "applicationId" : "com.examples.bundle.app", + "versionCode": "0", + }, + feature_modules = ["//features/assets:feature_module"], + manifest = "AndroidManifest.xml", + deps = [":lib"], +) + +android_library( + name = "lib", + srcs = ["BasicActivity.java"], + manifest = "AndroidManifest.xml", + resource_files = glob(["res/**"]), +) diff --git a/examples/bundle/app/BasicActivity.java b/examples/bundle/app/BasicActivity.java new file mode 100644 index 000000000..7baf701e2 --- /dev/null +++ b/examples/bundle/app/BasicActivity.java @@ -0,0 +1,52 @@ +// Copyright 2022 The Bazel Authors. All rights reserved. +// +// 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. + +package com.examples.bundle.app; + +import android.app.Activity; +import android.os.Bundle; +import android.view.Menu; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +/** + * The main activity of the Basic Sample App. + */ +public class BasicActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.basic_activity); + + final Button buttons[] = { + findViewById(R.id.button_id_fizz), findViewById(R.id.button_id_buzz), + }; + + for (Button b : buttons) { + b.setOnClickListener( + new View.OnClickListener() { + public void onClick(View v) { + TextView tv = findViewById(R.id.text_hello); + if (v.getId() == R.id.button_id_fizz) { + tv.setText("fizz"); + } else if (v.getId() == R.id.button_id_buzz) { + tv.setText("buzz "); + } + } + }); + } + } +} diff --git a/examples/bundle/app/res/drawable-hdpi/ic_launcher.png b/examples/bundle/app/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab2adde210fde3d980a0d3d9c551dcf61a96a86 GIT binary patch literal 1678 zcmah|X;4#F6ux1HVzeYIQliiX5(;8?fM7r+d%|u25fNoI1eXNN0)8-br38IaEd>MkoV-GrPahB^pEDF_|w61z?*C0EH?5v=AyB13*p# z;6(xe^jZLHrS+XF0|3B1hzN<|zyQTDErkNz znl-2t_lU*4>Fh>6vw_Px%wuB0Wi{{^jU3;a6~4Ra#5@YvWCH>KG2R+T?19uCumE5J z0NI5Y1Cce>1-8H%L1V`LYCsU(iuIaBFn1>G>pepz>kgy@smhgicG zmyiE`rhoMcYL43sh~dP1O27f;vYJ5Rdh6Lp>jJ8Ef(@)TD~v;&W%aCOwSkO-oaOZ_ z%dGDSxh{kR8_TFU%j+1}5+w7nCBRj{oj`&1>~b=`18LSkV1(@_*$RZ4VzXn@$>g`8 z$mOVPcGau~F6;v96Y^XL@kGWUF4$rR0%4t*$}oLq)r33>VI2{q+W?*+;A1c3%IMl? zs7hqQut=!?@3Z$eH1xN(YZ;5d;Z}{Fv^z02)`G)96|<_vPV#wNQutY?)qgI~>I(I` zTtHsUgX?*G@qSNnS(&4O#qorg3F{ornHsMwktNl+Om}8-X!4b2Vv<~QZFir# zE<1nV)6?@Or*7mWow0U{>G66L(;DmVw4mqbH5c-`xo^CF5x=cIb$4n)cryK=ZH~XI zr>Imf7s;0#zpmUQEW1lne>l3Mu0H8$L}i281|>gm-BTW0iLY^q>?b~{B|njh(}}#A zioFaWDO%_tEED6ay-S0qsQ4<&@>qo4m?GQMRmV{g_(w`Nn0ueAm36S6-`*cvd3CBe z-lw_bKx}7DcyVs~r}V!kTlCyN37=jD8GFA9>8DhK>iQ*WaT9r@oxW?>;6$3zY={5pV8P{Q?J@l8KEXvS!J`bP zlq#m$-Q1LAVorB)l@j@T+nR#Wl}?->YWa`b%T1gF$~Gehl0oH-A}g6?MU{4E7}ZH_ zWbVrFD^ihuxaN$0Yo+L`ppcG|JV-2jVR=*dv8K01<87aA^y8m*95YDk9ru!cS(g2w zKA4g@uztE|NxZGdBx2Z^>>OFs8d3RdUDxls51)Ry@0`2qP$3%lVlyG9GONpgADVf3uKg* zXM!PRL1_hL=;GXi?_M{U4*fxL(d18?1%_wZ{BFO~i2JTdY8|MGTM%v0_=rRnP#2m8 z;i?)8$++Q{Dyz~r%I4>+?S4hi8QYg0sk6L!zO*+)!c$vlx{oUVT9NDiC=opy-ca+! zRFr$NAcKxDZWYXJgTH~ZjI&ynk|;~1CugQY1rQp7ETSQc5U(iDrF3r}I?cz8Mx)bc z=O0fA{*|y + + + +