diff options
author | Luca Stefani <luca.stefani.ge1@gmail.com> | 2016-07-18 13:47:55 +0200 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2016-08-05 00:00:52 -0700 |
commit | 7f9fff2317b8e1f64b2a74ae6c6447f537737b14 (patch) | |
tree | 3e05a9880ce754b99ea4ac2129572398d127f63f /build | |
parent | 463feb60058e5602a44b79fd9646cbf185140af8 (diff) | |
download | vendor_replicant-7f9fff2317b8e1f64b2a74ae6c6447f537737b14.zip vendor_replicant-7f9fff2317b8e1f64b2a74ae6c6447f537737b14.tar.gz vendor_replicant-7f9fff2317b8e1f64b2a74ae6c6447f537737b14.tar.bz2 |
cm: extract_utils: Implement oat2dex
* Shipping baksmali and smali (version 2.1.3) in vendor/cm
(Official sources: https://github.com/JesusFreke/smali)
Change-Id: Iaca6337fa2d4b5f2d6654ef5142ec0313af63f5a
Diffstat (limited to 'build')
-rw-r--r-- | build/tools/extract_utils.sh | 102 | ||||
-rw-r--r-- | build/tools/smali/NOTICE | 105 | ||||
-rw-r--r-- | build/tools/smali/baksmali.jar | bin | 0 -> 1183908 bytes | |||
-rw-r--r-- | build/tools/smali/smali.jar | bin | 0 -> 985749 bytes |
4 files changed, 207 insertions, 0 deletions
diff --git a/build/tools/extract_utils.sh b/build/tools/extract_utils.sh index aaae375..b4b8faf 100644 --- a/build/tools/extract_utils.sh +++ b/build/tools/extract_utils.sh @@ -20,6 +20,11 @@ PRODUCT_PACKAGES_LIST=() PACKAGE_LIST=() VENDOR_STATE=-1 COMMON=-1 +ARCHES= +FULLY_DEODEXED=-1 + +TMPDIR="/tmp/extractfiles.$$" +mkdir "$TMPDIR" # # setup_vendor @@ -533,6 +538,91 @@ function write_makefiles() { } # +# get_file: +# +# $1: input file +# $2: target file/folder +# $3: source of the file (can be "adb" or a local folder) +# +# Silently extracts the input file to defined target +# Returns success if file can be pulled from the device or found locally +# +function get_file() { + local SRC="$3" + + if [ "$SRC" = "adb" ]; then + # try to pull + adb pull "$1" "$2" >/dev/null 2>&1 && return 0 + + return 1 + else + # try to copy + cp "$SRC/$1" "$2" 2>/dev/null && return 0 + + return 1 + fi +}; + +# +# oat2dex: +# +# $1: extracted apk|jar (to check if deodex is required) +# $2: odexed apk|jar to deodex +# $3: source of the odexed apk|jar +# +# Convert apk|jar .odex in the corresposing classes.dex +# +function oat2dex() { + local CM_TARGET="$1" + local OEM_TARGET="$2" + local SRC="$3" + local TARGET= + local OAT= + + if [ -z "$BAKSMALIJAR" ] || [ -z "$SMALIJAR" ]; then + export BAKSMALIJAR="$CM_ROOT"/vendor/cm/build/tools/smali/baksmali.jar + export SMALIJAR="$CM_ROOT"/vendor/cm/build/tools/smali/smali.jar + fi + + # Extract existing boot.oats to the temp folder + if [ -z "$ARCHES" ]; then + echo "Checking if system is odexed and extracting boot.oats, if applicable. This may take a while..." + for ARCH in "arm64" "arm" "x86_64" "x86"; do + if get_file "system/framework/$ARCH/boot.oat" "$TMPDIR/boot_$ARCH.oat" "$SRC"; then + ARCHES+="$ARCH " + fi + done + fi + + if [ -z "$ARCHES" ]; then + FULLY_DEODEXED=1 && return 0 # system is fully deodexed, return + fi + + if grep "classes.dex" "$CM_TARGET" >/dev/null; then + return 0 # target apk|jar is already odexed, return + fi + + for ARCH in $ARCHES; do + BOOTOAT="$TMPDIR/boot_$ARCH.oat" + + local OAT="$(dirname "$OEM_TARGET")/oat/$ARCH/$(basename "$OEM_TARGET" ."${OEM_TARGET##*.}").odex" + + if get_file "$OAT" "$TMPDIR" "$SRC"; then + java -jar "$BAKSMALIJAR" -x -o "$TMPDIR/dexout" -c "$BOOTOAT" -d "$TMPDIR" "$TMPDIR/$(basename "$OAT")" + elif [[ "$CM_TARGET" =~ .jar$ ]]; then + # try to extract classes.dex from boot.oat for framework jars + java -jar "$BAKSMALIJAR" -x -o "$TMPDIR/dexout" -c "$BOOTOAT" -d "$TMPDIR" -e "/$OEM_TARGET" "$BOOTOAT" + else + continue + fi + + java -jar "$SMALIJAR" "$TMPDIR/dexout" -o "$TMPDIR/classes.dex" && break + done + + rm -rf "$TMPDIR/dexout" +} + +# # init_adb_connection: # # Starts adb server and waits for the device @@ -640,6 +730,18 @@ function extract() { fi fi + if [ "$?" == "0" ]; then + # Deodex apk|jar if that's the case + if [[ "$FULLY_DEODEXED" -ne "1" && "$DEST" =~ .(apk|jar)$ ]]; then + oat2dex "$DEST" "$FILE" "$SRC" + if [ -f "$TMPDIR/classes.dex" ]; then + zip -gjq "$DEST" "$TMPDIR/classes.dex" + rm "$TMPDIR/classes.dex" + printf ' (updated %s from odex files)\n' "/$FILE" + fi + fi + fi + local TYPE="${DIR##*/}" if [ "$TYPE" = "bin" -o "$TYPE" = "sbin" ]; then chmod 755 "$DEST" diff --git a/build/tools/smali/NOTICE b/build/tools/smali/NOTICE new file mode 100644 index 0000000..401799f --- /dev/null +++ b/build/tools/smali/NOTICE @@ -0,0 +1,105 @@ +The majority of smali/baksmali is written and copyrighted by me (Ben Gruver) +and released under the following license: + +******************************************************************************* +Copyright (c) 2010 Ben Gruver (JesusFreke) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +******************************************************************************* + + +Unless otherwise stated in the code/commit message, any changes with the +committer of bgruv@google.com is copyrighted by Google Inc. and released +under the following license: + +******************************************************************************* +Copyright 2011, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +******************************************************************************* + + +Various portions of the code are taken from the Android Open Source Project, +and are used in accordance with the following license: + +******************************************************************************* +Copyright (C) 2007 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. +******************************************************************************* + + +Some parts of the smalidea plugin are based on code from the IDEA project, per the +following license + +******************************************************************************* +Copyright 2000-2014 JetBrains s.r.o. + +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. +******************************************************************************* diff --git a/build/tools/smali/baksmali.jar b/build/tools/smali/baksmali.jar Binary files differnew file mode 100644 index 0000000..fe354fb --- /dev/null +++ b/build/tools/smali/baksmali.jar diff --git a/build/tools/smali/smali.jar b/build/tools/smali/smali.jar Binary files differnew file mode 100644 index 0000000..5459a87 --- /dev/null +++ b/build/tools/smali/smali.jar |