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

Commit 43158773 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

AAPT: Don't imply specific location hardware for dump badging

Permissions such as android.permission.ACCESS_FINE_LOCATION
and android.permission.ACCESS_COARSE_LOCATION assumed the underlying feature
technology and aapt dump badging would emit an implied feature.

This is no longer accurate, so the only implied feature is on the general
android.hardware.location when the target SDK of the app is 21+.

Bug:25218770
Change-Id: Ica9ebf7d4f360b137af54a8c8fd6c0358cd9be6a
parent d031d57c
Loading
Loading
Loading
Loading
+50 −42
Original line number Original line Diff line number Diff line
@@ -540,7 +540,7 @@ static bool hasFeature(const char* name, const FeatureGroup& grp,
}
}


static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures,
static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures,
                              const char* name, const char* reason, bool sdk23) {
                              const char* name, const String8& reason, bool sdk23) {
    String8 name8(name);
    String8 name8(name);
    ssize_t idx = impliedFeatures->indexOfKey(name8);
    ssize_t idx = impliedFeatures->indexOfKey(name8);
    if (idx < 0) {
    if (idx < 0) {
@@ -553,7 +553,7 @@ static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatu
    if (feature->impliedBySdk23 && !sdk23) {
    if (feature->impliedBySdk23 && !sdk23) {
        feature->impliedBySdk23 = false;
        feature->impliedBySdk23 = false;
    }
    }
    feature->reasons.add(String8(reason));
    feature->reasons.add(reason);
}
}


static void printFeatureGroupImpl(const FeatureGroup& grp,
static void printFeatureGroupImpl(const FeatureGroup& grp,
@@ -651,50 +651,58 @@ static void addImpliedFeaturesForPermission(const int targetSdk, const String8&
                                            bool impliedBySdk23Permission) {
                                            bool impliedBySdk23Permission) {
    if (name == "android.permission.CAMERA") {
    if (name == "android.permission.CAMERA") {
        addImpliedFeature(impliedFeatures, "android.hardware.camera",
        addImpliedFeature(impliedFeatures, "android.hardware.camera",
                String8::format("requested %s permission", name.string())
                          String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                          impliedBySdk23Permission);
    } else if (name == "android.permission.ACCESS_FINE_LOCATION") {
    } else if (name == "android.permission.ACCESS_FINE_LOCATION") {
        if (targetSdk < SDK_LOLLIPOP) {
            addImpliedFeature(impliedFeatures, "android.hardware.location.gps",
            addImpliedFeature(impliedFeatures, "android.hardware.location.gps",
                String8::format("requested %s permission", name.string())
                              String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                              impliedBySdk23Permission);
        addImpliedFeature(impliedFeatures, "android.hardware.location",
            addImpliedFeature(impliedFeatures, "android.hardware.location.gps",
                String8::format("requested %s permission", name.string())
                              String8::format("targetSdkVersion < %d", SDK_LOLLIPOP),
                .string(), impliedBySdk23Permission);
                              impliedBySdk23Permission);
    } else if (name == "android.permission.ACCESS_MOCK_LOCATION") {
        }
        addImpliedFeature(impliedFeatures, "android.hardware.location",
        addImpliedFeature(impliedFeatures, "android.hardware.location",
                String8::format("requested %s permission", name.string())
                String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                impliedBySdk23Permission);
    } else if (name == "android.permission.ACCESS_COARSE_LOCATION") {
    } else if (name == "android.permission.ACCESS_COARSE_LOCATION") {
        if (targetSdk < SDK_LOLLIPOP) {
            addImpliedFeature(impliedFeatures, "android.hardware.location.network",
                              String8::format("requested %s permission", name.string()),
                              impliedBySdk23Permission);
            addImpliedFeature(impliedFeatures, "android.hardware.location.network",
            addImpliedFeature(impliedFeatures, "android.hardware.location.network",
                String8::format("requested %s permission", name.string())
                              String8::format("targetSdkVersion < %d", SDK_LOLLIPOP),
                .string(), impliedBySdk23Permission);
                              impliedBySdk23Permission);
        }
        addImpliedFeature(impliedFeatures, "android.hardware.location",
        addImpliedFeature(impliedFeatures, "android.hardware.location",
                String8::format("requested %s permission", name.string())
                          String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                          impliedBySdk23Permission);
    } else if (name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" ||
    } else if (name == "android.permission.ACCESS_MOCK_LOCATION" ||
               name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" ||
               name == "android.permission.INSTALL_LOCATION_PROVIDER") {
               name == "android.permission.INSTALL_LOCATION_PROVIDER") {
        addImpliedFeature(impliedFeatures, "android.hardware.location",
        addImpliedFeature(impliedFeatures, "android.hardware.location",
                String8::format("requested %s permission", name.string())
                          String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                          impliedBySdk23Permission);
    } else if (name == "android.permission.BLUETOOTH" ||
    } else if (name == "android.permission.BLUETOOTH" ||
               name == "android.permission.BLUETOOTH_ADMIN") {
               name == "android.permission.BLUETOOTH_ADMIN") {
        if (targetSdk > 4) {
        if (targetSdk > SDK_DONUT) {
            addImpliedFeature(impliedFeatures, "android.hardware.bluetooth",
            addImpliedFeature(impliedFeatures, "android.hardware.bluetooth",
                    String8::format("requested %s permission", name.string())
                              String8::format("requested %s permission", name.string()),
                    .string(), impliedBySdk23Permission);
                              impliedBySdk23Permission);
            addImpliedFeature(impliedFeatures, "android.hardware.bluetooth",
            addImpliedFeature(impliedFeatures, "android.hardware.bluetooth",
                    "targetSdkVersion > 4", impliedBySdk23Permission);
                              String8::format("targetSdkVersion > %d", SDK_DONUT),
                              impliedBySdk23Permission);
        }
        }
    } else if (name == "android.permission.RECORD_AUDIO") {
    } else if (name == "android.permission.RECORD_AUDIO") {
        addImpliedFeature(impliedFeatures, "android.hardware.microphone",
        addImpliedFeature(impliedFeatures, "android.hardware.microphone",
                String8::format("requested %s permission", name.string())
                          String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                          impliedBySdk23Permission);
    } else if (name == "android.permission.ACCESS_WIFI_STATE" ||
    } else if (name == "android.permission.ACCESS_WIFI_STATE" ||
               name == "android.permission.CHANGE_WIFI_STATE" ||
               name == "android.permission.CHANGE_WIFI_STATE" ||
               name == "android.permission.CHANGE_WIFI_MULTICAST_STATE") {
               name == "android.permission.CHANGE_WIFI_MULTICAST_STATE") {
        addImpliedFeature(impliedFeatures, "android.hardware.wifi",
        addImpliedFeature(impliedFeatures, "android.hardware.wifi",
                String8::format("requested %s permission", name.string())
                          String8::format("requested %s permission", name.string()),
                .string(), impliedBySdk23Permission);
                          impliedBySdk23Permission);
    } else if (name == "android.permission.CALL_PHONE" ||
    } else if (name == "android.permission.CALL_PHONE" ||
               name == "android.permission.CALL_PRIVILEGED" ||
               name == "android.permission.CALL_PRIVILEGED" ||
               name == "android.permission.MODIFY_PHONE_STATE" ||
               name == "android.permission.MODIFY_PHONE_STATE" ||
@@ -707,7 +715,7 @@ static void addImpliedFeaturesForPermission(const int targetSdk, const String8&
               name == "android.permission.WRITE_APN_SETTINGS" ||
               name == "android.permission.WRITE_APN_SETTINGS" ||
               name == "android.permission.WRITE_SMS") {
               name == "android.permission.WRITE_SMS") {
        addImpliedFeature(impliedFeatures, "android.hardware.telephony",
        addImpliedFeature(impliedFeatures, "android.hardware.telephony",
                String8("requested a telephony permission").string(),
                          String8("requested a telephony permission"),
                          impliedBySdk23Permission);
                          impliedBySdk23Permission);
    }
    }
}
}
@@ -1659,17 +1667,17 @@ int doDump(Bundle* bundle)
                            if (error == "") {
                            if (error == "") {
                                if (orien == 0 || orien == 6 || orien == 8) {
                                if (orien == 0 || orien == 6 || orien == 8) {
                                    // Requests landscape, sensorLandscape, or reverseLandscape.
                                    // Requests landscape, sensorLandscape, or reverseLandscape.
                                    addImpliedFeature(&impliedFeatures,
                                    addImpliedFeature(
                                                      "android.hardware.screen.landscape",
                                            &impliedFeatures, "android.hardware.screen.landscape",
                                                      "one or more activities have specified a "
                                            String8("one or more activities have specified a "
                                                      "landscape orientation",
                                                    "landscape orientation"),
                                            false);
                                            false);
                                } else if (orien == 1 || orien == 7 || orien == 9) {
                                } else if (orien == 1 || orien == 7 || orien == 9) {
                                    // Requests portrait, sensorPortrait, or reversePortrait.
                                    // Requests portrait, sensorPortrait, or reversePortrait.
                                    addImpliedFeature(&impliedFeatures,
                                    addImpliedFeature(
                                                      "android.hardware.screen.portrait",
                                            &impliedFeatures, "android.hardware.screen.portrait",
                                                      "one or more activities have specified a "
                                            String8("one or more activities have specified a "
                                                      "portrait orientation",
                                                    "portrait orientation"),
                                            false);
                                            false);
                                }
                                }
                            }
                            }
@@ -2026,7 +2034,7 @@ int doDump(Bundle* bundle)
            // directly or implied, required or not), then the faketouch feature is implied.
            // directly or implied, required or not), then the faketouch feature is implied.
            if (!hasFeature("android.hardware.touchscreen", commonFeatures, impliedFeatures)) {
            if (!hasFeature("android.hardware.touchscreen", commonFeatures, impliedFeatures)) {
                addImpliedFeature(&impliedFeatures, "android.hardware.faketouch",
                addImpliedFeature(&impliedFeatures, "android.hardware.faketouch",
                                  "default feature for all apps", false);
                                  String8("default feature for all apps"), false);
            }
            }


            const size_t numFeatureGroups = featureGroups.size();
            const size_t numFeatureGroups = featureGroups.size();