Merge "Missing UpdateState::Cancelled string conversions"
diff --git a/adb/Android.bp b/adb/Android.bp
index 7e3be61..118531d 100644
--- a/adb/Android.bp
+++ b/adb/Android.bp
@@ -160,7 +160,11 @@
// libadbconnection_client doesn't need an embedded build number.
use_version_lib: false,
- version_script: "adbconnection/libadbconnection_client.map.txt",
+ target: {
+ linux: {
+ version_script: "adbconnection/libadbconnection_client.map.txt",
+ },
+ },
stubs: {
symbol_file: "adbconnection/libadbconnection_client.map.txt",
versions: ["1"],
diff --git a/bootstat/boot_reason_test.sh b/bootstat/boot_reason_test.sh
index f379d76..970ca94 100755
--- a/bootstat/boot_reason_test.sh
+++ b/bootstat/boot_reason_test.sh
@@ -7,7 +7,7 @@
# - watch adb logcat -b all -d -s bootstat
# - watch adb logcat -b all -d | audit2allow
# - wait until screen is up, boot has completed, can mean wait for
-# sys.boot_completed=1 and sys.logbootcomplete=1 to be true
+# sys.boot_completed=1 and sys.bootstat.first_boot_completed=1 to be true
#
# All test frames, and nothing else, must be function names prefixed and
# specifiged with the pattern 'test_<test>() {' as this is also how the
@@ -230,13 +230,13 @@
if [ -n "`get_property sys.boot.reason`" ]
then
vals=`get_property |
- sed -n 's/[[]sys[.]\(boot_completed\|logbootcomplete\)[]]: [[]\([01]\)[]]$/\1=\2/p'`
- if [ "${vals}" = "`echo boot_completed=1 ; echo logbootcomplete=1`" ]
+ sed -n 's/[[]sys[.]\(boot_completed\|bootstat.first_boot_completed\)[]]: [[]\([01]\)[]]$/\1=\2/p'`
+ if [ "${vals}" = "`echo boot_completed=1 ; echo bootstat.first_boot_completed=1`" ]
then
sleep 1
break
fi
- if [ "${vals}" = "`echo logbootcomplete=1 ; echo boot_completed=1`" ]
+ if [ "${vals}" = "`echo bootstat.first_boot_completed=1 ; echo boot_completed=1`" ]
then
sleep 1
break
@@ -384,15 +384,15 @@
init : processing action (boot) from (/system/etc/init/bootstat.rc
init : processing action (ro.boot.bootreason=*) from (/system/etc/init/bootstat.rc
init : processing action (ro.boot.bootreason=* && post-fs) from (/system/etc/init/bootstat.rc
-init : processing action (zygote-start) from (/system/etc/init/bootstat.rc
-init : processing action (sys.boot_completed=1 && sys.logbootcomplete=1) from (/system/etc/init/bootstat.rc
+init : processing action (sys.bootstat.first_zygote_start=0 && zygote-start) from (/system/etc/init/bootstat.rc
+init : processing action (sys.boot_completed=1 && sys.bootstat.first_boot_completed=0) from (/system/etc/init/bootstat.rc
(/system/bin/bootstat --record_boot_complete --record_boot_reason --record_time_since_factory_reset -l)'
(/system/bin/bootstat --set_system_boot_reason --record_boot_complete --record_boot_reason --record_time_since_factory_reset -l)'
(/system/bin/bootstat -r post_decrypt_time_elapsed)'
-init : Command 'exec - system log -- /system/bin/bootstat --record_boot_complete' action=sys.boot_completed=1 && sys.logbootcomplete=1 (/system/etc/init/bootstat.rc:
-init : Command 'exec - system log -- /system/bin/bootstat --record_boot_reason' action=sys.boot_completed=1 && sys.logbootcomplete=1 (/system/etc/init/bootstat.rc:
-init : Command 'exec - system log -- /system/bin/bootstat --record_time_since_factory_reset' action=sys.boot_completed=1 && sys.logbootcomplete=1 (/system/etc/init/bootstat.rc:
-init : Command 'exec_background - system log -- /system/bin/bootstat --set_system_boot_reason --record_boot_complete --record_boot_reason --record_time_since_factory_reset -l' action=sys.boot_completed=1 && sys.logbootcomplete=1 (/system/etc/init/bootstat.rc
+init : Command 'exec - system log -- /system/bin/bootstat --record_boot_complete' action=sys.boot_completed=1 && sys.bootstat.first_boot_completed=0 (/system/etc/init/bootstat.rc:
+init : Command 'exec - system log -- /system/bin/bootstat --record_boot_reason' action=sys.boot_completed=1 && sys.bootstat.first_boot_completed=0 (/system/etc/init/bootstat.rc:
+init : Command 'exec - system log -- /system/bin/bootstat --record_time_since_factory_reset' action=sys.boot_completed=1 && sys.bootstat.first_boot_completed=0 (/system/etc/init/bootstat.rc:
+init : Command 'exec_background - system log -- /system/bin/bootstat --set_system_boot_reason --record_boot_complete --record_boot_reason --record_time_since_factory_reset -l' action=sys.boot_completed=1 && sys.bootstat.first_boot_completed=0 (/system/etc/init/bootstat.rc
(/system/bin/bootstat --record_boot_complete)'...
(/system/bin/bootstat --record_boot_complete)' (pid${SPACE}
(/system/bin/bootstat --record_boot_reason)'...
diff --git a/bootstat/bootstat.rc b/bootstat/bootstat.rc
index 85caf25..a350fe7 100644
--- a/bootstat/bootstat.rc
+++ b/bootstat/bootstat.rc
@@ -50,34 +50,34 @@
on post-fs-data && property:init.svc.bootanim=running && property:ro.crypto.type=block
exec_background - system log -- /system/bin/bootstat -r post_decrypt_time_elapsed
-# sys.logbootcomplete is a signal to enable the bootstat logging mechanism.
-# This signaling is necessary to prevent logging boot metrics after a runtime
-# restart (e.g., adb shell stop && adb shell start). /proc/uptime is not reset
-# during a runtime restart, which leads to false boot time metrics being reported.
+# Initialize bootstat state machine.
#
-# The 'on boot' event occurs once per hard boot (device power on), which
-# switches the flag on. If the device performs a runtime restart, the flag is
-# switched off and cannot be switched on until the device hard boots again.
-
-# Enable bootstat logging on boot.
-on boot
- setprop sys.logbootcomplete 1
-
-# Disable further bootstat logging on a runtime restart. A runtime restart is
-# signaled by the zygote stopping.
-on property:init.svc.zygote=stopping
- setprop sys.logbootcomplete 0
+# sys.bootstat.first_boot_completed: responsible for making sure that record_boot_complete happens
+# only once per device hard reboot. Possible values:
+#
+# sys.bootstat.first_boot_completed=0 - first boot completed trigger wasn't processed yet.
+# sys.bootstat.first_boot_completed=1 - first boot completed trigger was processed and
+# record_boot_complete was called. Subsequent boot completed
+# triggers (e.g. due to userspace reboot) won't retrigger
+# record_boot_complete
+#
+# IMPORTANT, ro.persistent_properties.ready=1 trigger is used here to ensure that we initialize
+# state machine only once, which as result ensures that bootstat --set_system_boot_reason and
+# bootstat --record_boot_complete will be called only once per full reboot.
+on property:ro.persistent_properties.ready=true
+ setprop sys.bootstat.first_boot_completed 0
# Set boot reason
-on zygote-start
+on property:ro.persistent_properties.ready=true
# Converts bootloader boot reason and persist.sys.boot.reason to system boot reason
# Need go after persist peroperties are loaded which is right before zygote-start trigger
exec_background - system log -- /system/bin/bootstat --set_system_boot_reason
# Record boot complete metrics.
-on property:sys.boot_completed=1 && property:sys.logbootcomplete=1
+on property:sys.boot_completed=1 && property:sys.bootstat.first_boot_completed=0
# Record boot_complete and related stats (decryption, etc).
# Record the boot reason.
# Record time since factory reset.
# Log all boot events.
exec_background - system log -- /system/bin/bootstat --record_boot_complete --record_boot_reason --record_time_since_factory_reset -l
+ setprop sys.bootstat.first_boot_completed 1
diff --git a/fs_mgr/libdm/dm_test.cpp b/fs_mgr/libdm/dm_test.cpp
index b296801..affdd29 100644
--- a/fs_mgr/libdm/dm_test.cpp
+++ b/fs_mgr/libdm/dm_test.cpp
@@ -533,7 +533,9 @@
if (is_legacy) {
ASSERT_EQ(target.GetParameterString(), "AES-256-XTS abcdef0123456789 /dev/loop0 0");
} else {
- ASSERT_EQ(target.GetParameterString(), "AES-256-XTS abcdef0123456789 0 /dev/loop0 0");
+ ASSERT_EQ(target.GetParameterString(),
+ "AES-256-XTS abcdef0123456789 0 /dev/loop0 0 3 allow_discards sector_size:4096 "
+ "iv_large_sectors");
}
}
diff --git a/healthd/charger.cpp b/healthd/charger.cpp
index 58ed416..d03978d 100644
--- a/healthd/charger.cpp
+++ b/healthd/charger.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#include <android-base/logging.h>
+
#include "charger.sysprop.h"
#include "healthd_mode_charger.h"
#include "healthd_mode_charger_nops.h"
@@ -23,6 +25,7 @@
#endif
int main(int argc, char** argv) {
+ android::base::InitLogging(argv, &android::base::KernelLogger);
if (CHARGER_FORCE_NO_UI || android::sysprop::ChargerProperties::no_ui().value_or(false)) {
return healthd_charger_nops(argc, argv);
} else {
diff --git a/healthd/charger_utils.cpp b/healthd/charger_utils.cpp
index 0cf9df5..8bbfb4e 100644
--- a/healthd/charger_utils.cpp
+++ b/healthd/charger_utils.cpp
@@ -17,50 +17,28 @@
#include "charger_utils.h"
#include <android-base/logging.h>
-#include <android/hidl/manager/1.0/IServiceManager.h>
+#include <android/hardware/health/2.1/IHealth.h>
#include <health/utils.h>
#include <health2impl/Health.h>
-#include <hidl/ServiceManagement.h>
-
-using android::hardware::getPassthroughServiceManager;
-using android::hidl::base::V1_0::IBase;
-using android::hidl::manager::V1_0::IServiceManager;
namespace android {
namespace hardware {
namespace health {
-sp<V2_1::IHealth> GetPassthroughHealthImpl() {
- // Not using getService() because there is no hwservicemanager in charger mode.
- sp<IServiceManager> pm = getPassthroughServiceManager();
- if (pm == nullptr) {
- LOG(WARNING) << "Cannot get passthrough service manager.";
- return nullptr;
- }
- sp<IBase> base = pm->get(V2_0::IHealth::descriptor, "default");
- if (base == nullptr) {
- LOG(WARNING) << "Cannot find passthrough implementation of health 2.0 HAL for instance "
- "'default' on the device.";
- return nullptr;
- }
- sp<V2_1::IHealth> service = V2_1::IHealth::castFrom(base);
- if (service == nullptr) {
- LOG(WARNING)
- << "Cannot cast passthrough implementation of health 2.0 HAL to 2.1 for instance "
- "'default' on the device.";
- return nullptr;
- }
- return service;
-}
-sp<V2_1::IHealth> GetPassthroughHealth() {
- auto impl = GetPassthroughHealthImpl();
- if (impl == nullptr) {
+sp<V2_1::IHealth> GetHealthServiceOrDefault() {
+ // No need to use get_health_service from libhealthhalutils that
+ // checks for "backup" instance provided by healthd, since
+ // V2_1::implementation::Health does the same thing.
+ sp<V2_1::IHealth> service = V2_1::IHealth::getService();
+ if (service != nullptr) {
+ LOG(INFO) << "Charger uses health HAL service.";
+ } else {
LOG(WARNING) << "Charger uses system defaults.";
auto config = std::make_unique<healthd_config>();
InitHealthdConfig(config.get());
- impl = new V2_1::implementation::Health(std::move(config));
+ service = new V2_1::implementation::Health(std::move(config));
}
- return impl;
+ return service;
}
} // namespace health
diff --git a/healthd/charger_utils.h b/healthd/charger_utils.h
index f96e827..39d8aab 100644
--- a/healthd/charger_utils.h
+++ b/healthd/charger_utils.h
@@ -21,7 +21,9 @@
namespace android {
namespace hardware {
namespace health {
-sp<V2_1::IHealth> GetPassthroughHealth();
+// Return health HAL service. If it is not supported on the device (with
+// VINTF checks), return a default passthrough implementation.
+sp<V2_1::IHealth> GetHealthServiceOrDefault();
} // namespace health
} // namespace hardware
} // namespace android
diff --git a/healthd/healthd_mode_charger.cpp b/healthd/healthd_mode_charger.cpp
index 7d844c9..386ba1a 100644
--- a/healthd/healthd_mode_charger.cpp
+++ b/healthd/healthd_mode_charger.cpp
@@ -60,7 +60,7 @@
using namespace android;
using android::hardware::Return;
-using android::hardware::health::GetPassthroughHealth;
+using android::hardware::health::GetHealthServiceOrDefault;
using android::hardware::health::HealthLoop;
using android::hardware::health::V1_0::BatteryStatus;
using android::hardware::health::V2_0::Result;
@@ -742,6 +742,6 @@
}
}
- Charger charger(GetPassthroughHealth());
+ Charger charger(GetHealthServiceOrDefault());
return charger.StartLoop();
}
diff --git a/healthd/healthd_mode_charger_nops.cpp b/healthd/healthd_mode_charger_nops.cpp
index 13e7348..9fe381e 100644
--- a/healthd/healthd_mode_charger_nops.cpp
+++ b/healthd/healthd_mode_charger_nops.cpp
@@ -20,10 +20,10 @@
#include "charger_utils.h"
-using android::hardware::health::GetPassthroughHealth;
+using android::hardware::health::GetHealthServiceOrDefault;
using android::hardware::health::V2_1::implementation::HalHealthLoop;
int healthd_charger_nops(int /* argc */, char** /* argv */) {
- HalHealthLoop charger("charger", GetPassthroughHealth());
+ HalHealthLoop charger("charger", GetHealthServiceOrDefault());
return charger.StartLoop();
}
diff --git a/init/init.cpp b/init/init.cpp
index a25bf6c..10701da 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -780,18 +780,18 @@
if (!(waiting_for_prop || Service::is_exec_service_running())) {
am.ExecuteOneCommand();
}
- if (!(waiting_for_prop || Service::is_exec_service_running())) {
- if (!IsShuttingDown()) {
- auto next_process_action_time = HandleProcessActions();
+ if (!IsShuttingDown()) {
+ auto next_process_action_time = HandleProcessActions();
- // If there's a process that needs restarting, wake up in time for that.
- if (next_process_action_time) {
- epoll_timeout = std::chrono::ceil<std::chrono::milliseconds>(
- *next_process_action_time - boot_clock::now());
- if (*epoll_timeout < 0ms) epoll_timeout = 0ms;
- }
+ // If there's a process that needs restarting, wake up in time for that.
+ if (next_process_action_time) {
+ epoll_timeout = std::chrono::ceil<std::chrono::milliseconds>(
+ *next_process_action_time - boot_clock::now());
+ if (*epoll_timeout < 0ms) epoll_timeout = 0ms;
}
+ }
+ if (!(waiting_for_prop || Service::is_exec_service_running())) {
// If there's more work to do, wake up again immediately.
if (am.HasMoreCommands()) epoll_timeout = 0ms;
}
diff --git a/rootdir/init.rc b/rootdir/init.rc
index 20fb071..fc04b8f 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -73,19 +73,6 @@
mkdir /dev/boringssl 0755 root root
mkdir /dev/boringssl/selftest 0755 root root
- # Mount binderfs
- mkdir /dev/binderfs
- mount binder binder /dev/binderfs stats=global
- chmod 0755 /dev/binderfs
-
- symlink /dev/binderfs/binder /dev/binder
- symlink /dev/binderfs/hwbinder /dev/hwbinder
- symlink /dev/binderfs/vndbinder /dev/vndbinder
-
- chmod 0666 /dev/binderfs/hwbinder
- chmod 0666 /dev/binderfs/binder
- chmod 0666 /dev/binderfs/vndbinder
-
# Run boringssl self test for each ABI so that later processes can skip it. http://b/139348610
on early-init && property:ro.product.cpu.abilist32=*
exec_start boringssl_self_test32
@@ -191,10 +178,10 @@
# Prepare directories for pass through processes
mkdir /mnt/pass_through 0700 root root
- mkdir /mnt/pass_through/0 0755 root root
- mkdir /mnt/pass_through/0/self 0755 root root
- mkdir /mnt/pass_through/0/emulated 0755 root root
- mkdir /mnt/pass_through/0/emulated/0 0755 root root
+ mkdir /mnt/pass_through/0 0710 root media_rw
+ mkdir /mnt/pass_through/0/self 0710 root media_rw
+ mkdir /mnt/pass_through/0/emulated 0710 root media_rw
+ mkdir /mnt/pass_through/0/emulated/0 0710 root media_rw
mkdir /mnt/expand 0771 system system
mkdir /mnt/appfuse 0711 root root
@@ -738,6 +725,12 @@
init_user0
+ # Allow apexd to snapshot and restore device encrypted apex data in the case
+ # of a rollback. This should be done immediately after DE_user data keys
+ # are loaded. APEXes should not access this data until this has been
+ # completed.
+ exec_start apexd-snapshotde
+
# Set SELinux security contexts on upgrade or policy update.
restorecon --recursive --skip-ce /data