diff --git a/engine/src/flutter/ci/licenses.sh b/engine/src/flutter/ci/licenses.sh index 40bb4b9eb55..a8452f36edc 100755 --- a/engine/src/flutter/ci/licenses.sh +++ b/engine/src/flutter/ci/licenses.sh @@ -42,7 +42,7 @@ fi echo "Checking license count in licenses_flutter..." actualLicenseCount=`tail -n 1 flutter/ci/licenses_golden/licenses_flutter | tr -dc '0-9'` -expectedLicenseCount=3 # When changing this number: Update the error message below as well describing all expected license types. +expectedLicenseCount=2 # When changing this number: Update the error message below as well describing all expected license types. if [ "$actualLicenseCount" -ne "$expectedLicenseCount" ] then diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index ada715328d9..3860a973fe4 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -695,40 +695,6 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ==================================================================================================== -==================================================================================================== -LIBRARY: engine -ORIGIN: ../../../flutter/shell/platform/android/io/flutter/util/BSDiff.java + ../../../flutter/LICENSE -TYPE: LicenseType.bsd -FILE: ../../../flutter/shell/platform/android/io/flutter/util/BSDiff.java ----------------------------------------------------------------------------------------------------- -Copyright 2003-2005 Colin Percival. All rights reserved. -Copyright 2013 The Flutter Authors. 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. -==================================================================================================== - ==================================================================================================== LIBRARY: txt ORIGIN: ../../../flutter/third_party/txt/LICENSE @@ -1015,4 +981,4 @@ 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. ==================================================================================================== -Total license count: 3 +Total license count: 2 diff --git a/engine/src/flutter/shell/platform/android/BUILD.gn b/engine/src/flutter/shell/platform/android/BUILD.gn index 37002cf5fd4..b6560fca387 100644 --- a/engine/src/flutter/shell/platform/android/BUILD.gn +++ b/engine/src/flutter/shell/platform/android/BUILD.gn @@ -149,7 +149,6 @@ java_library("flutter_shell_java") { "io/flutter/plugin/platform/PlatformViewsController.java", "io/flutter/plugin/platform/SingleViewPresentation.java", "io/flutter/plugin/platform/VirtualDisplayController.java", - "io/flutter/util/BSDiff.java", "io/flutter/util/PathUtils.java", "io/flutter/util/Preconditions.java", "io/flutter/util/Predicate.java", diff --git a/engine/src/flutter/shell/platform/android/io/flutter/util/BSDiff.java b/engine/src/flutter/shell/platform/android/io/flutter/util/BSDiff.java deleted file mode 100644 index 3b0295dc68b..00000000000 --- a/engine/src/flutter/shell/platform/android/io/flutter/util/BSDiff.java +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2003-2005 Colin Percival. All rights reserved. -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.util; - -import java.io.*; -import java.util.zip.GZIPInputStream; - -/** - * This is a Java port of algorithm from Flutter framework bsdiff.dart. - * Note that this port uses 32-bit ints, which limits data size to 2GB. - **/ -public abstract class BSDiff { - public static byte[] bspatch(byte[] olddata, byte[] diffdata) throws IOException { - InputStream in = new ByteArrayInputStream(diffdata, 0, diffdata.length); - DataInputStream header = new DataInputStream(in); - - byte[] magic = new byte[8]; - header.read(magic); - if (!new String(magic).equals("BZDIFF40")) { - throw new IOException("Invalid magic"); - } - - int ctrllen = (int) header.readLong(); - int datalen = (int) header.readLong(); - int newsize = (int) header.readLong(); - header.close(); - - in = new ByteArrayInputStream(diffdata, 0, diffdata.length); - in.skip(32); - DataInputStream cpf = new DataInputStream(new GZIPInputStream(in)); - - in = new ByteArrayInputStream(diffdata, 0, diffdata.length); - in.skip(32 + ctrllen); - InputStream dpf = new GZIPInputStream(in); - - in = new ByteArrayInputStream(diffdata, 0, diffdata.length); - in.skip(32 + ctrllen + datalen); - InputStream epf = new GZIPInputStream(in); - - byte[] newdata = new byte[newsize]; - - int oldpos = 0; - int newpos = 0; - - while (newpos < newsize) { - int[] ctrl = new int[3]; - for (int i = 0; i <= 2; i++) { - ctrl[i] = (int) cpf.readLong(); - } - if (newpos + ctrl[0] > newsize) { - throw new IOException("Invalid ctrl[0]"); - } - - read(dpf, newdata, newpos, ctrl[0]); - - for (int i = 0; i < ctrl[0]; i++) { - if ((oldpos + i >= 0) && (oldpos + i < olddata.length)) { - newdata[newpos + i] += olddata[oldpos + i]; - } - } - - newpos += ctrl[0]; - oldpos += ctrl[0]; - - if (newpos + ctrl[1] > newsize) { - throw new IOException("Invalid ctrl[0]"); - } - - read(epf, newdata, newpos, ctrl[1]); - - newpos += ctrl[1]; - oldpos += ctrl[2]; - } - - cpf.close(); - dpf.close(); - epf.close(); - - return newdata; - } - - private static void read(InputStream in, byte[] buf, int off, int len) throws IOException { - for (int i, n = 0; n < len; n += i) { - if ((i = in.read(buf, off + n, len - n)) < 0) { - throw new IOException("Unexpected EOF"); - } - } - } -} diff --git a/engine/src/flutter/shell/platform/android/io/flutter/view/ResourceExtractor.java b/engine/src/flutter/shell/platform/android/io/flutter/view/ResourceExtractor.java index b44bace5f0a..a0e2f0965ad 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/view/ResourceExtractor.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/view/ResourceExtractor.java @@ -11,7 +11,6 @@ import android.content.res.AssetManager; import android.os.AsyncTask; import android.os.Build; import android.util.Log; -import io.flutter.util.BSDiff; import io.flutter.util.PathUtils; import org.json.JSONObject; @@ -20,7 +19,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; -import java.util.zip.GZIPInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -31,6 +29,8 @@ class ResourceExtractor { private static final String TAG = "ResourceExtractor"; private static final String TIMESTAMP_PREFIX = "res_timestamp-"; + private static final int BUFFER_SIZE = 16 * 1024; + @SuppressWarnings("deprecation") static long getVersionCode(PackageInfo packageInfo) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { @@ -177,6 +177,7 @@ class ResourceExtractor { private boolean extractAPK(File dataDir) { final AssetManager manager = mContext.getResources().getAssets(); + byte[] buffer = null; for (String asset : mResources) { try { final File output = new File(dataDir, asset); @@ -189,10 +190,18 @@ class ResourceExtractor { try (InputStream is = manager.open(asset); OutputStream os = new FileOutputStream(output)) { - copy(is, os); - } + if (buffer == null) { + buffer = new byte[BUFFER_SIZE]; + } - Log.i(TAG, "Extracted baseline resource " + asset); + int count = 0; + while ((count = is.read(buffer, 0, BUFFER_SIZE)) != -1) { + os.write(buffer, 0, count); + } + + os.flush(); + Log.i(TAG, "Extracted baseline resource " + asset); + } } catch (FileNotFoundException fnfe) { continue; @@ -210,8 +219,6 @@ class ResourceExtractor { /// Returns true if successfully unpacked update resources or if there is no update, /// otherwise deletes all resources and returns false. private boolean extractUpdate(File dataDir) { - final AssetManager manager = mContext.getResources().getAssets(); - ResourceUpdater resourceUpdater = FlutterMain.getResourceUpdater(); if (resourceUpdater == null) { return true; @@ -238,15 +245,11 @@ class ResourceExtractor { return false; } + byte[] buffer = null; for (String asset : mResources) { - boolean useDiff = false; ZipEntry entry = zipFile.getEntry(asset); if (entry == null) { - useDiff = true; - entry = zipFile.getEntry(asset + ".bzdiff40"); - if (entry == null) { - continue; - } + continue; } final File output = new File(dataDir, asset); @@ -257,29 +260,18 @@ class ResourceExtractor { output.getParentFile().mkdirs(); } - try { - if (useDiff) { - ByteArrayOutputStream diff = new ByteArrayOutputStream(); - try (InputStream is = zipFile.getInputStream(entry)) { - copy(is, diff); - } - - ByteArrayOutputStream orig = new ByteArrayOutputStream(); - try (InputStream is = manager.open(asset)) { - copy(is, orig); - } - - try (OutputStream os = new FileOutputStream(output)) { - os.write(BSDiff.bspatch(orig.toByteArray(), diff.toByteArray())); - } - - } else { - try (InputStream is = zipFile.getInputStream(entry); - OutputStream os = new FileOutputStream(output)) { - copy(is, os); - } + try (InputStream is = zipFile.getInputStream(entry); + OutputStream os = new FileOutputStream(output)) { + if (buffer == null) { + buffer = new byte[BUFFER_SIZE]; } + int count = 0; + while ((count = is.read(buffer, 0, BUFFER_SIZE)) != -1) { + os.write(buffer, 0, count); + } + + os.flush(); Log.i(TAG, "Extracted override resource " + asset); } catch (FileNotFoundException fnfe) { @@ -347,11 +339,4 @@ class ResourceExtractor { return null; } - - private static void copy(InputStream in, OutputStream out) throws IOException { - byte[] buf = new byte[16 * 1024]; - for (int i; (i = in.read(buf)) >= 0; ) { - out.write(buf, 0, i); - } - } }