Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a227782 authored by Paul Duffin's avatar Paul Duffin
Browse files

Remove org.apache.http.legacy from bootclasspath

Updated data/etc/platform.xml to make the org.apache.http.legacy library
usable by applications. The runtime location of the
org.apache.http.legacy library is
/system/framework/org.apache.http.legacy.boot.jar not
/system/framework/org.apache.http.legacy.jar.

Stop removing org.apache.http.legacy from the required and optional
shared library lists and instead add it to the required list if it is
not present in either and the package is targeted at SDK
version <= O_MR1.

Bug: 18027885
Test: make FrameworksCoreTests, install and run
Change-Id: I686e3c20f5860e58825e1b88f220f9b8c335849c
parent 61330a33
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@

package android.content.pm;

import android.annotation.Nullable;
import android.content.pm.PackageParser.Package;
import android.os.Build;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -36,6 +36,8 @@ public class PackageBackwardCompatibility {

    private static final String ANDROID_TEST_RUNNER = "android.test.runner";

    private static final String APACHE_HTTP_LEGACY = "org.apache.http.legacy";

    /**
     * Modify the shared libraries in the supplied {@link Package} to maintain backwards
     * compatibility.
@@ -47,13 +49,21 @@ public class PackageBackwardCompatibility {
        ArrayList<String> usesLibraries = pkg.usesLibraries;
        ArrayList<String> usesOptionalLibraries = pkg.usesOptionalLibraries;

        usesLibraries = orgApacheHttpLegacy(usesLibraries);
        usesOptionalLibraries = orgApacheHttpLegacy(usesOptionalLibraries);
        // Packages targeted at <= O_MR1 expect the classes in the org.apache.http.legacy library
        // to be accessible so this maintains backward compatibility by adding the
        // org.apache.http.legacy library to those packages.
        if (apkTargetsApiLevelLessThanOrEqualToOMR1(pkg)) {
            boolean apacheHttpLegacyPresent = isLibraryPresent(
                    usesLibraries, usesOptionalLibraries, APACHE_HTTP_LEGACY);
            if (!apacheHttpLegacyPresent) {
                usesLibraries = ArrayUtils.add(usesLibraries, APACHE_HTTP_LEGACY);
            }
        }

        // android.test.runner has a dependency on android.test.mock so if android.test.runner
        // is present but android.test.mock is not then add android.test.mock.
        boolean androidTestMockPresent = ArrayUtils.contains(usesLibraries, ANDROID_TEST_MOCK)
                || ArrayUtils.contains(usesOptionalLibraries, ANDROID_TEST_MOCK);
        boolean androidTestMockPresent = isLibraryPresent(
                usesLibraries, usesOptionalLibraries, ANDROID_TEST_MOCK);
        if (ArrayUtils.contains(usesLibraries, ANDROID_TEST_RUNNER) && !androidTestMockPresent) {
            usesLibraries.add(ANDROID_TEST_MOCK);
        }
@@ -66,13 +76,14 @@ public class PackageBackwardCompatibility {
        pkg.usesOptionalLibraries = usesOptionalLibraries;
    }

    private static ArrayList<String> orgApacheHttpLegacy(@Nullable ArrayList<String> libraries) {
        // "org.apache.http.legacy" is now a part of the boot classpath so it doesn't need
        // to be an explicit dependency.
        //
        // A future change will remove this library from the boot classpath, at which point
        // all apps that target SDK 21 and earlier will have it automatically added to their
        // dependency lists.
        return ArrayUtils.remove(libraries, "org.apache.http.legacy");
    private static boolean apkTargetsApiLevelLessThanOrEqualToOMR1(Package pkg) {
        int targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
        return targetSdkVersion <= Build.VERSION_CODES.O_MR1;
    }

    private static boolean isLibraryPresent(ArrayList<String> usesLibraries,
            ArrayList<String> usesOptionalLibraries, String apacheHttpLegacy) {
        return ArrayUtils.contains(usesLibraries, apacheHttpLegacy)
                || ArrayUtils.contains(usesOptionalLibraries, apacheHttpLegacy);
    }
}
+41 −3
Original line number Diff line number Diff line
@@ -68,19 +68,57 @@ public class PackageBackwardCompatibilityTest {
    }

    @Test
    public void remove_org_apache_http_legacy_from_usesLibraries() {
    public void targeted_at_O() {
        mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
        PackageBackwardCompatibility.modifySharedLibraries(mPackage);
        assertEquals("usesLibraries not updated correctly",
                arrayList(ORG_APACHE_HTTP_LEGACY),
                mPackage.usesLibraries);
        assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
    }

    @Test
    public void targeted_at_O_org_apache_http_legacy_in_usesLibraries() {
        mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
        mPackage.usesLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
        PackageBackwardCompatibility.modifySharedLibraries(mPackage);
        assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
        assertEquals("usesLibraries not updated correctly",
                arrayList(ORG_APACHE_HTTP_LEGACY),
                mPackage.usesLibraries);
        assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
    }

    @Test
    public void remove_org_apache_http_legacy_from_usesOptionalLibraries() {
    public void targeted_at_O_org_apache_http_legacy_in_usesOptionalLibraries() {
        mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
        mPackage.usesOptionalLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
        PackageBackwardCompatibility.modifySharedLibraries(mPackage);
        assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
        assertEquals("usesOptionalLibraries not updated correctly",
                arrayList(ORG_APACHE_HTTP_LEGACY),
                mPackage.usesOptionalLibraries);
    }

    @Test
    public void org_apache_http_legacy_in_usesLibraries() {
        mPackage.usesLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
        PackageBackwardCompatibility.modifySharedLibraries(mPackage);
        assertEquals("usesLibraries not updated correctly",
                arrayList(ORG_APACHE_HTTP_LEGACY),
                mPackage.usesLibraries);
        assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
    }

    @Test
    public void org_apache_http_legacy_in_usesOptionalLibraries() {
        mPackage.usesOptionalLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
        PackageBackwardCompatibility.modifySharedLibraries(mPackage);
        assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
        assertEquals("usesOptionalLibraries not updated correctly",
                arrayList(ORG_APACHE_HTTP_LEGACY),
                mPackage.usesOptionalLibraries);
    }

    @Test
    public void android_test_runner_in_usesLibraries() {
        mPackage.usesLibraries = arrayList(ANDROID_TEST_RUNNER);
+1 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@
    <library name="javax.obex"
            file="/system/framework/javax.obex.jar" />
    <library name="org.apache.http.legacy"
            file="/system/framework/org.apache.http.legacy.jar" />
            file="/system/framework/org.apache.http.legacy.boot.jar" />

    <!-- These are the standard packages that are white-listed to always have internet
         access while in power save mode, even if they aren't in the foreground. -->