Merge "Implement range-based pin list" am: f90ec83802

am: ea3740650c

Change-Id: Iecce8926bde3610c0339cd8f22185e81c73a3a23
This commit is contained in:
Vic Yang 2019-07-11 15:52:30 -07:00 committed by android-build-merger
commit bebef49503
1 changed files with 46 additions and 20 deletions

View File

@ -381,9 +381,8 @@ class SignApk {
byte[] buffer = new byte[4096]; byte[] buffer = new byte[4096];
int num; int num;
List<Pattern> pinPatterns = extractPinPatterns(in); List<Hints.PatternWithRange> pinPatterns = extractPinPatterns(in);
ArrayList<Hints.ByteRange> pinByteRanges = pinPatterns == null ? null : new ArrayList<>(); ArrayList<Hints.ByteRange> pinByteRanges = pinPatterns == null ? null : new ArrayList<>();
HashSet<String> namesToPin = new HashSet<>();
ArrayList<String> names = new ArrayList<String>(); ArrayList<String> names = new ArrayList<String>();
for (Enumeration<JarEntry> e = in.entries(); e.hasMoreElements();) { for (Enumeration<JarEntry> e = in.entries(); e.hasMoreElements();) {
@ -399,13 +398,6 @@ class SignApk {
if (Hints.PIN_BYTE_RANGE_ZIP_ENTRY_NAME.equals(entryName)) { if (Hints.PIN_BYTE_RANGE_ZIP_ENTRY_NAME.equals(entryName)) {
continue; // We regenerate it below. continue; // We regenerate it below.
} }
if (pinPatterns != null) {
for (Pattern pinPattern : pinPatterns) {
if (pinPattern.matcher(entryName).matches()) {
namesToPin.add(entryName);
}
}
}
names.add(entryName); names.add(entryName);
} }
Collections.sort(names); Collections.sort(names);
@ -485,6 +477,7 @@ class SignApk {
DataSink entryDataSink = DataSink entryDataSink =
(inspectEntryRequest != null) ? inspectEntryRequest.getDataSink() : null; (inspectEntryRequest != null) ? inspectEntryRequest.getDataSink() : null;
long entryDataStart = outCounter.getWrittenBytes();
try (InputStream data = in.getInputStream(inEntry)) { try (InputStream data = in.getInputStream(inEntry)) {
while ((num = data.read(buffer)) > 0) { while ((num = data.read(buffer)) > 0) {
out.write(buffer, 0, num); out.write(buffer, 0, num);
@ -500,11 +493,27 @@ class SignApk {
inspectEntryRequest.done(); inspectEntryRequest.done();
} }
if (namesToPin.contains(name)) { if (pinPatterns != null) {
pinByteRanges.add( boolean pinFileHeader = false;
new Hints.ByteRange( for (Hints.PatternWithRange pinPattern : pinPatterns) {
entryHeaderStart, if (!pinPattern.matcher(name).matches()) {
outCounter.getWrittenBytes())); continue;
}
Hints.ByteRange dataRange =
new Hints.ByteRange(
entryDataStart,
outCounter.getWrittenBytes());
Hints.ByteRange pinRange =
pinPattern.ClampToAbsoluteByteRange(dataRange);
if (pinRange != null) {
pinFileHeader = true;
pinByteRanges.add(pinRange);
}
}
if (pinFileHeader) {
pinByteRanges.add(new Hints.ByteRange(entryHeaderStart,
entryDataStart));
}
} }
} }
@ -528,6 +537,7 @@ class SignApk {
DataSink entryDataSink = DataSink entryDataSink =
(inspectEntryRequest != null) ? inspectEntryRequest.getDataSink() : null; (inspectEntryRequest != null) ? inspectEntryRequest.getDataSink() : null;
long entryDataStart = outCounter.getWrittenBytes();
InputStream data = in.getInputStream(inEntry); InputStream data = in.getInputStream(inEntry);
while ((num = data.read(buffer)) > 0) { while ((num = data.read(buffer)) > 0) {
out.write(buffer, 0, num); out.write(buffer, 0, num);
@ -541,11 +551,27 @@ class SignApk {
inspectEntryRequest.done(); inspectEntryRequest.done();
} }
if (namesToPin.contains(name)) { if (pinPatterns != null) {
pinByteRanges.add( boolean pinFileHeader = false;
new Hints.ByteRange( for (Hints.PatternWithRange pinPattern : pinPatterns) {
entryHeaderStart, if (!pinPattern.matcher(name).matches()) {
outCounter.getWrittenBytes())); continue;
}
Hints.ByteRange dataRange =
new Hints.ByteRange(
entryDataStart,
outCounter.getWrittenBytes());
Hints.ByteRange pinRange =
pinPattern.ClampToAbsoluteByteRange(dataRange);
if (pinRange != null) {
pinFileHeader = true;
pinByteRanges.add(pinRange);
}
}
if (pinFileHeader) {
pinByteRanges.add(new Hints.ByteRange(entryHeaderStart,
entryDataStart));
}
} }
} }
@ -558,7 +584,7 @@ class SignApk {
} }
} }
private static List<Pattern> extractPinPatterns(JarFile in) throws IOException { private static List<Hints.PatternWithRange> extractPinPatterns(JarFile in) throws IOException {
ZipEntry pinMetaEntry = in.getEntry(Hints.PIN_HINT_ASSET_ZIP_ENTRY_NAME); ZipEntry pinMetaEntry = in.getEntry(Hints.PIN_HINT_ASSET_ZIP_ENTRY_NAME);
if (pinMetaEntry == null) { if (pinMetaEntry == null) {
return null; return null;