Rename sdkext module to sdkextensions
It's a better name.
Bug: 137191822
Test: presubmit
Change-Id: Icc39779d49bf31f911f9f72bd7610e84c5f49466
Merged-In: Icc39779d49bf31f911f9f72bd7610e84c5f49466
(cherry picked from commit 5b97269cffa587d1c1d73163a9cabb0cc8c7ec05)
diff --git a/derive_sdk/Android.bp b/derive_sdk/Android.bp
new file mode 100644
index 0000000..c4e3c29
--- /dev/null
+++ b/derive_sdk/Android.bp
@@ -0,0 +1,37 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_binary {
+ name: "derive_sdk",
+ srcs: [
+ "derive_sdk.cpp",
+ "sdk.proto",
+ ],
+ proto: {
+ type: "lite",
+ },
+ sdk_version: "current",
+ stl: "c++_static",
+ shared_libs: [ "liblog" ],
+ static_libs: [
+ "libbase_ndk",
+ "libprotobuf-cpp-lite-ndk",
+ ],
+}
+
+prebuilt_etc {
+ name: "derive_sdk.rc",
+ src: "derive_sdk.rc",
+ installable: false,
+}
diff --git a/derive_sdk/derive_sdk.cpp b/derive_sdk/derive_sdk.cpp
new file mode 100644
index 0000000..6fb7ef4
--- /dev/null
+++ b/derive_sdk/derive_sdk.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "derive_sdk"
+
+#include <algorithm>
+#include <dirent.h>
+#include <iostream>
+#include <sys/stat.h>
+#include <vector>
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+
+#include "frameworks/base/apex/sdkextensions/derive_sdk/sdk.pb.h"
+
+using com::android::sdkext::proto::SdkVersion;
+
+int main(int, char**) {
+ std::unique_ptr<DIR, decltype(&closedir)> apex(opendir("/apex"), closedir);
+ if (!apex) {
+ LOG(ERROR) << "Could not read /apex";
+ return EXIT_FAILURE;
+ }
+ struct dirent* de;
+ std::vector<std::string> paths;
+ while ((de = readdir(apex.get()))) {
+ std::string name = de->d_name;
+ if (name[0] == '.' || name.find('@') != std::string::npos) {
+ // Skip <name>@<ver> dirs, as they are bind-mounted to <name>
+ continue;
+ }
+ std::string path = "/apex/" + name + "/etc/sdkinfo.binarypb";
+ struct stat statbuf;
+ if (stat(path.c_str(), &statbuf) == 0) {
+ paths.push_back(path);
+ }
+ }
+
+ std::vector<int> versions;
+ for (const auto& path : paths) {
+ std::string contents;
+ if (!android::base::ReadFileToString(path, &contents, true)) {
+ LOG(ERROR) << "failed to read " << path;
+ continue;
+ }
+ SdkVersion sdk_version;
+ if (!sdk_version.ParseFromString(contents)) {
+ LOG(ERROR) << "failed to parse " << path;
+ continue;
+ }
+ LOG(INFO) << "Read version " << sdk_version.version() << " from " << path;
+ versions.push_back(sdk_version.version());
+ }
+ auto itr = std::min_element(versions.begin(), versions.end());
+ std::string prop_value = itr == versions.end() ? "0" : std::to_string(*itr);
+
+ if (!android::base::SetProperty("ro.build.version.extensions.r", prop_value)) {
+ LOG(ERROR) << "failed to set sdk_info prop";
+ return EXIT_FAILURE;
+ }
+
+ LOG(INFO) << "R extension version is " << prop_value;
+ return EXIT_SUCCESS;
+}
diff --git a/derive_sdk/derive_sdk.rc b/derive_sdk/derive_sdk.rc
new file mode 100644
index 0000000..1b66794
--- /dev/null
+++ b/derive_sdk/derive_sdk.rc
@@ -0,0 +1,3 @@
+service derive_sdk /apex/com.android.sdkext/bin/derive_sdk
+ oneshot
+ disabled
diff --git a/derive_sdk/sdk.proto b/derive_sdk/sdk.proto
new file mode 100644
index 0000000..d15b935
--- /dev/null
+++ b/derive_sdk/sdk.proto
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+package com.android.sdkext.proto;
+
+option java_outer_classname = "SdkProto";
+option optimize_for = LITE_RUNTIME;
+
+message SdkVersion {
+ int32 version = 1;
+}