summaryrefslogtreecommitdiff
path: root/cppreopts
diff options
context:
space:
mode:
authorAlex Light <allight@google.com>2016-06-21 16:17:48 -0700
committerAlex Light <allight@google.com>2016-06-29 10:01:35 -0700
commit9b71cad2381cbd67d7e3a9ca2af357ae6998be83 (patch)
tree3eef87206da6fcb032b54136a7997cb7187ffe70 /cppreopts
parent0c2c44bfac3cef379470c78038eab73ce8fa6b58 (diff)
downloadextras-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.mk27
-rw-r--r--cppreopts/cppreopts.rc25
-rw-r--r--cppreopts/cppreopts.sh58
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