| // Copyright 2020 Google Inc. All rights reserved. | |
| // | |
| // 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 java | |
| import ( | |
| "android/soong/android" | |
| ) | |
| type partitionGroup int | |
| // Representation of partition group for checking inter-partition library dependencies. | |
| // Between system and system_ext, there are no restrictions of dependencies, | |
| // so we can treat these partitions as the same in terms of inter-partition dependency. | |
| // Same policy is applied between vendor and odm partiton. | |
| const ( | |
| partitionGroupNone partitionGroup = iota | |
| // group for system, and system_ext partition | |
| partitionGroupSystem | |
| // group for vendor and odm partition | |
| partitionGroupVendor | |
| // product partition | |
| partitionGroupProduct | |
| ) | |
| func (g partitionGroup) String() string { | |
| switch g { | |
| case partitionGroupSystem: | |
| return "system" | |
| case partitionGroupVendor: | |
| return "vendor" | |
| case partitionGroupProduct: | |
| return "product" | |
| } | |
| return "" | |
| } | |
| // Get partition group of java module that can be used at inter-partition dependency check. | |
| // We currently have three groups | |
| // | |
| // (system, system_ext) => system partition group | |
| // (vendor, odm) => vendor partition group | |
| // (product) => product partition group | |
| func (j *Module) partitionGroup(ctx android.EarlyModuleContext) partitionGroup { | |
| // system and system_ext partition can be treated as the same in terms of inter-partition dependency. | |
| if j.Platform() || j.SystemExtSpecific() { | |
| return partitionGroupSystem | |
| } | |
| // vendor and odm partition can be treated as the same in terms of inter-partition dependency. | |
| if j.SocSpecific() || j.DeviceSpecific() { | |
| return partitionGroupVendor | |
| } | |
| // product partition is independent. | |
| if j.ProductSpecific() { | |
| return partitionGroupProduct | |
| } | |
| panic("Cannot determine partition type") | |
| } | |
| func (j *Module) allowListedInterPartitionJavaLibrary(ctx android.EarlyModuleContext) bool { | |
| return inList(j.Name(), ctx.Config().InterPartitionJavaLibraryAllowList()) | |
| } | |
| func (j *Module) syspropWithPublicStubs() bool { | |
| return j.deviceProperties.SyspropPublicStub != "" | |
| } | |
| type javaSdkLibraryEnforceContext interface { | |
| Name() string | |
| allowListedInterPartitionJavaLibrary(ctx android.EarlyModuleContext) bool | |
| partitionGroup(ctx android.EarlyModuleContext) partitionGroup | |
| syspropWithPublicStubs() bool | |
| } | |
| var _ javaSdkLibraryEnforceContext = (*Module)(nil) | |
| func (j *Module) checkPartitionsForJavaDependency(ctx android.EarlyModuleContext, propName string, dep javaSdkLibraryEnforceContext) { | |
| if dep.allowListedInterPartitionJavaLibrary(ctx) { | |
| return | |
| } | |
| if dep.syspropWithPublicStubs() { | |
| return | |
| } | |
| // If product interface is not enforced, skip check between system and product partition. | |
| // But still need to check between product and vendor partition because product interface flag | |
| // just represents enforcement between product and system, and vendor interface enforcement | |
| // that is enforced here by precondition is representing enforcement between vendor and other partitions. | |
| if !ctx.Config().EnforceProductPartitionInterface() { | |
| productToSystem := j.partitionGroup(ctx) == partitionGroupProduct && dep.partitionGroup(ctx) == partitionGroupSystem | |
| systemToProduct := j.partitionGroup(ctx) == partitionGroupSystem && dep.partitionGroup(ctx) == partitionGroupProduct | |
| if productToSystem || systemToProduct { | |
| return | |
| } | |
| } | |
| // If module and dependency library is inter-partition | |
| if j.partitionGroup(ctx) != dep.partitionGroup(ctx) { | |
| errorFormat := "dependency on java_library (%q) is not allowed across the partitions (%s -> %s), use java_sdk_library instead" | |
| ctx.PropertyErrorf(propName, errorFormat, dep.Name(), j.partitionGroup(ctx), dep.partitionGroup(ctx)) | |
| } | |
| } |