diff options
author | 2022-04-26 14:51:24 +0000 | |
---|---|---|
committer | 2022-04-28 22:01:08 +0000 | |
commit | f248074fb47428c11af0754b9a73eaa206c215cb (patch) | |
tree | 8b8ce9f65061fc7d07356a6a2da5ee9b0ca9d4aa | |
parent | 85875a83501d3bdc551cbddcecc26bab4617b06a (diff) |
Implementation of 'aapt2 apkinfo' command.
Bug: b/228950123
Test: Dump_test.cpp, ApkInfo_test.cpp
Change-Id: Ibc63d826df5b7e83a1e61560a2d2fcad471c128d
-rw-r--r-- | tools/aapt2/Android.bp | 1 | ||||
-rw-r--r-- | tools/aapt2/Main.cpp | 5 | ||||
-rw-r--r-- | tools/aapt2/cmd/ApkInfo.cpp | 94 | ||||
-rw-r--r-- | tools/aapt2/cmd/ApkInfo.h | 49 | ||||
-rw-r--r-- | tools/aapt2/cmd/ApkInfo_test.cpp | 83 | ||||
-rw-r--r-- | tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt | 165 | ||||
-rw-r--r-- | tools/aapt2/integration-tests/DumpTest/components_full_proto.txt | 2310 |
7 files changed, 2705 insertions, 2 deletions
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index 51694c0556dd..cee3e5ca5da7 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -24,6 +24,7 @@ package { } toolSources = [ + "cmd/ApkInfo.cpp", "cmd/Command.cpp", "cmd/Compile.cpp", "cmd/Convert.cpp", diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp index b249c6c128e1..e47bd67c4b8d 100644 --- a/tools/aapt2/Main.cpp +++ b/tools/aapt2/Main.cpp @@ -24,11 +24,11 @@ #include <iostream> #include <vector> +#include "Diagnostics.h" #include "android-base/stringprintf.h" #include "android-base/utf8.h" #include "androidfw/StringPiece.h" - -#include "Diagnostics.h" +#include "cmd/ApkInfo.h" #include "cmd/Command.h" #include "cmd/Compile.h" #include "cmd/Convert.h" @@ -72,6 +72,7 @@ class MainCommand : public Command { AddOptionalSubcommand(util::make_unique<OptimizeCommand>()); AddOptionalSubcommand(util::make_unique<ConvertCommand>()); AddOptionalSubcommand(util::make_unique<VersionCommand>()); + AddOptionalSubcommand(util::make_unique<ApkInfoCommand>(diagnostics)); } int Action(const std::vector<std::string>& args) override { diff --git a/tools/aapt2/cmd/ApkInfo.cpp b/tools/aapt2/cmd/ApkInfo.cpp new file mode 100644 index 000000000000..7c9df4c64d95 --- /dev/null +++ b/tools/aapt2/cmd/ApkInfo.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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. + */ + +#include "ApkInfo.h" + +#include <fcntl.h> + +#include <iostream> +#include <memory> + +#include "Diagnostics.h" +#include "LoadedApk.h" +#include "android-base/file.h" // for O_BINARY +#include "android-base/utf8.h" +#include "androidfw/StringPiece.h" +#include "dump/DumpManifest.h" +#include "format/proto/ProtoSerialize.h" + +using ::android::StringPiece; + +namespace aapt { + +int ExportApkInfo(LoadedApk* apk, bool include_resource_table, + const std::unordered_set<std::string>& xml_resources, pb::ApkInfo* out_apk_info, + IDiagnostics* diag) { + auto result = DumpBadgingProto(apk, out_apk_info->mutable_badging(), diag); + if (result != 0) { + return result; + } + + if (include_resource_table) { + SerializeTableToPb(*apk->GetResourceTable(), out_apk_info->mutable_resource_table(), diag); + } + + for (auto& xml_resource : xml_resources) { + auto xml = apk->LoadXml(xml_resource, diag); + if (xml) { + auto out_xml = out_apk_info->add_xml_files(); + out_xml->set_path(xml_resource); + SerializeXmlResourceToPb(*xml, out_xml->mutable_root(), + {/* remove_empty_text_nodes= */ true}); + } + } + + return 0; +} + +int ApkInfoCommand::Action(const std::vector<std::string>& args) { + if (args.size() != 1) { + std::cerr << "must supply a single APK\n"; + Usage(&std::cerr); + return 1; + } + const StringPiece& path = args[0]; + std::unique_ptr<LoadedApk> apk = LoadedApk::LoadApkFromPath(path, diag_); + if (!apk) { + return 1; + } + + pb::ApkInfo out_apk_info; + int result = + ExportApkInfo(apk.get(), include_resource_table_, xml_resources_, &out_apk_info, diag_); + if (result != 0) { + diag_->Error(DiagMessage() << "Failed to serialize ApkInfo into proto."); + return result; + } + + int mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; + int outfd = ::android::base::utf8::open(output_path_.c_str(), mode, 0666); + if (outfd == -1) { + diag_->Error(DiagMessage() << "Failed to open output file."); + return 1; + } + + bool is_serialized = out_apk_info.SerializeToFileDescriptor(outfd); + close(outfd); + + return is_serialized ? 0 : 1; +} + +} // namespace aapt
\ No newline at end of file diff --git a/tools/aapt2/cmd/ApkInfo.h b/tools/aapt2/cmd/ApkInfo.h new file mode 100644 index 000000000000..d682678ffe8a --- /dev/null +++ b/tools/aapt2/cmd/ApkInfo.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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. + */ + +#ifndef AAPT2_APKINFO_H +#define AAPT2_APKINFO_H + +#include "Command.h" +#include "Diagnostics.h" + +namespace aapt { + +class ApkInfoCommand : public Command { + public: + explicit ApkInfoCommand(IDiagnostics* diag) : Command("apkinfo"), diag_(diag) { + SetDescription("Dump information about an APK in binary proto format."); + AddRequiredFlag("-o", "Output path", &output_path_, Command::kPath); + AddOptionalSwitch("--include-resource-table", "Include the resource table data into output.", + &include_resource_table_); + AddOptionalFlagList("--include-xml", + "Include an XML file content into output. Multiple XML files might be " + "requested during single invocation.", + &xml_resources_); + } + + int Action(const std::vector<std::string>& args) override; + + private: + IDiagnostics* diag_; + std::string output_path_; + bool include_resource_table_ = false; + std::unordered_set<std::string> xml_resources_; +}; + +} // namespace aapt + +#endif // AAPT2_APKINFO_H diff --git a/tools/aapt2/cmd/ApkInfo_test.cpp b/tools/aapt2/cmd/ApkInfo_test.cpp new file mode 100644 index 000000000000..70539c08d67b --- /dev/null +++ b/tools/aapt2/cmd/ApkInfo_test.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * 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. + */ + +#include "ApkInfo.h" + +#include "ApkInfo.pb.h" +#include "LoadedApk.h" +#include "android-base/unique_fd.h" +#include "io/StringStream.h" +#include "test/Test.h" + +using testing::Eq; +using testing::Ne; + +namespace aapt { + +using ApkInfoTest = CommandTestFixture; + +void AssertProducedAndExpectedInfo(const std::string& produced_path, + const std::string& expected_path) { + android::base::unique_fd fd(open(produced_path.c_str(), O_RDONLY)); + ASSERT_NE(fd.get(), -1); + + pb::ApkInfo produced_apk_info; + produced_apk_info.ParseFromFileDescriptor(fd.get()); + + std::string expected; + ::android::base::ReadFileToString(expected_path, &expected); + + EXPECT_EQ(produced_apk_info.DebugString(), expected); +} + +class NoopDiagnostics : public IDiagnostics { + public: + void Log(Level level, DiagMessageActual& actualMsg) override { + } +}; +static NoopDiagnostics noop_diag; + +TEST_F(ApkInfoTest, ApkInfoWithBadging) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"}); + auto out_info_path = GetTestPath("apk_info.pb"); + + ApkInfoCommand command(&noop_diag); + command.Execute({"-o", out_info_path, apk_path}, &std::cerr); + + auto expected_path = + file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", + "components_expected_proto.txt"}); + AssertProducedAndExpectedInfo(out_info_path, expected_path); +} + +TEST_F(ApkInfoTest, FullApkInfo) { + auto apk_path = file::BuildPath( + {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"}); + auto out_info_path = GetTestPath("apk_info.pb"); + + ApkInfoCommand command(&noop_diag); + command.Execute({"-o", out_info_path, "--include-resource-table", "--include-xml", + "AndroidManifest.xml", "--include-xml", "res/oy.xml", apk_path}, + &std::cerr); + + auto expected_path = + file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", + "components_full_proto.txt"}); + AssertProducedAndExpectedInfo(out_info_path, expected_path); +} + +} // namespace aapt
\ No newline at end of file diff --git a/tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt b/tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt new file mode 100644 index 000000000000..775641054c06 --- /dev/null +++ b/tools/aapt2/integration-tests/DumpTest/components_expected_proto.txt @@ -0,0 +1,165 @@ +badging { + package { + package: "com.example.bundletool.minimal" + version_code: 1 + version_name: "1.0" + platform_version_name: "12" + platform_version_code: "31" + compile_sdk_version: 31 + compile_sdk_version_codename: "12" + } + application { + label: "minimal" + icon: "res/uF.xml" + density_icons { + key: 160 + value: "res/uF.xml" + } + density_icons { + key: 240 + value: "res/uF.xml" + } + density_icons { + key: 320 + value: "res/uF.xml" + } + density_icons { + key: 480 + value: "res/uF.xml" + } + density_icons { + key: 640 + value: "res/uF.xml" + } + density_icons { + key: 65534 + value: "res/uF.xml" + } + } + uses_sdk { + min_sdk_version: 21 + target_sdk_version: 31 + } + uses_configuration { + req_touch_screen: 3 + req_keyboard_type: 2 + req_hard_keyboard: -1 + req_navigation: 3 + req_five_way_nav: -1 + } + supports_screen { + screens: NORMAL + screens: LARGE + screens: XLARGE + supports_any_densities: true + requires_smallest_width_dp: 240 + compatible_width_limit_dp: 360 + largest_width_limit_dp: 480 + } + launchable_activity { + name: "com.example.bundletool.minimal.MainActivity" + label: "minimal" + } + compatible_screens { + screens { + size: 500 + density: 240 + } + screens { + size: 400 + density: 160 + } + } + architectures { + architectures: "x86_64" + alt_architectures: "x86" + } + supports_gl_texture { + name: "GL_OES_compressed_paletted_texture" + } + components { + main: true + other_receivers: true + other_services: true + provided_components: "app-widget" + provided_components: "device-admin" + provided_components: "ime" + provided_components: "wallpaper" + provided_components: "accessibility" + provided_components: "print-service" + provided_components: "search" + provided_components: "document-provider" + provided_components: "notification-listener" + provided_components: "dream" + provided_components: "camera" + provided_components: "camera-secure" + } + densities: 160 + densities: 240 + densities: 320 + densities: 480 + densities: 640 + densities: 65534 + feature_groups { + features { + name: "android.hardware.bluetooth" + required: true + } + features { + name: "android.hardware.camera" + required: true + } + features { + name: "android.hardware.faketouch" + implied_data { + reasons: "default feature for all apps" + } + } + features { + name: "android.hardware.telephony" + implied_data { + from_sdk_23_permission: true + reasons: "requested a telephony permission" + } + } + } + uses_permissions { + name: "android.permission.BIND_ACCESSIBILITY_SERVICE" + max_sdk_version: 24 + required: true + } + uses_permissions { + name: "android.permission.RECEIVE_SMS" + sdk23_and_above: true + } + uses_permissions { + name: "android.permission.WRITE_EXTERNAL_STORAGE" + required: true + } + uses_permissions { + name: "android.permission.READ_EXTERNAL_STORAGE" + required: true + implied: true + } + permissions { + name: "minimal.FIRST_PERMISSION" + } + uses_libraries { + name: "mylib1" + required: true + } + uses_libraries { + name: "my_optional_lib" + } + uses_native_libraries { + name: "native1" + required: true + } + uses_native_libraries { + name: "optional" + } + metadata { + name: "android.nfc.cardemulation.host_apdu_service" + resource_string: "res/dU.xml" + } +} diff --git a/tools/aapt2/integration-tests/DumpTest/components_full_proto.txt b/tools/aapt2/integration-tests/DumpTest/components_full_proto.txt new file mode 100644 index 000000000000..bd7673616ddc --- /dev/null +++ b/tools/aapt2/integration-tests/DumpTest/components_full_proto.txt @@ -0,0 +1,2310 @@ +badging { + package { + package: "com.example.bundletool.minimal" + version_code: 1 + version_name: "1.0" + platform_version_name: "12" + platform_version_code: "31" + compile_sdk_version: 31 + compile_sdk_version_codename: "12" + } + application { + label: "minimal" + icon: "res/uF.xml" + density_icons { + key: 160 + value: "res/uF.xml" + } + density_icons { + key: 240 + value: "res/uF.xml" + } + density_icons { + key: 320 + value: "res/uF.xml" + } + density_icons { + key: 480 + value: "res/uF.xml" + } + density_icons { + key: 640 + value: "res/uF.xml" + } + density_icons { + key: 65534 + value: "res/uF.xml" + } + } + uses_sdk { + min_sdk_version: 21 + target_sdk_version: 31 + } + uses_configuration { + req_touch_screen: 3 + req_keyboard_type: 2 + req_hard_keyboard: -1 + req_navigation: 3 + req_five_way_nav: -1 + } + supports_screen { + screens: NORMAL + screens: LARGE + screens: XLARGE + supports_any_densities: true + requires_smallest_width_dp: 240 + compatible_width_limit_dp: 360 + largest_width_limit_dp: 480 + } + launchable_activity { + name: "com.example.bundletool.minimal.MainActivity" + label: "minimal" + } + compatible_screens { + screens { + size: 500 + density: 240 + } + screens { + size: 400 + density: 160 + } + } + architectures { + architectures: "x86_64" + alt_architectures: "x86" + } + supports_gl_texture { + name: "GL_OES_compressed_paletted_texture" + } + components { + main: true + other_receivers: true + other_services: true + provided_components: "app-widget" + provided_components: "device-admin" + provided_components: "ime" + provided_components: "wallpaper" + provided_components: "accessibility" + provided_components: "print-service" + provided_components: "search" + provided_components: "document-provider" + provided_components: "notification-listener" + provided_components: "dream" + provided_components: "camera" + provided_components: "camera-secure" + } + densities: 160 + densities: 240 + densities: 320 + densities: 480 + densities: 640 + densities: 65534 + feature_groups { + features { + name: "android.hardware.bluetooth" + required: true + } + features { + name: "android.hardware.camera" + required: true + } + features { + name: "android.hardware.faketouch" + implied_data { + reasons: "default feature for all apps" + } + } + features { + name: "android.hardware.telephony" + implied_data { + from_sdk_23_permission: true + reasons: "requested a telephony permission" + } + } + } + uses_permissions { + name: "android.permission.BIND_ACCESSIBILITY_SERVICE" + max_sdk_version: 24 + required: true + } + uses_permissions { + name: "android.permission.RECEIVE_SMS" + sdk23_and_above: true + } + uses_permissions { + name: "android.permission.WRITE_EXTERNAL_STORAGE" + required: true + } + uses_permissions { + name: "android.permission.READ_EXTERNAL_STORAGE" + required: true + implied: true + } + permissions { + name: "minimal.FIRST_PERMISSION" + } + uses_libraries { + name: "mylib1" + required: true + } + uses_libraries { + name: "my_optional_lib" + } + uses_native_libraries { + name: "native1" + required: true + } + uses_native_libraries { + name: "optional" + } + metadata { + name: "android.nfc.cardemulation.host_apdu_service" + resource_string: "res/dU.xml" + } +} +resource_table { + source_pool { + data: "\001\000\034\000$\000\000\000\001\000\000\000\000\000\000\000\000\001\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + } + package { + package_id { + id: 127 + } + package_name: "com.example.bundletool.minimal" + type { + type_id { + id: 1 + } + name: "color" + entry { + entry_id { + } + name: "black" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4278190080 + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "purple_200" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4290479868 + } + } + } + } + } + entry { + entry_id { + id: 2 + } + name: "purple_500" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4284612846 + } + } + } + } + } + entry { + entry_id { + id: 3 + } + name: "purple_700" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4281794739 + } + } + } + } + } + entry { + entry_id { + id: 4 + } + name: "teal_200" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4278442693 + } + } + } + } + } + entry { + entry_id { + id: 5 + } + name: "teal_700" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4278290310 + } + } + } + } + } + entry { + entry_id { + id: 6 + } + name: "white" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + color_argb8_value: 4294967295 + } + } + } + } + } + } + type { + type_id { + id: 2 + } + name: "dimen" + entry { + entry_id { + } + name: "fab_margin" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + prim { + dimension_value: 4097 + } + } + } + } + } + } + type { + type_id { + id: 3 + } + name: "drawable" + entry { + entry_id { + } + name: "$ic_launcher_foreground__0" + visibility { + source { + } + } + config_value { + config { + density: 65534 + sdk_version: 24 + } + value { + source { + } + item { + file { + path: "res/Za.xml" + type: BINARY_XML + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "ic_launcher_background" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + file { + path: "res/3N.xml" + type: BINARY_XML + } + } + } + } + } + entry { + entry_id { + id: 2 + } + name: "ic_launcher_foreground" + visibility { + source { + } + } + config_value { + config { + density: 65534 + sdk_version: 24 + } + value { + source { + } + item { + file { + path: "res/qm.xml" + type: BINARY_XML + } + } + } + } + } + } + type { + type_id { + id: 4 + } + name: "mipmap" + entry { + entry_id { + } + name: "ic_launcher" + visibility { + source { + } + } + config_value { + config { + density: 160 + } + value { + source { + } + item { + file { + path: "res/u3.png" + type: PNG + } + } + } + } + config_value { + config { + density: 240 + } + value { + source { + } + item { + file { + path: "res/SD.png" + type: PNG + } + } + } + } + config_value { + config { + density: 320 + } + value { + source { + } + item { + file { + path: "res/jy.png" + type: PNG + } + } + } + } + config_value { + config { + density: 480 + } + value { + source { + } + item { + file { + path: "res/D2.png" + type: PNG + } + } + } + } + config_value { + config { + density: 640 + } + value { + source { + } + item { + file { + path: "res/CG.png" + type: PNG + } + } + } + } + config_value { + config { + density: 65534 + sdk_version: 26 + } + value { + source { + } + item { + file { + path: "res/uF.xml" + type: BINARY_XML + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "ic_launcher_round" + visibility { + source { + } + } + config_value { + config { + density: 160 + } + value { + source { + } + item { + file { + path: "res/7c.png" + type: PNG + } + } + } + } + config_value { + config { + density: 240 + } + value { + source { + } + item { + file { + path: "res/tf.png" + type: PNG + } + } + } + } + config_value { + config { + density: 320 + } + value { + source { + } + item { + file { + path: "res/1S.png" + type: PNG + } + } + } + } + config_value { + config { + density: 480 + } + value { + source { + } + item { + file { + path: "res/5Q.png" + type: PNG + } + } + } + } + config_value { + config { + density: 640 + } + value { + source { + } + item { + file { + path: "res/C9.png" + type: PNG + } + } + } + } + config_value { + config { + density: 65534 + sdk_version: 26 + } + value { + source { + } + item { + file { + path: "res/oy.xml" + type: BINARY_XML + } + } + } + } + } + } + type { + type_id { + id: 5 + } + name: "string" + entry { + entry_id { + } + name: "action_settings" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Settings" + } + } + } + } + } + entry { + entry_id { + id: 1 + } + name: "app_name" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "minimal" + } + } + } + } + } + entry { + entry_id { + id: 2 + } + name: "first_fragment_label" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "First Fragment" + } + } + } + } + } + entry { + entry_id { + id: 3 + } + name: "hello_first_fragment" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Hello first fragment" + } + } + } + } + } + entry { + entry_id { + id: 4 + } + name: "hello_second_fragment" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Hello second fragment. Arg: %1$s" + } + } + } + } + } + entry { + entry_id { + id: 5 + } + name: "next" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Next" + } + } + } + } + } + entry { + entry_id { + id: 6 + } + name: "previous" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Previous" + } + } + } + } + } + entry { + entry_id { + id: 7 + } + name: "second_fragment_label" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + str { + value: "Second Fragment" + } + } + } + } + } + } + type { + type_id { + id: 6 + } + name: "xml" + entry { + entry_id { + } + name: "apduservice" + visibility { + source { + } + } + config_value { + config { + } + value { + source { + } + item { + file { + path: "res/dU.xml" + type: BINARY_XML + } + } + } + } + } + } + } + tool_fingerprint { + tool: "Android Asset Packaging Tool (aapt)" + version: "2.19-SOONG BUILD NUMBER PLACEHOLDER" + } +} +xml_files { + path: "res/oy.xml" + root { + element { + namespace_declaration { + prefix: "android" + uri: "http://schemas.android.com/apk/res/android" + source { + line_number: 2 + } + } + name: "adaptive-icon" + child { + element { + name: "background" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "drawable" + source { + } + resource_id: 16843161 + compiled_item { + ref { + id: 2130903041 + } + } + } + } + source { + line_number: 3 + } + } + child { + element { + name: "foreground" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "drawable" + source { + } + resource_id: 16843161 + compiled_item { + ref { + id: 2130903042 + } + } + } + } + source { + line_number: 4 + } + } + } + source { + line_number: 2 + } + } +} +xml_files { + path: "AndroidManifest.xml" + root { + element { + namespace_declaration { + prefix: "android" + uri: "http://schemas.android.com/apk/res/android" + source { + line_number: 2 + } + } + name: "manifest" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "versionCode" + source { + } + resource_id: 16843291 + compiled_item { + prim { + int_decimal_value: 1 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "versionName" + value: "1.0" + resource_id: 16843292 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "compileSdkVersion" + source { + } + resource_id: 16844146 + compiled_item { + prim { + int_decimal_value: 31 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "compileSdkVersionCodename" + value: "12" + resource_id: 16844147 + } + attribute { + name: "package" + value: "com.example.bundletool.minimal" + } + attribute { + name: "platformBuildVersionCode" + source { + } + compiled_item { + prim { + int_decimal_value: 31 + } + } + } + attribute { + name: "platformBuildVersionName" + source { + } + compiled_item { + prim { + int_decimal_value: 12 + } + } + } + child { + element { + name: "uses-sdk" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "minSdkVersion" + source { + } + resource_id: 16843276 + compiled_item { + prim { + int_decimal_value: 21 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "targetSdkVersion" + source { + } + resource_id: 16843376 + compiled_item { + prim { + int_decimal_value: 31 + } + } + } + } + source { + line_number: 7 + } + } + child { + element { + name: "supports-screens" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "anyDensity" + source { + } + resource_id: 16843372 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "smallScreens" + source { + } + resource_id: 16843396 + compiled_item { + prim { + boolean_value: false + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "normalScreens" + source { + } + resource_id: 16843397 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "largeScreens" + source { + } + resource_id: 16843398 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "requiresSmallestWidthDp" + source { + } + resource_id: 16843620 + compiled_item { + prim { + int_decimal_value: 240 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "compatibleWidthLimitDp" + source { + } + resource_id: 16843621 + compiled_item { + prim { + int_decimal_value: 360 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "largestWidthLimitDp" + source { + } + resource_id: 16843622 + compiled_item { + prim { + int_decimal_value: 480 + } + } + } + } + source { + line_number: 11 + } + } + child { + element { + name: "uses-configuration" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqTouchScreen" + source { + } + resource_id: 16843303 + compiled_item { + prim { + int_decimal_value: 3 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqKeyboardType" + source { + } + resource_id: 16843304 + compiled_item { + prim { + int_decimal_value: 2 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqHardKeyboard" + source { + } + resource_id: 16843305 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqNavigation" + source { + } + resource_id: 16843306 + compiled_item { + prim { + int_decimal_value: 3 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "reqFiveWayNav" + source { + } + resource_id: 16843314 + compiled_item { + prim { + boolean_value: true + } + } + } + } + source { + line_number: 20 + } + } + child { + element { + name: "supports-gl-texture" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "GL_OES_compressed_paletted_texture" + resource_id: 16842755 + } + } + source { + line_number: 27 + } + } + child { + element { + name: "permission" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "minimal.FIRST_PERMISSION" + resource_id: 16842755 + } + } + source { + line_number: 29 + } + } + child { + element { + name: "uses-feature" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.hardware.camera" + resource_id: 16842755 + } + } + source { + line_number: 31 + } + } + child { + element { + name: "uses-feature" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.hardware.bluetooth" + resource_id: 16842755 + } + } + source { + line_number: 32 + } + } + child { + element { + name: "uses-permission" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.permission.BIND_ACCESSIBILITY_SERVICE" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "maxSdkVersion" + source { + } + resource_id: 16843377 + compiled_item { + prim { + int_decimal_value: 24 + } + } + } + } + source { + line_number: 34 + } + } + child { + element { + name: "uses-permission-sdk-23" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.permission.RECEIVE_SMS" + resource_id: 16842755 + } + } + source { + line_number: 38 + } + } + child { + element { + name: "uses-permission" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.permission.WRITE_EXTERNAL_STORAGE" + resource_id: 16842755 + } + } + source { + line_number: 40 + } + } + child { + element { + name: "compatible-screens" + child { + element { + name: "screen" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenSize" + source { + } + resource_id: 16843466 + compiled_item { + prim { + int_decimal_value: 500 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenDensity" + source { + } + resource_id: 16843467 + compiled_item { + prim { + int_decimal_value: 240 + } + } + } + } + source { + line_number: 43 + } + } + child { + element { + name: "screen" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenSize" + source { + } + resource_id: 16843466 + compiled_item { + prim { + int_decimal_value: 400 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "screenDensity" + source { + } + resource_id: 16843467 + compiled_item { + prim { + int_decimal_value: 160 + } + } + } + } + source { + line_number: 46 + } + } + } + source { + line_number: 42 + } + } + child { + element { + name: "application" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "label" + source { + } + resource_id: 16842753 + compiled_item { + ref { + id: 2131034113 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "icon" + source { + } + resource_id: 16842754 + compiled_item { + ref { + id: 2130968576 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "allowBackup" + source { + } + resource_id: 16843392 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "supportsRtl" + source { + } + resource_id: 16843695 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "multiArch" + source { + } + resource_id: 16843918 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "roundIcon" + source { + } + resource_id: 16844076 + compiled_item { + ref { + id: 2130968577 + } + } + } + child { + element { + name: "uses-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "mylib1" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: true + } + } + } + } + source { + line_number: 58 + } + } + child { + element { + name: "uses-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "my_optional_lib" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: false + } + } + } + } + source { + line_number: 61 + } + } + child { + element { + name: "uses-native-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "native1" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: true + } + } + } + } + source { + line_number: 65 + } + } + child { + element { + name: "uses-native-library" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "optional" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "required" + source { + } + resource_id: 16843406 + compiled_item { + prim { + boolean_value: false + } + } + } + } + source { + line_number: 68 + } + } + child { + element { + name: "activity" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "label" + source { + } + resource_id: 16842753 + compiled_item { + ref { + id: 2131034113 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.MainActivity" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.MAIN" + resource_id: 16842755 + } + } + source { + line_number: 77 + } + } + child { + element { + name: "category" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.category.LAUNCHER" + resource_id: 16842755 + } + } + source { + line_number: 79 + } + } + } + source { + line_number: 76 + } + } + } + source { + line_number: 72 + } + } + child { + element { + name: "activity" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "label" + source { + } + resource_id: 16842753 + compiled_item { + ref { + id: 2131034113 + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.AnotherActivity" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.VIDEO_CAMERA" + resource_id: 16842755 + } + } + source { + line_number: 87 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.STILL_IMAGE_CAMERA_SECURE" + resource_id: 16842755 + } + } + source { + line_number: 88 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.intent.action.SEARCH" + resource_id: 16842755 + } + } + source { + line_number: 89 + } + } + } + source { + line_number: 86 + } + } + } + source { + line_number: 82 + } + } + child { + element { + name: "receiver" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.OneReceiver" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.appwidget.action.APPWIDGET_UPDATE" + resource_id: 16842755 + } + } + source { + line_number: 97 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.app.action.DEVICE_ADMIN_ENABLED" + resource_id: 16842755 + } + } + source { + line_number: 98 + } + } + } + source { + line_number: 96 + } + } + } + source { + line_number: 93 + } + } + child { + element { + name: "receiver" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.TwoReceiver" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_DEVICE_ADMIN" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.app.action.DEVICE_ADMIN_ENABLED" + resource_id: 16842755 + } + } + source { + line_number: 106 + } + } + } + source { + line_number: 105 + } + } + } + source { + line_number: 101 + } + } + child { + element { + name: "receiver" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.ThreeReceiver" + resource_id: 16842755 + } + } + source { + line_number: 109 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.OneService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.view.InputMethod" + resource_id: 16842755 + } + } + source { + line_number: 115 + } + } + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.service.wallpaper.WallpaperService" + resource_id: 16842755 + } + } + source { + line_number: 116 + } + } + } + source { + line_number: 114 + } + } + } + source { + line_number: 111 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$TwoService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_ACCESSIBILITY_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.accessibilityservice.AccessibilityService" + resource_id: 16842755 + } + } + source { + line_number: 124 + } + } + } + source { + line_number: 123 + } + } + } + source { + line_number: 119 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$ThreeService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_PRINT_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.printservice.PrintService" + resource_id: 16842755 + } + } + source { + line_number: 132 + } + } + } + source { + line_number: 131 + } + } + } + source { + line_number: 127 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$FourService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_NFC_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.nfc.cardemulation.action.HOST_APDU_SERVICE" + resource_id: 16842755 + } + } + source { + line_number: 140 + } + } + } + source { + line_number: 139 + } + } + child { + element { + name: "meta-data" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.nfc.cardemulation.host_apdu_service" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "resource" + source { + } + resource_id: 16842789 + compiled_item { + ref { + id: 2131099648 + } + } + } + } + source { + line_number: 143 + } + } + } + source { + line_number: 135 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$FiveService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.service.notification.NotificationListenerService" + resource_id: 16842755 + } + } + source { + line_number: 152 + } + } + } + source { + line_number: 151 + } + } + } + source { + line_number: 147 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$SixService" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.BIND_DREAM_SERVICE" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: false + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.service.dreams.DreamService" + resource_id: 16842755 + } + } + source { + line_number: 160 + } + } + } + source { + line_number: 159 + } + } + } + source { + line_number: 155 + } + } + child { + element { + name: "service" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.Services$SevenService" + resource_id: 16842755 + } + } + source { + line_number: 163 + } + } + child { + element { + name: "provider" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "com.example.bundletool.minimal.OneProvider" + resource_id: 16842755 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "permission" + value: "android.permission.MANAGE_DOCUMENTS" + resource_id: 16842758 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "exported" + source { + } + resource_id: 16842768 + compiled_item { + prim { + boolean_value: true + } + } + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "authorities" + value: "A" + resource_id: 16842776 + } + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "grantUriPermissions" + source { + } + resource_id: 16842779 + compiled_item { + prim { + boolean_value: true + } + } + } + child { + element { + name: "intent-filter" + child { + element { + name: "action" + attribute { + namespace_uri: "http://schemas.android.com/apk/res/android" + name: "name" + value: "android.content.action.DOCUMENTS_PROVIDER" + resource_id: 16842755 + } + } + source { + line_number: 172 + } + } + } + source { + line_number: 171 + } + } + } + source { + line_number: 165 + } + } + } + source { + line_number: 51 + } + } + } + source { + line_number: 2 + } + } +} |