blob: 138398f7a9c6921f84bda97691bf06f20549e52f [file] [log] [blame]
// Copyright 2018 The Chromium 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 org.chromium.base;
import dalvik.system.BaseDexClassLoader;
import org.chromium.base.annotations.CalledByNative;
/**
* Utils for working with android app bundles.
*
* Important notes about bundle status as interpreted by this class:
*
* <ul>
* <li>If {@link BuildConfig#BUNDLES_SUPPORTED} is false, then we are definitely not in a bundle,
* and ProGuard is able to strip out the bundle support library.</li>
* <li>If {@link BuildConfig#BUNDLES_SUPPORTED} is true, then we MIGHT be in a bundle.
* {@link BundleUtils#sIsBundle} is the source of truth.</li>
* </ul>
*
* We need two fields to store one bit of information here to ensure that ProGuard can optimize out
* the bundle support library (since {@link BuildConfig#BUNDLES_SUPPORTED} is final) and so that
* we can dynamically set whether or not we're in a bundle for targets that use static shared
* library APKs.
*/
public final class BundleUtils {
private static Boolean sIsBundle;
/**
* {@link BundleUtils#isBundle()} is not called directly by native because
* {@link CalledByNative} prevents inlining, causing the bundle support lib to not be
* removed non-bundle builds.
*
* @return true if the current build is a bundle.
*/
@CalledByNative
public static boolean isBundleForNative() {
return isBundle();
}
/**
* @return true if the current build is a bundle.
*/
public static boolean isBundle() {
if (!BuildConfig.BUNDLES_SUPPORTED) {
return false;
}
assert sIsBundle != null;
return sIsBundle;
}
public static void setIsBundle(boolean isBundle) {
sIsBundle = isBundle;
}
/* Returns absolute path to a native library in a feature module. */
@CalledByNative
private static String getNativeLibraryPath(String libraryName) {
try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
return ((BaseDexClassLoader) ContextUtils.getApplicationContext().getClassLoader())
.findLibrary(libraryName);
}
}
}