Use the latest 'uses-sdk' tag to detect target SDK version.

At the moment aapt2 dumps information from the latest <uses-sdk> element
but uses all of them to detect target SDK which affects implied
permissions. Use only the latest one for detecting targetSdk as well.

Bug: b/243145989
Test: Dump_test
Change-Id: I70f828f1845ab070fa84c5297af12df24e7068dc
diff --git a/tools/aapt2/cmd/Dump_test.cpp b/tools/aapt2/cmd/Dump_test.cpp
index 03da364..b1c69cd 100644
--- a/tools/aapt2/cmd/Dump_test.cpp
+++ b/tools/aapt2/cmd/Dump_test.cpp
@@ -59,6 +59,22 @@
   ASSERT_EQ(output, expected);
 }
 
+TEST_F(DumpTest, DumpBadgingMultipleUsesSdkTakesLatest) {
+  auto apk_path = file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests",
+                                   "DumpTest", "multiple_uses_sdk.apk"});
+  auto loaded_apk = LoadedApk::LoadApkFromPath(apk_path, &noop_diag);
+
+  std::string output;
+  DumpBadgingToString(loaded_apk.get(), &output);
+
+  std::string expected;
+  auto expected_path =
+      file::BuildPath({android::base::GetExecutableDirectory(), "integration-tests", "DumpTest",
+                       "multiple_uses_sdk_expected.txt"});
+  ::android::base::ReadFileToString(expected_path, &expected);
+  ASSERT_EQ(output, expected);
+}
+
 TEST_F(DumpTest, DumpBadgingAllComponents) {
   auto apk_path = file::BuildPath(
       {android::base::GetExecutableDirectory(), "integration-tests", "DumpTest", "components.apk"});
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index b3165d3..f0b0e86 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -448,7 +448,12 @@
   /** Recursively visit the xml element tree and return a processed badging element tree. */
   std::unique_ptr<Element> Visit(xml::Element* element);
 
-    /** Raises the target sdk value if the min target is greater than the current target. */
+  /** Resets target SDK to 0. */
+  void ResetTargetSdk() {
+    target_sdk_ = 0;
+  }
+
+  /** Raises the target sdk value if the min target is greater than the current target. */
   void RaiseTargetSdk(int32_t min_target) {
     if (min_target > target_sdk_) {
       target_sdk_ = min_target;
@@ -799,6 +804,10 @@
     target_sdk = GetAttributeInteger(FindAttribute(element, TARGET_SDK_VERSION_ATTR));
     target_sdk_name = GetAttributeString(FindAttribute(element, TARGET_SDK_VERSION_ATTR));
 
+    // Resets target SDK first. This is required if APK contains multiple <uses-sdk> elements,
+    // we only need to take the latest values.
+    extractor()->ResetTargetSdk();
+
     // Detect the target sdk of the element
     if  ((min_sdk_name && *min_sdk_name == "Donut")
         || (target_sdk_name && *target_sdk_name == "Donut")) {
diff --git a/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk.apk b/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk.apk
new file mode 100644
index 0000000..7b269a5
--- /dev/null
+++ b/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk.apk
Binary files differ
diff --git a/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt b/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt
new file mode 100644
index 0000000..85e8d0a
--- /dev/null
+++ b/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt
@@ -0,0 +1,23 @@
+package: name='com.test.e17wmultiapknexus' versionCode='107' versionName='14' platformBuildVersionName='2.3.3' platformBuildVersionCode='10'
+sdkVersion:'1'
+application-label:'w45wmultiapknexus_10'
+application-icon-120:'res/drawable-ldpi-v4/icon.png'
+application-icon-160:'res/drawable-mdpi-v4/icon.png'
+application-icon-240:'res/drawable-hdpi-v4/icon.png'
+application: label='w45wmultiapknexus_10' icon='res/drawable-mdpi-v4/icon.png'
+launchable-activity: name='com.test.e17wmultiapknexus.TestActivity'  label='' icon=''
+compatible-screens:'500/320'
+uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'
+uses-implied-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' reason='targetSdkVersion < 4'
+uses-permission: name='android.permission.READ_PHONE_STATE'
+uses-implied-permission: name='android.permission.READ_PHONE_STATE' reason='targetSdkVersion < 4'
+uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'
+uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE'
+feature-group: label=''
+  uses-feature: name='android.hardware.faketouch'
+  uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
+main
+supports-screens: 'small' 'normal' 'large' 'xlarge'
+supports-any-density: 'true'
+locales: '--_--'
+densities: '120' '160' '240'