Add S extensions

Update the tests to ensure it is set on S+ but not otherwise.

Note that the implementation of how the version is derived is still a
placeholder (see b/173188089 for plans).

Bug: 173114427
Test: presubmit (SdkExtensionsTest on R and HEAD)
Merged-In: Ifc46e785a005e12cacb7ad86e8c7798e1d00b37f
Change-Id: Ifc46e785a005e12cacb7ad86e8c7798e1d00b37f
diff --git a/derive_sdk/Android.bp b/derive_sdk/Android.bp
index 85672bd..3e030e8 100644
--- a/derive_sdk/Android.bp
+++ b/derive_sdk/Android.bp
@@ -26,7 +26,10 @@
     shared_libs: ["liblog"],
     // static c++/libbase for smaller size
     stl: "c++_static",
-    static_libs: ["libbase"],
+    static_libs: [
+        "libbase",
+        "libmodules-utils-build",
+    ],
 }
 
 cc_binary {
diff --git a/derive_sdk/derive_sdk.cpp b/derive_sdk/derive_sdk.cpp
index d8ab519..89c9adf 100644
--- a/derive_sdk/derive_sdk.cpp
+++ b/derive_sdk/derive_sdk.cpp
@@ -25,6 +25,7 @@
 #include <android-base/file.h>
 #include <android-base/logging.h>
 #include <android-base/properties.h>
+#include <android-modules-utils/sdk_level.h>
 
 #include "packages/modules/SdkExtensions/derive_sdk/sdk.pb.h"
 
@@ -70,10 +71,16 @@
     std::string prop_value = itr == versions.end() ? "0" : std::to_string(*itr);
 
     if (!android::base::SetProperty("build.version.extensions.r", prop_value)) {
-        LOG(ERROR) << "failed to set sdk_info prop";
+        LOG(ERROR) << "failed to set r sdk_info prop";
         return EXIT_FAILURE;
     }
+    if (android::modules::sdklevel::IsAtLeastS()) {
+        if (!android::base::SetProperty("build.version.extensions.s", prop_value)) {
+            LOG(ERROR) << "failed to set s sdk_info prop";
+            return EXIT_FAILURE;
+        }
+    }
 
-    LOG(INFO) << "R extension version is " << prop_value;
+    LOG(INFO) << "Extension version is " << prop_value;
     return EXIT_SUCCESS;
 }