diff options
author | Alex Light <allight@google.com> | 2016-06-21 16:17:48 -0700 |
---|---|---|
committer | Alex Light <allight@google.com> | 2016-06-29 10:01:35 -0700 |
commit | 9b71cad2381cbd67d7e3a9ca2af357ae6998be83 (patch) | |
tree | 3eef87206da6fcb032b54136a7997cb7187ffe70 /cppreopts | |
parent | 0c2c44bfac3cef379470c78038eab73ce8fa6b58 (diff) | |
download | extras-9b71cad2381cbd67d7e3a9ca2af357ae6998be83.tar.gz |
Copy preopted files from B partition.
This translates from the preopted files in the system_other partition
into the main dalvik-cache. This also has init scripts to allow this
to run.
We first copy to a temporary file before renaming them in order to
make the copy atomic.
Bug: 29278988
Change-Id: I8bf1b2d021998949fd9996a923be7db9691e6a1e
Diffstat (limited to 'cppreopts')
-rw-r--r-- | cppreopts/Android.mk | 27 | ||||
-rw-r--r-- | cppreopts/cppreopts.rc | 25 | ||||
-rw-r--r-- | cppreopts/cppreopts.sh | 58 |
3 files changed, 110 insertions, 0 deletions
diff --git a/cppreopts/Android.mk b/cppreopts/Android.mk new file mode 100644 index 00000000..049f2b43 --- /dev/null +++ b/cppreopts/Android.mk @@ -0,0 +1,27 @@ +# Copyright 2016 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. + +LOCAL_PATH:= $(call my-dir) + +# Create the cppreopts that does the copy +include $(CLEAR_VARS) + +LOCAL_MODULE:= cppreopts.sh +LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_INIT_RC := cppreopts.rc +LOCAL_SRC_FILES := cppreopts.sh + +LOCAL_REQUIRED_MODULES := preopt2cachename + +include $(BUILD_PREBUILT) diff --git a/cppreopts/cppreopts.rc b/cppreopts/cppreopts.rc new file mode 100644 index 00000000..3df9148a --- /dev/null +++ b/cppreopts/cppreopts.rc @@ -0,0 +1,25 @@ +# Copyright 2016 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. + +on property:sys.cppreopt=requested && property:ro.boot.slot_suffix=_a + mount ext4 /dev/block/bootdevice/by-name/system_b /postinstall ro nosuid nodev noexec + exec - root -- /system/bin/cppreopts.sh /postinstall + umount /postinstall + setprop sys.cppreopt finished + +on property:sys.cppreopt=requested && property:ro.boot.slot_suffix=_b + mount ext4 /dev/block/bootdevice/by-name/system_a /postinstall ro nosuid nodev noexec + exec - root -- /system/bin/cppreopts.sh /postinstall + umount /postinstall + setprop sys.cppreopt finished diff --git a/cppreopts/cppreopts.sh b/cppreopts/cppreopts.sh new file mode 100644 index 00000000..4c72e941 --- /dev/null +++ b/cppreopts/cppreopts.sh @@ -0,0 +1,58 @@ +#!/system/bin/sh +# +# Copyright (C) 2016 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. + +# create files with 644 (global read) permissions. +umask 022 + +if [ $# -ne 1 ]; then + log -p e -t cppreopts "Usage: cppreopts <preopts-mount-point>" + exit 1 +fi + +# Where the system_b is mounted that contains the preopt'd files +mountpoint=$1 + +if ! test -f ${mountpoint}/system-other-odex-marker ; then + log -p i -t cppreopts "system_other partition does not appear have been built to contain preopted files." + exit 1 +fi + +log -p i -t cppreopts "cppreopts from ${mountpoint}" +# For each odex file. +find ${mountpoint} -type f -name "*.odex" | while read odex_file; do + real_odex_name=${odex_file/${mountpoint}/\/system} + dest_name=$(preopt2cachename ${real_odex_name}) + # Move to a temporary file so we can do a rename and have the preopted file + # appear atomically in the filesystem. + temp_dest_name=${dest_name}.tmp + if ! test $? -eq 0 ; then + log -p i -t cppreopts "Unable to figure out destination for ${odex_file}" + continue + fi + if ! cp ${odex_file} ${temp_dest_name} ; then + log -p w -t cppreopts "Unable to copy odex file ${odex_file} to ${temp_dest_name}!" + else + log -p i -t cppreopts "Copied odex file from ${odex_file} to ${temp_dest_name}" + sync + if ! mv ${temp_dest_name} ${dest_name} ; then + log -p w -t cppreopts "Unable to rename temporary odex file from ${temp_dest_name} to ${dest_name}" + else + log -p i -t cppreopts "Renamed temporary odex file from ${temp_dest_name} to ${dest_name}" + fi + fi +done + +exit 0 |