Move SdkExtensions/proto to packages/modules/common.

The proto definitions may be needed at build time to generate appropriate
configs for the modules. Unbundled ART branches do not include
packages/modules/SdkExtenstion in their manifest; so put the proto in a
project that should be visible to all unbundled modules.

Move any relevant tools to packages/modules/common/tools as well.

Bug: 180105615
Test: m nothing
Change-Id: I4efa4300553af6b321f46adb29b8cc90e4556955
This commit is contained in:
satayev
2021-05-10 12:31:50 +01:00
parent 4986e116e5
commit 075d07c591
6 changed files with 351 additions and 0 deletions

75
proto/Android.bp Normal file
View File

@@ -0,0 +1,75 @@
// Copyright (C) 2021 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"],
}
python_defaults {
name: "modules-common-proto-python-defaults",
version: {
py2: {
enabled: false,
},
py3: {
enabled: true,
},
},
}
python_library_host {
name: "sdk_proto_python",
defaults: ["modules-common-proto-python-defaults"],
srcs: ["sdk.proto"],
proto: {
canonical_path_from_root: false,
},
visibility: [
"//packages/modules/SdkExtensions/gen_sdk",
"//packages/modules/common/tools",
],
}
cc_library_static {
name: "libsdk_proto",
proto: {
export_proto_headers: true,
type: "lite",
},
srcs: ["sdk.proto"],
min_sdk_version: "30",
apex_available: ["com.android.sdkext"],
visibility: ["//packages/modules/SdkExtensions/derive_sdk"],
}
python_library_host {
name: "classpaths_proto_python",
defaults: ["modules-common-proto-python-defaults"],
srcs: ["classpaths.proto"],
proto: {
canonical_path_from_root: false,
},
}
cc_library_static {
name: "libclasspaths_proto",
proto: {
export_proto_headers: true,
type: "lite",
},
srcs: ["classpaths.proto"],
min_sdk_version: "30",
apex_available: ["com.android.sdkext"],
visibility: ["//packages/modules/SdkExtensions/derive_classpath"],
}

62
proto/classpaths.proto Normal file
View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) 2021 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";
enum Classpath {
UNKNOWN = 0;
BOOTCLASSPATH = 1;
SYSTEMSERVERCLASSPATH = 2;
DEX2OATBOOTCLASSPATH = 3;
}
// Individual entry in a classpath variable.
message Jar {
// Path on the filesystem for the jar, relative to the partition.
// For example, for APEX "com.android.myapex", relative_path of
// `javalib/myjar.jar` would correspond to an absolute path of
// `/apex/com.android.myapex/javalib/myjar.jar` at runtime.
string relative_path = 1;
// Environ classpath variable this jar belongs to.
// Must be set to a known classpath.
Classpath classpath = 2;
// Minimum API level required for the jar to be included on the classpath.
// If the system's API level is lower than the value specified in this
// attribute, the jar will not be included in the classpath.
// Not setting this attribute, defaults the value to zero and implies the jar
// can be used on all API levels.
int32 min_sdk_version = 3;
// Maximum API level that the jar file supports.
// Not setting this attribute implies unbound maximum; otherwise set value
// must be greater or equal to min_sdk value.
// If the system's API level is higher that the value specified in this
// attribute, the jar will not be included in the classpath.
int32 max_sdk_version = 4;
}
// Jars exported by a single partition.
message ExportedClasspathsJars {
// All jars that are exported as part of any classpath environ variable
// (according to API level restrictions).
// The relative order of the jars is preserved upon final merging.
repeated Jar jars = 1;
}

58
proto/sdk.proto Normal file
View File

@@ -0,0 +1,58 @@
/*
* 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";
// The version of a single module.
message SdkVersion {
int32 version = 1;
}
// All the modules that can be used for version requirements.
enum SdkModule {
UNKNOWN = 0;
// R modules
IPSEC = 1;
MEDIA = 2;
MEDIA_PROVIDER = 3;
PERMISSIONS = 4;
SDK_EXTENSIONS = 5;
STATSD = 6;
TETHERING = 7;
// S modules
ART = 8;
}
// A single extension version.
message ExtensionVersion {
message ModuleRequirement {
SdkModule module = 1;
SdkVersion version = 2;
}
// The extension version.
int32 version = 1;
// The modules required for this extension version.
repeated ModuleRequirement requirements = 2;
}
// All the defined extension versions.
message ExtensionDatabase {
repeated ExtensionVersion versions = 1;
}

61
tools/Android.bp Normal file
View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) 2021 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"],
}
python_defaults {
name: "modules-common-tools-python-defaults",
version: {
py2: {
enabled: false,
},
py3: {
enabled: true,
embedded_launcher: true,
},
},
}
python_binary_host {
name: "conv_classpaths_proto",
defaults: ["modules-common-tools-python-defaults"],
srcs: ["conv_classpaths_proto.py"],
libs: ["classpaths_proto_python"],
}
python_binary_host {
name: "gen_sdkinfo",
defaults: ["modules-common-tools-python-defaults"],
srcs: ["gen_sdkinfo.py"],
libs: ["sdk_proto_python"],
}
gensrcs {
name: "cur_sdkinfo_src",
srcs: [""],
tools: [ "gen_sdkinfo" ],
cmd: "$(location) -v 0 -o $(out)",
}
prebuilt_etc {
name: "cur_sdkinfo",
src: ":cur_sdkinfo_src",
filename: "sdkinfo.binarypb",
installable: false,
visibility: ["//packages/modules/SdkExtensions"],
}

View File

@@ -0,0 +1,76 @@
# Copyright (C) 2021 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.
import argparse
import classpaths_pb2
import google.protobuf.json_format as json_format
import google.protobuf.text_format as text_format
def encode(args):
pb = classpaths_pb2.ExportedClasspathsJars()
if args.format == 'json':
json_format.Parse(args.input.read(), pb)
else:
text_format.Parse(args.input.read(), pb)
args.output.write(pb.SerializeToString())
args.input.close()
args.output.close()
def decode(args):
pb = classpaths_pb2.ExportedClasspathsJars()
pb.ParseFromString(args.input.read())
if args.format == 'json':
args.output.write(json_format.MessageToJson(pb))
else:
args.output.write(text_format.MessageToString(pb).encode('utf_8'))
args.input.close()
args.output.close()
def main():
parser = argparse.ArgumentParser('Convert classpaths.proto messages between binary and '
'human-readable formats.')
parser.add_argument('-f', '--format', default='textproto',
help='human-readable format, either json or text(proto), '
'defaults to textproto')
parser.add_argument('-i', '--input',
nargs='?', type=argparse.FileType('rb'), default=sys.stdin.buffer)
parser.add_argument('-o', '--output',
nargs='?', type=argparse.FileType('wb'),
default=sys.stdout.buffer)
subparsers = parser.add_subparsers()
parser_encode = subparsers.add_parser('encode',
help='convert classpaths protobuf message from '
'JSON to binary format',
parents=[parser], add_help=False)
parser_encode.set_defaults(func=encode)
parser_decode = subparsers.add_parser('decode',
help='print classpaths config in JSON format',
parents=[parser], add_help=False)
parser_decode.set_defaults(func=decode)
args = parser.parse_args()
args.func(args)
if __name__ == '__main__':
main()

19
tools/gen_sdkinfo.py Normal file
View File

@@ -0,0 +1,19 @@
import sdk_pb2
import sys
if __name__ == '__main__':
argv = sys.argv[1:]
if not len(argv) == 4 or sorted([argv[0], argv[2]]) != ['-o', '-v']:
print('usage: gen_sdkinfo -v <version> -o <output-file>')
sys.exit(1)
for i in range(len(argv)):
if sys.argv[i] == '-o':
filename = sys.argv[i+1]
if sys.argv[i] == '-v':
version = int(sys.argv[i+1])
proto = sdk_pb2.SdkVersion()
proto.version = version
with open(filename, 'wb') as f:
f.write(proto.SerializeToString())