blob: d409db8d2854fa87d21f735c9bb616fdbc7e48ef [file] [log] [blame]
Alex Light9b71cad2016-06-21 16:17:48 -07001#!/system/bin/sh
2#
3# Copyright (C) 2016 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17# create files with 644 (global read) permissions.
18umask 022
19
Wei Wang757d3412016-07-18 11:41:18 -070020# Helper function to copy files
21function do_copy() {
Nicolas Geoffray986ae622016-10-20 16:58:52 +010022 source_file=$1
Wei Wang757d3412016-07-18 11:41:18 -070023 dest_name=$2
Alex Light9b71cad2016-06-21 16:17:48 -070024 # Move to a temporary file so we can do a rename and have the preopted file
25 # appear atomically in the filesystem.
26 temp_dest_name=${dest_name}.tmp
Nicolas Geoffray986ae622016-10-20 16:58:52 +010027 if ! cp ${source_file} ${temp_dest_name} ; then
28 log -p w -t cppreopts "Unable to copy file ${source_file} to ${temp_dest_name}!"
Alex Light9b71cad2016-06-21 16:17:48 -070029 else
Nicolas Geoffray986ae622016-10-20 16:58:52 +010030 log -p i -t cppreopts "Copied file from ${source_file} to ${temp_dest_name}"
Wei Wanga1dced22019-04-01 08:51:18 -070031 fsync ${temp_dest_name}
Alex Light9b71cad2016-06-21 16:17:48 -070032 if ! mv ${temp_dest_name} ${dest_name} ; then
Nicolas Geoffray986ae622016-10-20 16:58:52 +010033 log -p w -t cppreopts "Unable to rename temporary file from ${temp_dest_name} to ${dest_name}"
Alex Light0b2d3722017-07-25 11:17:05 -070034 rm ${temp_dest_name} || log -p w -t cppreopts "Unable to remove temporary file ${temp_dest_name}"
Alex Light9b71cad2016-06-21 16:17:48 -070035 else
Wei Wanga1dced22019-04-01 08:51:18 -070036 fsync ${dest_name}
Nicolas Geoffray986ae622016-10-20 16:58:52 +010037 log -p i -t cppreopts "Renamed temporary file from ${temp_dest_name} to ${dest_name}"
Alex Light9b71cad2016-06-21 16:17:48 -070038 fi
39 fi
Wei Wang757d3412016-07-18 11:41:18 -070040}
Alex Light9b71cad2016-06-21 16:17:48 -070041
Wei Wang757d3412016-07-18 11:41:18 -070042if [ $# -eq 1 ]; then
43 # Where the system_b is mounted that contains the preopt'd files
44 mountpoint=$1
45
46 if ! test -f ${mountpoint}/system-other-odex-marker ; then
Nicolas Geoffray986ae622016-10-20 16:58:52 +010047 log -p i -t cppreopts "system_other partition does not appear to have been built to contain preopted files."
Wei Wang757d3412016-07-18 11:41:18 -070048 exit 1
49 fi
50
51 log -p i -t cppreopts "cppreopts from ${mountpoint}"
Nicolas Geoffray986ae622016-10-20 16:58:52 +010052 # For each odex and vdex file do the copy task
Wei Wang757d3412016-07-18 11:41:18 -070053 # NOTE: this implementation will break in any path with spaces to favor
54 # background copy tasks
Mathieu Chartier496f0212017-05-05 10:56:11 -070055 for file in $(find ${mountpoint} -type f -name "*.odex" -o -type f -name "*.vdex" -o -type f -name "*.art"); do
Anton Hanssondafd85d2019-10-03 14:16:38 +010056 real_name=${file/${mountpoint}/}
Nicolas Geoffray986ae622016-10-20 16:58:52 +010057 dest_name=$(preopt2cachename ${real_name})
Wei Wang757d3412016-07-18 11:41:18 -070058 if ! test $? -eq 0 ; then
Nicolas Geoffray986ae622016-10-20 16:58:52 +010059 log -p i -t cppreopts "Unable to figure out destination for ${file}"
Wei Wang757d3412016-07-18 11:41:18 -070060 continue
61 fi
62 # Copy files in background to speed things up
Nicolas Geoffray986ae622016-10-20 16:58:52 +010063 do_copy ${file} ${dest_name} &
Wei Wang757d3412016-07-18 11:41:18 -070064 done
65 # Wait for jobs to finish
66 wait
67 exit 0
68else
69 log -p e -t cppreopts "Usage: cppreopts <preopts-mount-point>"
70 exit 1
71fi