Merge commit 'd54f8c2d1b4d88db84465fee93aa29103ca32078' into HEAD
Change-Id: I3cf53f083dee277a450dac36b011bc83180f6294
This commit is contained in:
commit
722581a598
19 changed files with 212 additions and 57 deletions
|
@ -205,6 +205,9 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
|
|||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*)
|
||||
|
||||
# 4.4.1
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
|
||||
|
||||
# ************************************************
|
||||
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||
# ************************************************
|
||||
|
|
|
@ -1262,6 +1262,7 @@ ifdef PRODUCT_EXTRA_RECOVERY_KEYS
|
|||
endif
|
||||
$(hide) echo 'mkbootimg_args=$(BOARD_MKBOOTIMG_ARGS)' >> $(zip_root)/META/misc_info.txt
|
||||
$(hide) echo "use_set_metadata=1" >> $(zip_root)/META/misc_info.txt
|
||||
$(hide) echo "update_rename_support=1" >> $(zip_root)/META/misc_info.txt
|
||||
$(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt)
|
||||
@# Zip everything up, preserving symlinks
|
||||
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
|
||||
|
|
|
@ -15,7 +15,9 @@ endif
|
|||
$(foreach header,$(LOCAL_COPY_HEADERS), \
|
||||
$(eval _chFrom := $(LOCAL_PATH)/$(header)) \
|
||||
$(eval _chTo := \
|
||||
$($(my_prefix)OUT_HEADERS)/$(LOCAL_COPY_HEADERS_TO)/$(notdir $(header))) \
|
||||
$(if $(LOCAL_COPY_HEADERS_TO),\
|
||||
$($(my_prefix)OUT_HEADERS)/$(LOCAL_COPY_HEADERS_TO)/$(notdir $(header)),\
|
||||
$($(my_prefix)OUT_HEADERS)/$(notdir $(header)))) \
|
||||
$(eval $(call copy-one-header,$(_chFrom),$(_chTo))) \
|
||||
$(eval all_copied_headers: $(_chTo)) \
|
||||
)
|
||||
|
|
|
@ -23,6 +23,7 @@ PRODUCT_PACKAGES += \
|
|||
android.test.runner \
|
||||
app_process \
|
||||
applypatch \
|
||||
blkid \
|
||||
bmgr \
|
||||
bugreport \
|
||||
content \
|
||||
|
|
|
@ -33,6 +33,8 @@ PRODUCT_PACKAGES += \
|
|||
bu \
|
||||
com.android.location.provider \
|
||||
com.android.location.provider.xml \
|
||||
com.android.media.remotedisplay \
|
||||
com.android.media.remotedisplay.xml \
|
||||
drmserver \
|
||||
framework-res \
|
||||
installd \
|
||||
|
|
|
@ -49,6 +49,9 @@ PRODUCT_PROPERTY_OVERRIDES := \
|
|||
# Put en_US first in the list, so make it default.
|
||||
PRODUCT_LOCALES := en_US
|
||||
|
||||
# Include drawables for all densities
|
||||
PRODUCT_AAPT_CONFIG := normal hdpi xhdpi xxhdpi
|
||||
|
||||
# Get some sounds
|
||||
$(call inherit-product-if-exists, frameworks/base/data/sounds/AllAudio.mk)
|
||||
|
||||
|
|
|
@ -393,6 +393,17 @@ video.with-shadow {
|
|||
#nav li ul.tree-list-children ul {
|
||||
display:block; }
|
||||
|
||||
#nav.samples-nav li li li {
|
||||
font-size:13px;
|
||||
}
|
||||
#nav.samples-nav li li li a {
|
||||
padding-top:3px;
|
||||
padding-bottom:3px;
|
||||
}
|
||||
#nav.samples-nav li li ul > li:last-child {
|
||||
padding-bottom:3px;
|
||||
}
|
||||
|
||||
.new,
|
||||
.new-child {
|
||||
font-size: .78em;
|
||||
|
@ -860,7 +871,40 @@ scroll top left;
|
|||
.framed-nexus4-port-216 img {
|
||||
width: 216px;
|
||||
height: 360px; }
|
||||
|
||||
.framed-nexus5-port-span-5 {
|
||||
background: transparent url(../images/styles/device_nexus5_blank_port_span5.png) no-repeat
|
||||
scroll top left;
|
||||
padding: 52px 33px 69px 31px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.framed-nexus5-port-span-5,
|
||||
.framed-nexus5-port-span-5 video,
|
||||
.framed-nexus5-port-span-5 img {
|
||||
width: 216px;
|
||||
height: 384px;
|
||||
}
|
||||
|
||||
.framed-nexus5-land-span-13 {
|
||||
background: transparent url(../images/styles/device_nexus5_blank_land_span13.png) no-repeat scroll top left;
|
||||
padding: 36px 119px 54px 108px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.framed-nexus5-land-span-13,
|
||||
.framed-nexus5-land-span-13 video,
|
||||
.framed-nexus5-land-span-13 img {
|
||||
width: 533px;
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.framed-nexus5-port-span-5,
|
||||
.framed-nexus5-port-span-5 video,
|
||||
.framed-nexus5-port-span-5 img {
|
||||
width: 216px;
|
||||
height: 384px;
|
||||
}
|
||||
|
||||
/* landing page disclosures */
|
||||
.landing-page-link {
|
||||
|
@ -1123,6 +1167,9 @@ li dl {
|
|||
margin-top:5px;
|
||||
margin-bottom:5px;
|
||||
}
|
||||
dl dd dl:first-child {
|
||||
margin-top:0;
|
||||
}
|
||||
pre strong, pre b, a strong, a b, a code {
|
||||
color: inherit;
|
||||
}
|
||||
|
@ -2105,16 +2152,15 @@ pre {
|
|||
border: solid 1px #ddd;
|
||||
background: #f7f7f7;
|
||||
}
|
||||
.str { color: #080; }
|
||||
.str { color: #800; } /* Code string */
|
||||
.kwd { color: #008; }
|
||||
.com { color: #800; }
|
||||
.typ { color: #606; }
|
||||
.lit { color: #066; }
|
||||
.pun { color: #660; }
|
||||
.pln { color: #000; }
|
||||
.tag { color: #008; }
|
||||
.atn { color: #828; }
|
||||
.atv { color: #080; }
|
||||
.atv { color: #800; } /* XML string */
|
||||
.dec { color: #606; }
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
|
@ -2450,13 +2496,12 @@ Lightbox
|
|||
background-position: -10px 0;
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Styles for samples project trees and code browsing in resources tab
|
||||
*/
|
||||
|
||||
#codesample-wrapper {
|
||||
width:1000px;
|
||||
width:100000px; /* super wide to contain floats, but doesn't cause scroll */
|
||||
overflow:visible;
|
||||
}
|
||||
pre#codesample-block {
|
||||
|
@ -2465,6 +2510,9 @@ pre#codesample-block {
|
|||
background:transparent;
|
||||
border:none;
|
||||
}
|
||||
pre#codesample-block a.number {
|
||||
display:none;
|
||||
}
|
||||
pre#codesample-block .code-line:hover {
|
||||
background:#e7e7e7;
|
||||
}
|
||||
|
@ -2823,7 +2871,9 @@ div.design-announce p {
|
|||
}
|
||||
|
||||
/* notice box for cross links between Design/Develop docs */
|
||||
a.notice-developers-video,
|
||||
a.notice-developers,
|
||||
a.notice-designers-video,
|
||||
a.notice-designers {
|
||||
float:right;
|
||||
clear:right;
|
||||
|
@ -2832,11 +2882,15 @@ a.notice-designers {
|
|||
margin:0 0 20px 20px;
|
||||
border:1px solid #ddd;
|
||||
}
|
||||
a.notice-developers-video.wide,
|
||||
a.notice-developers.wide,
|
||||
a.notice-designers-video.wide,
|
||||
a.notice-designers.wide {
|
||||
width:278px;
|
||||
}
|
||||
a.notice-developers-video div,
|
||||
a.notice-developers div,
|
||||
a.notice-designers-video div,
|
||||
a.notice-designers div {
|
||||
min-height:40px;
|
||||
background:url('../images/styles/notice-developers@2x.png') no-repeat 10px 10px;
|
||||
|
@ -2847,24 +2901,41 @@ a.notice-designers div {
|
|||
background:url('../images/styles/notice-designers@2x.png') no-repeat 10px 10px;
|
||||
background-size:40px 40px;
|
||||
}
|
||||
a.notice-designers-video div {
|
||||
background:url('../images/styles/notice-designers-video@2x.png') no-repeat 10px 10px;
|
||||
background-size:40px 40px;
|
||||
}
|
||||
a.notice-developers-video div {
|
||||
background:url('../images/styles/notice-developers-video@2x.png') no-repeat 10px 10px;
|
||||
background-size:40px 40px;
|
||||
}
|
||||
a.notice-developers-video:hover,
|
||||
a.notice-developers:hover,
|
||||
a.notice-designers-video:hover,
|
||||
a.notice-designers:hover {
|
||||
background:#eee;
|
||||
}
|
||||
a.notice-developers-video h3,
|
||||
a.notice-developers h3,
|
||||
a.notice-designers-video h3,
|
||||
a.notice-designers h3 {
|
||||
font-size:14px;
|
||||
font-weight:normal;
|
||||
font-size:13px;
|
||||
line-height:18px;
|
||||
font-weight:bold;
|
||||
text-transform:uppercase;
|
||||
color:#000 !important;
|
||||
margin:0;
|
||||
margin:0 0 1px;
|
||||
}
|
||||
a.notice-developers-video p,
|
||||
a.notice-developers p,
|
||||
a.notice-designers-video p,
|
||||
a.notice-designers p {
|
||||
margin:0;
|
||||
line-height:16px;
|
||||
line-height:14px;
|
||||
}
|
||||
a.notice-developers-video.left,
|
||||
a.notice-developers.left,
|
||||
a.notice-designers-video.left,
|
||||
a.notice-designers.left {
|
||||
margin-left:0;
|
||||
float:left;
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
|
@ -241,7 +241,7 @@ false; // navigate across topic boundaries only in design docs
|
|||
var training = $(".next-class-link").length; // decides whether to provide "next class" link
|
||||
var isCrossingBoundary = false;
|
||||
|
||||
if ($selListItem.hasClass('nav-section')) {
|
||||
if ($selListItem.hasClass('nav-section') && $selListItem.children('div.empty').length == 0) {
|
||||
// we're on an index page, jump to the first topic
|
||||
$nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)');
|
||||
|
||||
|
@ -262,12 +262,17 @@ false; // navigate across topic boundaries only in design docs
|
|||
} else {
|
||||
// jump to the next topic in this section (if it exists)
|
||||
$nextLink = $selListItem.next('li').find('a:eq(0)');
|
||||
if (!$nextLink.length) {
|
||||
if ($nextLink.length == 0) {
|
||||
isCrossingBoundary = true;
|
||||
// no more topics in this section, jump to the first topic in the next section
|
||||
$nextLink = $selListItem.parents('li:eq(0)').next('li.nav-section').find('a:eq(0)');
|
||||
if (!$nextLink.length) { // Go up another layer to look for next page (lesson > class > course)
|
||||
$nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)');
|
||||
if ($nextLink.length == 0) {
|
||||
// if that doesn't work, we're at the end of the list, so disable NEXT link
|
||||
$('.next-page-link').attr('href','').addClass("disabled")
|
||||
.click(function() { return false; });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -285,10 +290,11 @@ false; // navigate across topic boundaries only in design docs
|
|||
$('.next-page-link').attr('href','')
|
||||
.removeClass("hide").addClass("disabled")
|
||||
.click(function() { return false; });
|
||||
|
||||
$('.next-class-link').attr('href',$nextLink.attr('href'))
|
||||
.removeClass("hide").append($nextLink.html());
|
||||
$('.next-class-link').find('.new').empty();
|
||||
if ($nextLink.length) {
|
||||
$('.next-class-link').attr('href',$nextLink.attr('href'))
|
||||
.removeClass("hide").append($nextLink.html());
|
||||
$('.next-class-link').find('.new').empty();
|
||||
}
|
||||
} else {
|
||||
$('.next-page-link').attr('href', $nextLink.attr('href')).removeClass("hide");
|
||||
}
|
||||
|
@ -567,7 +573,7 @@ function initExpandableNavItems(rootTag) {
|
|||
} else {
|
||||
/* show me */
|
||||
// first hide all other siblings
|
||||
var $others = $('li.nav-section.expanded', $(this).closest('ul'));
|
||||
var $others = $('li.nav-section.expanded', $(this).closest('ul')).not('.sticky');
|
||||
$others.removeClass('expanded').children('ul').slideUp(250);
|
||||
|
||||
// now expand me
|
||||
|
@ -2156,12 +2162,6 @@ google.setOnLoadCallback(function(){
|
|||
|
||||
// when an event on the browser history occurs (back, forward, load) requery hash and do search
|
||||
$(window).hashchange( function(){
|
||||
// Handle hash changes in the samples browser
|
||||
if ($("body").hasClass("samples") && location.href.indexOf("/samples/index.html") != -1) {
|
||||
showSamples();
|
||||
highlightSidenav();
|
||||
resizeNav();
|
||||
}
|
||||
// Exit if the hash isn't a search query or there's an error in the query
|
||||
if ((location.hash.indexOf("q=") == -1) || (query == "undefined")) {
|
||||
// If the results pane is open, close it.
|
||||
|
@ -2382,7 +2382,8 @@ function toggleVisisbleApis(selectedLevel, context) {
|
|||
// Grey things out that aren't available and give a tooltip title
|
||||
if (apiLevelNum > selectedLevelNum) {
|
||||
obj.addClass("absent").attr("title","Requires API Level \""
|
||||
+ apiLevel + "\" or higher");
|
||||
+ apiLevel + "\" or higher. To reveal, change the target API level "
|
||||
+ "above the left navigation.");
|
||||
}
|
||||
else obj.removeClass("absent").removeAttr("title");
|
||||
});
|
||||
|
@ -2710,6 +2711,9 @@ function init_google_navtree2(navtree_id, data)
|
|||
$containerUl.append(new_google_node2(node_data));
|
||||
}
|
||||
|
||||
// Make all third-generation list items 'sticky' to prevent them from collapsing
|
||||
$containerUl.find('li li li.nav-section').addClass('sticky');
|
||||
|
||||
initExpandableNavItems("#"+navtree_id);
|
||||
}
|
||||
|
||||
|
@ -2722,9 +2726,11 @@ function new_google_node2(node_data)
|
|||
var $li = $('<li>');
|
||||
var $a;
|
||||
if (node_data[NODE_HREF] != null) {
|
||||
$a = $('<a href="' + toRoot + node_data[NODE_HREF] + '">' + linkText + '</a>');
|
||||
$a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >'
|
||||
+ linkText + '</a>');
|
||||
} else {
|
||||
$a = $('<a href="#" onclick="return false;">' + linkText + '/</a>');
|
||||
$a = $('<a href="#" onclick="return false;" title="' + linkText + '" >'
|
||||
+ linkText + '/</a>');
|
||||
}
|
||||
var $childUl = $('<ul>');
|
||||
if (node_data[NODE_CHILDREN] != null) {
|
||||
|
@ -2791,9 +2797,18 @@ function init_default_samples_navtree(toroot) {
|
|||
$.getScript(toRoot + 'samples_navtree_data.js', function(data, textStatus, jqxhr) {
|
||||
// when the file is loaded, initialize the tree
|
||||
if(jqxhr.status === 200) {
|
||||
// hack to remove the "about the samples" link then put it back in
|
||||
// after we nuke the list to remove the dummy static list of samples
|
||||
var $firstLi = $("#nav.samples-nav > li:first-child").clone();
|
||||
$("#nav.samples-nav").empty();
|
||||
$("#nav.samples-nav").append($firstLi);
|
||||
|
||||
init_google_navtree2("nav.samples-nav", SAMPLES_NAVTREE_DATA);
|
||||
highlightSidenav();
|
||||
resizeNav();
|
||||
if ($("#jd-content #samples").length) {
|
||||
showSamples();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -2943,10 +2958,31 @@ function selectText(element) {
|
|||
range.moveToElementText(element);
|
||||
range.select();
|
||||
} else if (window.getSelection) { //all others
|
||||
selection = window.getSelection();
|
||||
selection = window.getSelection();
|
||||
range = doc.createRange();
|
||||
range.selectNodeContents(element);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/** Display links and other information about samples that match the
|
||||
group specified by the URL */
|
||||
function showSamples() {
|
||||
var group = $("#samples").attr('class');
|
||||
$("#samples").html("<p>Here are some samples for <b>" + group + "</b> apps:</p>");
|
||||
|
||||
var $ul = $("<ul>");
|
||||
$selectedLi = $("#nav li.selected");
|
||||
|
||||
$selectedLi.children("ul").children("li").each(function() {
|
||||
var $li = $("<li>").append($(this).find("a").first().clone());
|
||||
$ul.append($li);
|
||||
});
|
||||
|
||||
$("#samples").append($ul);
|
||||
|
||||
}
|
||||
|
|
|
@ -214,7 +214,8 @@ def:default_left_nav() ?>
|
|||
<a class="totop" href="#top" data-g-event="left-nav-top">to top</a>
|
||||
<div id="api-nav-header">
|
||||
<div id="api-level-toggle">
|
||||
<label for="apiLevelCheckbox" class="disabled">API level: </label>
|
||||
<label for="apiLevelCheckbox" class="disabled"
|
||||
title="Select your target API level to dim unavailable APIs">API level: </label>
|
||||
<div class="select-wrapper">
|
||||
<select id="apiLevelSelector">
|
||||
<!-- option elements added by buildApiLevelSelector() -->
|
||||
|
@ -239,7 +240,7 @@ def:default_left_nav() ?>
|
|||
<div id="packages-nav" class="scroll-pane">
|
||||
|
||||
<ul>
|
||||
<?cs call:package_link_list(docs.packages) ?>
|
||||
<?cs call:package_link_list(docs.packages) ?>
|
||||
</ul><br/>
|
||||
|
||||
</div> <!-- end packages-nav -->
|
||||
|
|
|
@ -19,11 +19,9 @@
|
|||
| <a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/project.html">Project</a>
|
||||
| <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip">Download</a>
|
||||
|
||||
</div><!-- end sum-details-links -->
|
||||
<div class="api-level">
|
||||
Other info
|
||||
</div>
|
||||
</div> <!-- end api-info-block -->
|
||||
</div><!-- end sum-details-links -->
|
||||
|
||||
</div><!-- end breadcurmb block -->
|
||||
|
||||
<div id="jd-header" style="border:0;">
|
||||
|
||||
|
@ -57,11 +55,6 @@
|
|||
<pre id="codesample-block"><?cs var:fileContents ?></pre>
|
||||
</div>
|
||||
|
||||
<h3 id="file-location" style="clear:left">Source file location</h3>
|
||||
<p>The file containing the source code shown below is located in the corresponding directory in
|
||||
<code><sdk>/samples/android-<version>/...</code></p>
|
||||
|
||||
|
||||
<!-- end file contents -->
|
||||
<script type="text/javascript">
|
||||
initCodeLineNumbers();
|
||||
|
@ -74,11 +67,6 @@
|
|||
# else, this means it's offline docs,
|
||||
so don't show src links (we dont have the pages!) ?>
|
||||
|
||||
<p>You can find the source code for this sample in your SDK at:</p>
|
||||
<p style="margin-left:2em">
|
||||
<code><em><sdk></em>/samples/android-<em><version></em>/</code>
|
||||
</p>
|
||||
|
||||
<?cs /if ?><?cs # end if/else online docs ?>
|
||||
|
||||
</div> <!-- end jd-content -->
|
||||
|
|
|
@ -23,9 +23,7 @@
|
|||
| <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip">Download</a>
|
||||
|
||||
</div><!-- end sum-details-links -->
|
||||
<div class="api-level">
|
||||
Other info
|
||||
</div>
|
||||
|
||||
</div><!-- end breadcurmb block -->
|
||||
|
||||
<h1 itemprop="name"><?cs var:projectDir ?></h1>
|
||||
|
@ -79,11 +77,6 @@
|
|||
# else, this means it's offline docs,
|
||||
so don't show src links (we dont have the pages!) ?>
|
||||
|
||||
<p>You can find the source code for this sample in your SDK at:</p>
|
||||
<p style="margin-left:2em">
|
||||
<code><em><sdk></em>/samples/android-<em><version></em>/</code>
|
||||
</p>
|
||||
|
||||
<?cs /if ?><?cs # end if/else online docs ?>
|
||||
|
||||
</div> <!-- end jd-content -->
|
||||
|
|
|
@ -184,6 +184,11 @@ class EdifyGenerator(object):
|
|||
cmd = "delete(" + ",\0".join(['"%s"' % (i,) for i in file_list]) + ");"
|
||||
self.script.append(self._WordWrap(cmd))
|
||||
|
||||
def RenameFile(self, srcfile, tgtfile):
|
||||
"""Moves a file from one location to another."""
|
||||
if self.info.get("update_rename_support", False):
|
||||
self.script.append('rename("%s", "%s");' % (srcfile, tgtfile))
|
||||
|
||||
def ApplyPatch(self, srcfile, tgtfile, tgtsize, tgtsha1, *patchpairs):
|
||||
"""Apply binary patches (in *patchpairs) to the given srcfile to
|
||||
produce tgtfile (which may be "-" to indicate overwriting the
|
||||
|
|
|
@ -108,6 +108,31 @@ def IsRegular(info):
|
|||
symlink."""
|
||||
return (info.external_attr >> 28) == 010
|
||||
|
||||
def ClosestFileMatch(src, tgtfiles, existing):
|
||||
"""Returns the closest file match between a source file and list
|
||||
of potential matches. The exact filename match is preferred,
|
||||
then the sha1 is searched for, and finally a file with the same
|
||||
basename is evaluated. Rename support in the updater-binary is
|
||||
required for the latter checks to be used."""
|
||||
|
||||
result = tgtfiles.get("path:" + src.name)
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
if not OPTIONS.target_info_dict.get("update_rename_support", False):
|
||||
return None
|
||||
|
||||
if src.size < 1000:
|
||||
return None
|
||||
|
||||
result = tgtfiles.get("sha1:" + src.sha1)
|
||||
if result is not None and existing.get(result.name) is None:
|
||||
return result
|
||||
result = tgtfiles.get("file:" + src.name.split("/")[-1])
|
||||
if result is not None and existing.get(result.name) is None:
|
||||
return result
|
||||
return None
|
||||
|
||||
class Item:
|
||||
"""Items represent the metadata (user, group, mode) of files and
|
||||
directories in the system image."""
|
||||
|
@ -514,11 +539,27 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
verbatim_targets = []
|
||||
patch_list = []
|
||||
diffs = []
|
||||
renames = {}
|
||||
largest_source_size = 0
|
||||
|
||||
matching_file_cache = {}
|
||||
for fn in source_data.keys():
|
||||
sf = source_data[fn]
|
||||
assert fn == sf.name
|
||||
matching_file_cache["path:" + fn] = sf
|
||||
# Only allow eligability for filename/sha matching
|
||||
# if there isn't a perfect path match.
|
||||
if target_data.get(sf.name) is None:
|
||||
matching_file_cache["file:" + fn.split("/")[-1]] = sf
|
||||
matching_file_cache["sha:" + sf.sha1] = sf
|
||||
|
||||
for fn in sorted(target_data.keys()):
|
||||
tf = target_data[fn]
|
||||
assert fn == tf.name
|
||||
sf = source_data.get(fn, None)
|
||||
sf = ClosestFileMatch(tf, matching_file_cache, renames)
|
||||
if sf is not None and sf.name != tf.name:
|
||||
print "File has moved from " + sf.name + " to " + tf.name
|
||||
renames[sf.name] = tf
|
||||
|
||||
if sf is None or fn in OPTIONS.require_verbatim:
|
||||
# This file should be included verbatim
|
||||
|
@ -531,7 +572,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
# File is different; consider sending as a patch
|
||||
diffs.append(common.Difference(tf, sf))
|
||||
else:
|
||||
# Target file identical to source.
|
||||
# Target file data identical to source (may still be renamed)
|
||||
pass
|
||||
|
||||
common.ComputeDifferences(diffs)
|
||||
|
@ -543,8 +584,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
tf.AddToZip(output_zip)
|
||||
verbatim_targets.append((tf.name, tf.size))
|
||||
else:
|
||||
common.ZipWriteStr(output_zip, "patch/" + tf.name + ".p", d)
|
||||
patch_list.append((tf.name, tf, sf, tf.size, common.sha1(d).hexdigest()))
|
||||
common.ZipWriteStr(output_zip, "patch/" + sf.name + ".p", d)
|
||||
patch_list.append((sf.name, tf, sf, tf.size, common.sha1(d).hexdigest()))
|
||||
largest_source_size = max(largest_source_size, sf.size)
|
||||
|
||||
source_fp = GetBuildProp("ro.build.fingerprint", OPTIONS.source_info_dict)
|
||||
|
@ -626,7 +667,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
script.Print("Removing unneeded files...")
|
||||
script.DeleteFiles(["/"+i[0] for i in verbatim_targets] +
|
||||
["/"+i for i in sorted(source_data)
|
||||
if i not in target_data] +
|
||||
if i not in target_data and
|
||||
i not in renames] +
|
||||
["/system/recovery.img"])
|
||||
|
||||
script.ShowProgress(0.8, 0)
|
||||
|
@ -713,6 +755,13 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
|
|||
script.Print("Unpacking new recovery...")
|
||||
script.UnpackPackageDir("recovery", "/system")
|
||||
|
||||
if len(renames) > 0:
|
||||
script.Print("Renaming files...")
|
||||
|
||||
for src in renames:
|
||||
print "Renaming " + src + " to " + renames[src].name
|
||||
script.RenameFile(src, renames[src].name)
|
||||
|
||||
script.Print("Symlinks and permissions...")
|
||||
|
||||
# Create all the symlinks that don't already exist, or point to
|
||||
|
|
Loading…
Reference in a new issue