diff options
-rw-r--r-- | cmds/installd/Android.bp | 4 | ||||
-rw-r--r-- | cmds/installd/otapreopt_chroot.cpp | 85 | ||||
-rw-r--r-- | cmds/installd/run_dex2oat.cpp | 21 | ||||
-rw-r--r-- | cmds/installd/run_dex2oat.h | 2 | ||||
-rw-r--r-- | cmds/installd/run_dex2oat_test.cpp | 24 | ||||
-rw-r--r-- | cmds/installd/tests/installd_dexopt_test.cpp | 4 | ||||
-rw-r--r-- | libs/binder/Android.bp | 37 | ||||
-rw-r--r-- | libs/binder/IBatteryStats.cpp | 2 | ||||
-rw-r--r-- | libs/binder/include_batterystats/batterystats/IBatteryStats.h (renamed from libs/binder/include/binder/IBatteryStats.h) | 0 | ||||
-rw-r--r-- | libs/binder/ndk/include_platform/android/binder_manager.h | 8 | ||||
-rw-r--r-- | libs/binder/ndk/include_platform/android/binder_stability.h | 6 | ||||
-rw-r--r-- | services/sensorservice/Android.bp | 4 | ||||
-rw-r--r-- | services/sensorservice/BatteryService.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 34 | ||||
-rw-r--r-- | services/surfaceflinger/BufferLayer.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/BufferStateLayer.cpp | 1 |
16 files changed, 115 insertions, 123 deletions
diff --git a/cmds/installd/Android.bp b/cmds/installd/Android.bp index cf23f8af08..d09d3e8689 100644 --- a/cmds/installd/Android.bp +++ b/cmds/installd/Android.bp @@ -189,8 +189,8 @@ cc_binary { "liblog", "libutils", ], - static_libs: [ - "libapexd", + required: [ + "apexd" ], } diff --git a/cmds/installd/otapreopt_chroot.cpp b/cmds/installd/otapreopt_chroot.cpp index 379cf92043..c04b558e2d 100644 --- a/cmds/installd/otapreopt_chroot.cpp +++ b/cmds/installd/otapreopt_chroot.cpp @@ -20,6 +20,7 @@ #include <sys/stat.h> #include <sys/wait.h> +#include <array> #include <fstream> #include <sstream> @@ -31,10 +32,6 @@ #include <libdm/dm.h> #include <selinux/android.h> -#include <apex_file_repository.h> -#include <apex_constants.h> -#include <apexd.h> - #include "installd_constants.h" #include "otapreopt_utils.h" @@ -64,47 +61,14 @@ static void CloseDescriptor(const char* descriptor_string) { } } -static std::vector<apex::ApexFile> ActivateApexPackages() { - // The logic here is (partially) copied and adapted from - // system/apex/apexd/apexd.cpp. - // - // Only scan the APEX directory under /system, /system_ext and /vendor (within the chroot dir). - std::vector<std::string> apex_dirs{apex::kApexPackageSystemDir, apex::kApexPackageSystemExtDir, - apex::kApexPackageVendorDir}; - // Initialize ApexFileRepository used internally in ScanPackagesDirAndActivate. - // This is a quick fix to fix apex activation in otapreopt_chroot. - apex::ApexFileRepository::GetInstance().AddPreInstalledApex(apex_dirs); - for (const auto& dir : apex_dirs) { - // Cast call to void to suppress warn_unused_result. - static_cast<void>(apex::ScanPackagesDirAndActivate(dir.c_str())); - } - return apex::GetActivePackages(); -} - -static void CreateApexInfoList(const std::vector<apex::ApexFile>& apex_files) { - // Setup the apex-info-list.xml file - const std::string apex_info_file = std::string(apex::kApexRoot) + "/" + apex::kApexInfoList; - std::fstream xml(apex_info_file.c_str(), std::ios::out | std::ios::trunc); - if (!xml.is_open()) { - PLOG(ERROR) << "Failed to open " << apex_info_file; - exit(216); - } - - // we do not care about inactive apexs - std::vector<apex::ApexFile> inactive; - apex::CollectApexInfoList(xml, apex_files, inactive); - xml.flush(); - xml.close(); -} +static void ActivateApexPackages() { + std::vector<std::string> apexd_cmd{"/system/bin/apexd", "--otachroot-bootstrap"}; + std::string apexd_error_msg; -static void DeactivateApexPackages(const std::vector<apex::ApexFile>& active_packages) { - for (const apex::ApexFile& apex_file : active_packages) { - const std::string& package_path = apex_file.GetPath(); - base::Result<void> status = apex::DeactivatePackage(package_path); - if (!status.ok()) { - LOG(ERROR) << "Failed to deactivate " << package_path << ": " - << status.error(); - } + bool exec_result = Exec(apexd_cmd, &apexd_error_msg); + if (!exec_result) { + PLOG(ERROR) << "Running otapreopt failed: " << apexd_error_msg; + exit(220); } } @@ -269,8 +233,7 @@ static int otapreopt_chroot(const int argc, char **arg) { // Try to mount APEX packages in "/apex" in the chroot dir. We need at least // the ART APEX, as it is required by otapreopt to run dex2oat. - std::vector<apex::ApexFile> active_packages = ActivateApexPackages(); - CreateApexInfoList(active_packages); + ActivateApexPackages(); // Check that an ART APEX has been activated; clean up and exit // early otherwise. @@ -278,16 +241,27 @@ static int otapreopt_chroot(const int argc, char **arg) { "com.android.art", "com.android.runtime", }; - for (std::string_view apex : kRequiredApexs) { - if (std::none_of(active_packages.begin(), active_packages.end(), - [&](const apex::ApexFile& package) { - return package.GetManifest().name() == apex; - })) { - LOG(FATAL_WITHOUT_ABORT) << "No activated " << apex << " APEX package."; - DeactivateApexPackages(active_packages); - exit(217); + std::array<bool, arraysize(kRequiredApexs)> found_apexs{ false, false }; + DIR* apex_dir = opendir("/apex"); + if (apex_dir == nullptr) { + PLOG(ERROR) << "unable to open /apex"; + exit(220); + } + for (dirent* entry = readdir(apex_dir); entry != nullptr; entry = readdir(apex_dir)) { + for (int i = 0; i < found_apexs.size(); i++) { + if (kRequiredApexs[i] == std::string_view(entry->d_name)) { + found_apexs[i] = true; + break; + } } } + closedir(apex_dir); + auto it = std::find(found_apexs.cbegin(), found_apexs.cend(), false); + if (it != found_apexs.cend()) { + LOG(ERROR) << "No activated " << kRequiredApexs[std::distance(found_apexs.cbegin(), it)] + << " package!"; + exit(221); + } // Setup /linkerconfig. Doing it after the chroot means it doesn't need its own category if (selinux_android_restorecon("/linkerconfig", 0) < 0) { @@ -323,9 +297,6 @@ static int otapreopt_chroot(const int argc, char **arg) { LOG(ERROR) << "Running otapreopt failed: " << error_msg; } - // Tear down the work down by the apexd logic. (i.e. deactivate packages). - DeactivateApexPackages(active_packages); - if (!exec_result) { exit(213); } diff --git a/cmds/installd/run_dex2oat.cpp b/cmds/installd/run_dex2oat.cpp index 17ea90359c..a27fd103a4 100644 --- a/cmds/installd/run_dex2oat.cpp +++ b/cmds/installd/run_dex2oat.cpp @@ -86,7 +86,7 @@ void RunDex2Oat::Initialize(const UniqueFile& output_oat, bool generate_compact_dex, bool use_jitzygote_image, const char* compilation_reason) { - PrepareBootImageAndBootClasspathFlags(use_jitzygote_image); + PrepareBootImageFlags(use_jitzygote_image); PrepareInputFileFlags(output_oat, output_vdex, output_image, input_dex, input_vdex, dex_metadata, profile, swap_fd, class_loader_context, @@ -112,7 +112,7 @@ void RunDex2Oat::Initialize(const UniqueFile& output_oat, RunDex2Oat::~RunDex2Oat() {} -void RunDex2Oat::PrepareBootImageAndBootClasspathFlags(bool use_jitzygote_image) { +void RunDex2Oat::PrepareBootImageFlags(bool use_jitzygote_image) { std::string boot_image; if (use_jitzygote_image) { boot_image = StringPrintf("--boot-image=%s", kJitZygoteImage); @@ -120,23 +120,6 @@ void RunDex2Oat::PrepareBootImageAndBootClasspathFlags(bool use_jitzygote_image) boot_image = MapPropertyToArg("dalvik.vm.boot-image", "--boot-image=%s"); } AddArg(boot_image); - - // If DEX2OATBOOTCLASSPATH is not in the environment, dex2oat is going to query - // BOOTCLASSPATH. - char* dex2oat_bootclasspath = getenv("DEX2OATBOOTCLASSPATH"); - if (dex2oat_bootclasspath != nullptr) { - AddRuntimeArg(StringPrintf("-Xbootclasspath:%s", dex2oat_bootclasspath)); - } - - std::string updatable_bcp_packages = - MapPropertyToArg("dalvik.vm.dex2oat-updatable-bcp-packages-file", - "--updatable-bcp-packages-file=%s"); - if (updatable_bcp_packages.empty()) { - // Make dex2oat fail by providing non-existent file name. - updatable_bcp_packages = - "--updatable-bcp-packages-file=/nonx/updatable-bcp-packages.txt"; - } - AddArg(updatable_bcp_packages); } void RunDex2Oat::PrepareInputFileFlags(const UniqueFile& output_oat, diff --git a/cmds/installd/run_dex2oat.h b/cmds/installd/run_dex2oat.h index 325a3a2599..475e12413d 100644 --- a/cmds/installd/run_dex2oat.h +++ b/cmds/installd/run_dex2oat.h @@ -56,7 +56,7 @@ class RunDex2Oat { void Exec(int exit_code); protected: - void PrepareBootImageAndBootClasspathFlags(bool use_jitzygote_image); + void PrepareBootImageFlags(bool use_jitzygote_image); void PrepareInputFileFlags(const UniqueFile& output_oat, const UniqueFile& output_vdex, const UniqueFile& output_image, diff --git a/cmds/installd/run_dex2oat_test.cpp b/cmds/installd/run_dex2oat_test.cpp index 3813cf7c09..0a638cd51b 100644 --- a/cmds/installd/run_dex2oat_test.cpp +++ b/cmds/installd/run_dex2oat_test.cpp @@ -175,8 +175,6 @@ class RunDex2OatTest : public testing::Test { default_expected_flags_["--swap-fd"] = FLAG_UNUSED; default_expected_flags_["--class-loader-context"] = FLAG_UNUSED; default_expected_flags_["--class-loader-context-fds"] = FLAG_UNUSED; - default_expected_flags_["--updatable-bcp-packages-file"] = - "=/nonx/updatable-bcp-packages.txt"; // Arch default_expected_flags_["--instruction-set"] = "=arm64"; @@ -320,28 +318,6 @@ TEST_F(RunDex2OatTest, WithOnlyClassLoaderContextFds) { VerifyExpectedFlags(); } -TEST_F(RunDex2OatTest, DEX2OATBOOTCLASSPATH) { - ASSERT_EQ(nullptr, getenv("DEX2OATBOOTCLASSPATH")); - ASSERT_EQ(0, setenv("DEX2OATBOOTCLASSPATH", "foobar", /*override=*/ false)) - << "Failed to setenv: " << strerror(errno); - - CallRunDex2Oat(RunDex2OatArgs::MakeDefaultTestArgs()); - - SetExpectedFlagUsed("-Xbootclasspath", ":foobar"); - VerifyExpectedFlags(); - - ASSERT_EQ(0, unsetenv("DEX2OATBOOTCLASSPATH")) - << "Failed to setenv: " << strerror(errno); -} - -TEST_F(RunDex2OatTest, UpdatableBootClassPath) { - setSystemProperty("dalvik.vm.dex2oat-updatable-bcp-packages-file", "/path/to/file"); - CallRunDex2Oat(RunDex2OatArgs::MakeDefaultTestArgs()); - - SetExpectedFlagUsed("--updatable-bcp-packages-file", "=/path/to/file"); - VerifyExpectedFlags(); -} - TEST_F(RunDex2OatTest, DoNotGenerateCompactDex) { auto args = RunDex2OatArgs::MakeDefaultTestArgs(); args->generate_compact_dex = false; diff --git a/cmds/installd/tests/installd_dexopt_test.cpp b/cmds/installd/tests/installd_dexopt_test.cpp index fbf1e0c4b6..e27202597c 100644 --- a/cmds/installd/tests/installd_dexopt_test.cpp +++ b/cmds/installd/tests/installd_dexopt_test.cpp @@ -351,7 +351,7 @@ protected: uid = kTestAppUid; } if (class_loader_context == nullptr) { - class_loader_context = "&"; + class_loader_context = "PCL[]"; } int32_t dexopt_needed = 0; // does not matter; std::optional<std::string> out_path; // does not matter @@ -478,7 +478,7 @@ protected: bool should_binder_call_succeed, /*out */ binder::Status* binder_result) { std::optional<std::string> out_path = oat_dir ? std::make_optional<std::string>(oat_dir) : std::nullopt; - std::string class_loader_context = "&"; + std::string class_loader_context = "PCL[]"; int32_t target_sdk_version = 0; // default std::string profile_name = "primary.prof"; std::optional<std::string> dm_path_opt = dm_path ? std::make_optional<std::string>(dm_path) : std::nullopt; diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index 0bce6f7692..728a8c4376 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -58,13 +58,13 @@ cc_library_headers { // transport itself and should be moved to AIDL or in domain-specific libs. // // Currently, these are only on system android (not vendor, not host) +// TODO(b/183654927) - move these into separate libraries libbinder_device_interface_sources = [ "ActivityManager.cpp", "AppOpsManager.cpp", "IActivityManager.cpp", "IAppOpsCallback.cpp", "IAppOpsService.cpp", - "IBatteryStats.cpp", "IMediaResourceMonitor.cpp", "IPermissionController.cpp", "IProcessInfoService.cpp", @@ -73,6 +73,7 @@ libbinder_device_interface_sources = [ "PermissionController.cpp", "ProcessInfoService.cpp", "IpPrefix.cpp", + ":activity_manager_procstate_aidl", ] cc_library { @@ -133,6 +134,7 @@ cc_library { "Status.cpp", "TextOutput.cpp", "Utils.cpp", + ":packagemanager_aidl", ":libbinder_aidl", ], @@ -234,9 +236,6 @@ cc_library { filegroup { name: "libbinder_aidl", srcs: [ - "aidl/android/content/pm/IPackageChangeObserver.aidl", - "aidl/android/content/pm/IPackageManagerNative.aidl", - "aidl/android/content/pm/PackageChangeEvent.aidl", "aidl/android/os/IClientCallback.aidl", "aidl/android/os/IServiceCallback.aidl", "aidl/android/os/IServiceManager.aidl", @@ -245,6 +244,16 @@ filegroup { path: "aidl", } +filegroup { + name: "packagemanager_aidl", + srcs: [ + "aidl/android/content/pm/IPackageChangeObserver.aidl", + "aidl/android/content/pm/IPackageManagerNative.aidl", + "aidl/android/content/pm/PackageChangeEvent.aidl", + ], + path: "aidl", +} + aidl_interface { name: "libbinder_aidl_test_stub", unstable: true, @@ -257,3 +266,23 @@ aidl_interface { }, }, } + +// libbinder historically contained additional interfaces that provided specific +// functionality in the platform but have nothing to do with binder itself. These +// are moved out of libbinder in order to avoid the overhead of their vtables. +// If you are working on or own one of these interfaces, the responsible things +// to would be: +// - give them a new home +// - convert them to AIDL instead of having manually written parceling code + +cc_library { + name: "libbatterystats_aidl", + srcs: [ + "IBatteryStats.cpp", + ], + export_include_dirs: ["include_batterystats"], + shared_libs: [ + "libbinder", + "libutils", + ], +} diff --git a/libs/binder/IBatteryStats.cpp b/libs/binder/IBatteryStats.cpp index d0085dfa45..0de804c3c2 100644 --- a/libs/binder/IBatteryStats.cpp +++ b/libs/binder/IBatteryStats.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include <binder/IBatteryStats.h> +#include <batterystats/IBatteryStats.h> #include <utils/Log.h> #include <binder/Parcel.h> diff --git a/libs/binder/include/binder/IBatteryStats.h b/libs/binder/include_batterystats/batterystats/IBatteryStats.h index 6defc7fb0b..6defc7fb0b 100644 --- a/libs/binder/include/binder/IBatteryStats.h +++ b/libs/binder/include_batterystats/batterystats/IBatteryStats.h diff --git a/libs/binder/ndk/include_platform/android/binder_manager.h b/libs/binder/ndk/include_platform/android/binder_manager.h index 0668472240..55169140df 100644 --- a/libs/binder/ndk/include_platform/android/binder_manager.h +++ b/libs/binder/ndk/include_platform/android/binder_manager.h @@ -26,7 +26,7 @@ __BEGIN_DECLS * This registers the service with the default service manager under this instance name. This does * not take ownership of binder. * - * WARNING: when using this API across an APEX boundary, it should only be used with stable + * WARNING: when using this API across an APEX boundary, do not use with unstable * AIDL services. TODO(b/139325195) * * \param binder object to register globally with the service manager. @@ -42,7 +42,7 @@ __attribute__((warn_unused_result)) binder_exception_t AServiceManager_addServic * service is not available This also implicitly calls AIBinder_incStrong (so the caller of this * function is responsible for calling AIBinder_decStrong). * - * WARNING: when using this API across an APEX boundary, it should only be used with stable + * WARNING: when using this API across an APEX boundary, do not use with unstable * AIDL services. TODO(b/139325195) * * \param instance identifier of the service used to lookup the service. @@ -54,7 +54,7 @@ __attribute__((warn_unused_result)) AIBinder* AServiceManager_checkService(const * it. This also implicitly calls AIBinder_incStrong (so the caller of this function is responsible * for calling AIBinder_decStrong). * - * WARNING: when using this API across an APEX boundary, it should only be used with stable + * WARNING: when using this API across an APEX boundary, do not use with unstable * AIDL services. TODO(b/139325195) * * \param instance identifier of the service used to lookup the service. @@ -87,7 +87,7 @@ binder_status_t AServiceManager_registerLazyService(AIBinder* binder, const char * This also implicitly calls AIBinder_incStrong (so the caller of this function is responsible * for calling AIBinder_decStrong). * - * WARNING: when using this API across an APEX boundary, it should only be used with stable + * WARNING: when using this API across an APEX boundary, do not use with unstable * AIDL services. TODO(b/139325195) * * \param instance identifier of the service used to lookup the service. diff --git a/libs/binder/ndk/include_platform/android/binder_stability.h b/libs/binder/ndk/include_platform/android/binder_stability.h index f5e8bf60ef..ce7255e174 100644 --- a/libs/binder/ndk/include_platform/android/binder_stability.h +++ b/libs/binder/ndk/include_platform/android/binder_stability.h @@ -30,7 +30,7 @@ enum { FLAG_PRIVATE_VENDOR = 0x10000000, }; -#if defined(__ANDROID_VNDK__) && !defined(__ANDROID_APEX__) +#if defined(__ANDROID_VENDOR__) enum { FLAG_PRIVATE_LOCAL = FLAG_PRIVATE_VENDOR, @@ -45,7 +45,7 @@ static inline void AIBinder_markCompilationUnitStability(AIBinder* binder) { AIBinder_markVendorStability(binder); } -#else // defined(__ANDROID_VNDK__) && !defined(__ANDROID_APEX__) +#else // defined(__ANDROID_VENDOR__) enum { FLAG_PRIVATE_LOCAL = 0, @@ -62,7 +62,7 @@ static inline void AIBinder_markCompilationUnitStability(AIBinder* binder) { AIBinder_markSystemStability(binder); } -#endif // defined(__ANDROID_VNDK__) && !defined(__ANDROID_APEX__) +#endif // defined(__ANDROID_VENDOR__) /** * This interface has system<->vendor stability diff --git a/services/sensorservice/Android.bp b/services/sensorservice/Android.bp index ca9ff7c8c3..c769e975e3 100644 --- a/services/sensorservice/Android.bp +++ b/services/sensorservice/Android.bp @@ -7,9 +7,6 @@ package { default_applicable_licenses: ["frameworks_native_license"], } -subdirs = [ - "hidl" -] cc_library_shared { name: "libsensorservice", @@ -52,6 +49,7 @@ cc_library_shared { "libhardware_legacy", "libutils", "liblog", + "libbatterystats_aidl", "libbinder", "libsensor", "libsensorprivacy", diff --git a/services/sensorservice/BatteryService.h b/services/sensorservice/BatteryService.h index 43a750c6c2..09eb2c1d10 100644 --- a/services/sensorservice/BatteryService.h +++ b/services/sensorservice/BatteryService.h @@ -17,7 +17,7 @@ #include <stdint.h> #include <sys/types.h> -#include <binder/IBatteryStats.h> +#include <batterystats/IBatteryStats.h> #include <utils/Singleton.h> namespace android { diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index df26a3db70..5a24d5122a 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -211,8 +211,8 @@ std::optional<compositionengine::LayerFE::LayerSettings> BufferLayer::prepareCli layer.frameNumber = mCurrentFrameNumber; layer.bufferId = mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getId() : 0; - // TODO: we could be more subtle with isFixedSize() - const bool useFiltering = targetSettings.needsFiltering || mNeedsFiltering || isFixedSize(); + const bool useFiltering = + targetSettings.needsFiltering || mNeedsFiltering || bufferNeedsFiltering(); // Query the texture matrix given our current filtering mode. float textureMatrix[16]; @@ -847,6 +847,36 @@ void BufferLayer::setTransformHint(ui::Transform::RotationFlags displayTransform } } +bool BufferLayer::bufferNeedsFiltering() const { + // Layers that don't resize along with their buffer, don't need filtering. + if (!isFixedSize()) { + return false; + } + + if (!mBufferInfo.mBuffer) { + return false; + } + + uint32_t bufferWidth = mBufferInfo.mBuffer->width; + uint32_t bufferHeight = mBufferInfo.mBuffer->height; + + // Undo any transformations on the buffer and return the result. + const State& s(getDrawingState()); + if (s.transform & ui::Transform::ROT_90) { + std::swap(bufferWidth, bufferHeight); + } + + if (s.transformToDisplayInverse) { + uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags(); + if (invTransform & ui::Transform::ROT_90) { + std::swap(bufferWidth, bufferHeight); + } + } + + const Rect layerSize{getBounds()}; + return layerSize.width() != bufferWidth || layerSize.height() != bufferHeight; +} + } // namespace android #if defined(__gl_h_) diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 26bfb4931b..c7e8ad7372 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -118,6 +118,10 @@ public: ui::Transform::RotationFlags getTransformHint() const override { return mTransformHint; } + // Returns true if the transformed buffer size does not match the layer size and we need + // to apply filtering. + bool bufferNeedsFiltering() const; + // ----------------------------------------------------------------------- // Functions that must be implemented by derived classes // ----------------------------------------------------------------------- diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index 790f2ece77..41dd7bfaa4 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -760,6 +760,7 @@ Layer::RoundedCornerState BufferStateLayer::getRoundedCornerState() const { static_cast<float>(s.active.transform.ty() + s.active.h)), radius); } + } // namespace android // TODO(b/129481165): remove the #pragma below and fix conversion issues |