Merge "Adding ApexInfo utility" into udc-dev am: cb0d5e24be

Original change: https://googleplex-android-review.googlesource.com/c/platform/vendor/widevine/+/21702626

Change-Id: I7dd39c8924e5455f365d47bbb619e098acec8de1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2023-03-10 07:01:46 +00:00
committed by Automerger Merge Worker
8 changed files with 209 additions and 2 deletions

View File

@@ -129,7 +129,13 @@ cc_binary {
"frameworks/native/libs/binder/include",
],
shared_libs: ["libbinder_ndk"],
shared_libs: [
"libbinder_ndk",
"libprotobuf-cpp-lite",
],
static_libs: [
"lib_apex_manifest_minimal_proto_lite",
],
init_rc: ["src/android.hardware.drm-service.widevine.rc"],
vintf_fragments: ["manifest_android.hardware.drm-service.widevine.xml"],

View File

@@ -74,6 +74,11 @@ apex {
],
binaries: ["android.hardware.drm-service.widevine"],
file_contexts: "file_contexts",
// TODO(b/268439003) We need an API to get apex version. Until then
// we'll read apex_manifest.pb to get the version. To label apex_manifest.pb
// as vendor_configs_file (which the apex can access), turn off force-label.
use_file_contexts_as_is: true,
use_vndk_as_stable: true,
updatable: false,

View File

@@ -1,3 +1,9 @@
(/.*)? u:object_r:vendor_file:s0
/bin/hw/android\.hardware\.drm-service\.widevine u:object_r:hal_drm_widevine_exec:s0
/etc(/.*)? u:object_r:vendor_configs_file:s0
/etc(/.*)? u:object_r:vendor_configs_file:s0
# TODO(b/268439003) Following two entries are typically handled by the build system.
# We override it so that the Widevine APEX can access it to get the apex version.
# When we have a proper API, we can delete these along with
# use_file_contexts_as_is property in Android.bp
/apex_manifest\.pb u:object_r:vendor_configs_file:s0
/ u:object_r:system_file:s0

View File

@@ -0,0 +1,42 @@
/*
* Copyright (C) 2023 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.
*/
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
// TODO(b/268439003) The widevine apex wants to get the apex version.
// Since there's no such API, we read it from apex_manifest.pb directly via
// a partial view proto.
// When we have a proper API, we can delete this proto because it should be
// internal to system.
cc_library_static {
name: "lib_apex_manifest_minimal_proto_lite",
proto: {
type: "lite",
},
export_include_dirs: [
".",
],
srcs: [
"apex_manifest_minimal.proto",
"widevine_apex_info.cpp",
],
shared_libs: [
"libbase",
],
vendor: true,
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2023 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 apex.proto;
// This is a partial view for system/apex/proto/apex_manifest.proto.
message ApexManifest {
// APEX Name. Note that this can be different from what PackageManager sees.
// This is used to identify an APEX and to mount under /apex directory.
string name = 1;
// Version Number
int64 version = 2;
}

View File

@@ -0,0 +1,75 @@
/*
* Copyright 2023 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.
*/
#include "widevine_apex_info.h"
#include <android-base/file.h>
#include <android-base/strings.h>
#include "apex_manifest_minimal.pb.h"
using android::base::ConsumePrefix;
using android::base::ErrnoError;
using android::base::Error;
using android::base::GetExecutablePath;
using android::base::ReadFileToString;
using android::base::Result;
using apex::proto::ApexManifest;
namespace widevine::apex {
namespace {
Result<std::string> GetApexNameFromPath(const std::string& path) {
std::string_view sv{path};
if (!ConsumePrefix(&sv, "/apex/")) {
return Error() << "Not found an apex name: " << path;
}
return std::string{sv.substr(0, sv.find('/'))};
}
Result<ApexManifest> ParseApexManifest(const std::string& manifest_path) {
std::string content;
if (!ReadFileToString(manifest_path, &content)) {
return ErrnoError() << "Failed to read manifest file: " << manifest_path;
}
ApexManifest manifest;
if (!manifest.ParseFromString(content)) {
return Error() << "Can't parse APEX manifest: " << manifest_path;
}
return manifest;
}
}
Result<ApexInfo> GetApexInfo() {
auto exe_path = GetExecutablePath();
auto apex_name = GetApexNameFromPath(exe_path);
if (!apex_name.ok()) {
return apex_name.error();
}
auto manifest_path = fmt::format("/apex/{}/apex_manifest.pb", *apex_name);
auto apex_manifest = ParseApexManifest(manifest_path);
if (!apex_manifest.ok()) {
return apex_manifest.error();
}
return ApexInfo {
apex_manifest->name(),
apex_manifest->version(),
};
}
} // namespace widevine::apex

View File

@@ -0,0 +1,34 @@
/*
* Copyright 2023 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.
*/
#pragma once
#include <stdint.h>
#include <string>
#include <android-base/result.h>
namespace widevine::apex {
struct ApexInfo {
std::string name;
int64_t version;
};
android::base::Result<ApexInfo> GetApexInfo();
}

View File

@@ -22,11 +22,19 @@
#include "WVCreatePluginFactories.h"
#include "WVDrmFactory.h"
#include "widevine_apex_info.h"
using ::wvdrm::hardware::drm::widevine::createDrmFactory;
using ::wvdrm::hardware::drm::widevine::WVDrmFactory;
int main(int /* argc */, char** /* argv */) {
#ifdef __ANDROID_APEX__
{
auto info = widevine::apex::GetApexInfo();
CHECK(info.ok()) << info.error();
LOG(INFO) << "Starting from " << info->name << "(" << info->version << ")";
}
#endif
ABinderProcess_setThreadPoolMaxThreadCount(8);
std::shared_ptr<WVDrmFactory> drmFactory = createDrmFactory();