diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 244176f..7ed2ef1 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -106,7 +106,7 @@
- com.android.wallpaper/.nexus.NexusWallpaper
+ com.android.wallpaper.nexus.NexusWallpaper
0
1
@@ -148,6 +148,14 @@
- "usb0"
+
+
+ - "rmnet\\d"
+ - "ppp\\d"
+ - "eth\\d"
+
+
diff --git a/releasetools/releasetools.py b/releasetools/releasetools.py
new file mode 100644
index 0000000..cf561b7
--- /dev/null
+++ b/releasetools/releasetools.py
@@ -0,0 +1,119 @@
+# Copyright (C) 2010 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.
+
+import sha
+import re
+
+import common
+
+def FindRadio(zipfile):
+ matches = []
+ for name in zipfile.namelist():
+ if re.match(r"^RADIO/radio[.](.+[.])?img$", name):
+ matches.append(name)
+ if len(matches) > 1:
+ raise ValueError("multiple radio images in target-files zip!")
+ if matches:
+ print "using %s as radio.img" % (matches[0],)
+ return zipfile.read(matches[0])
+ else:
+ return None
+
+def FullOTA_InstallEnd(info):
+ try:
+ bootloader_img = info.input_zip.read("RADIO/bootloader.img")
+ except KeyError:
+ print "no bootloader.img in target_files; skipping install"
+ else:
+ common.ZipWriteStr(info.output_zip, "bootloader.img", bootloader_img)
+ info.script.Print("Writing bootloader...")
+ info.script.WriteRawImage("/bootloader", "bootloader.img")
+
+ radio_img = FindRadio(info.input_zip)
+ if not radio_img:
+ print "no radio.img in target_files; skipping install"
+ else:
+ common.ZipWriteStr(info.output_zip, "radio.img", radio_img)
+ info.script.Print("Writing radio...")
+ info.script.WriteRawImage("/radio", "radio.img")
+
+def IncrementalOTA_VerifyEnd(info):
+ target_radio_img = FindRadio(info.target_zip)
+ source_radio_img = FindRadio(info.source_zip)
+ if not target_radio_img or not source_radio_img: return
+ if source_radio_img != target_radio_img:
+ info.script.CacheFreeSpaceCheck(len(source_radio_img))
+ radio_type, radio_device = common.GetTypeAndDevice("/radio", info.info_dict)
+ info.script.PatchCheck("%s:%s:%d:%s:%d:%s" % (
+ radio_type, radio_device,
+ len(source_radio_img), sha.sha(source_radio_img).hexdigest(),
+ len(target_radio_img), sha.sha(target_radio_img).hexdigest()))
+
+def IncrementalOTA_InstallEnd(info):
+ try:
+ target_bootloader_img = info.target_zip.read("RADIO/bootloader.img")
+ try:
+ source_bootloader_img = info.source_zip.read("RADIO/bootloader.img")
+ except KeyError:
+ source_bootloader_img = None
+
+ if source_bootloader_img == target_bootloader_img:
+ print "bootloader unchanged; skipping"
+ else:
+ common.ZipWriteStr(info.output_zip, "bootloader.img", target_bootloader_img)
+ info.script.Print("Writing bootloader...")
+ info.script.WriteRawImage("/bootloader", "bootloader.img")
+
+ except KeyError:
+ print "no bootloader.img in target target_files; skipping install"
+
+
+ tf = FindRadio(info.target_zip)
+ if not tf:
+ # failed to read TARGET radio image: don't include any radio in update.
+ print "no radio.img in target target_files; skipping install"
+ else:
+ tf = common.File("radio.img", tf)
+
+ sf = FindRadio(info.source_zip)
+ if not sf:
+ # failed to read SOURCE radio image: include the whole target
+ # radio image.
+ tf.AddToZip(info.output_zip)
+ info.script.Print("Writing radio...")
+ info.script.WriteRawImage("/radio", tf.name)
+ else:
+ sf = common.File("radio.img", sf)
+
+ if tf.sha1 == sf.sha1:
+ print "radio image unchanged; skipping"
+ else:
+ diff = common.Difference(tf, sf)
+ common.ComputeDifferences([diff])
+ _, _, d = diff.GetPatch()
+ if d is None or len(d) > tf.size * common.OPTIONS.patch_threshold:
+ # computing difference failed, or difference is nearly as
+ # big as the target: simply send the target.
+ tf.AddToZip(info.output_zip)
+ info.script.Print("Writing radio...")
+ info.script.WriteRawImage("radio", tf.name)
+ else:
+ common.ZipWriteStr(info.output_zip, "radio.img.p", d)
+ info.script.Print("Patching radio...")
+ radio_type, radio_device = common.GetTypeAndDevice(
+ "/radio", info.info_dict)
+ info.script.ApplyPatch(
+ "%s:%s:%d:%s:%d:%s" % (radio_type, radio_device,
+ sf.size, sf.sha1, tf.size, tf.sha1),
+ "-", tf.size, tf.sha1, sf.sha1, "radio.img.p")