| JaeMan Park | ff71556 | 2020-10-19 17:25:58 +0900 | [diff] [blame] | 1 | // Copyright 2020 Google Inc. All rights reserved. | 
|  | 2 | // | 
|  | 3 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 4 | // you may not use this file except in compliance with the License. | 
|  | 5 | // You may obtain a copy of the License at | 
|  | 6 | // | 
|  | 7 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 8 | // | 
|  | 9 | // Unless required by applicable law or agreed to in writing, software | 
|  | 10 | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 12 | // See the License for the specific language governing permissions and | 
|  | 13 | // limitations under the License. | 
|  | 14 |  | 
|  | 15 | package java | 
|  | 16 |  | 
|  | 17 | import ( | 
|  | 18 | "android/soong/android" | 
|  | 19 | ) | 
|  | 20 |  | 
|  | 21 | type partitionGroup int | 
|  | 22 |  | 
|  | 23 | // Representation of partition group for checking inter-partition library dependencies. | 
|  | 24 | // Between system and system_ext, there are no restrictions of dependencies, | 
|  | 25 | // so we can treat these partitions as the same in terms of inter-partition dependency. | 
|  | 26 | // Same policy is applied between vendor and odm partiton. | 
|  | 27 | const ( | 
|  | 28 | partitionGroupNone partitionGroup = iota | 
|  | 29 | // group for system, and system_ext partition | 
|  | 30 | partitionGroupSystem | 
|  | 31 | // group for vendor and odm partition | 
|  | 32 | partitionGroupVendor | 
|  | 33 | // product partition | 
|  | 34 | partitionGroupProduct | 
|  | 35 | ) | 
|  | 36 |  | 
|  | 37 | func (g partitionGroup) String() string { | 
|  | 38 | switch g { | 
|  | 39 | case partitionGroupSystem: | 
|  | 40 | return "system" | 
|  | 41 | case partitionGroupVendor: | 
|  | 42 | return "vendor" | 
|  | 43 | case partitionGroupProduct: | 
|  | 44 | return "product" | 
|  | 45 | } | 
|  | 46 |  | 
|  | 47 | return "" | 
|  | 48 | } | 
|  | 49 |  | 
|  | 50 | // Get partition group of java module that can be used at inter-partition dependency check. | 
|  | 51 | // We currently have three groups | 
| Colin Cross | d079e0b | 2022-08-16 10:27:33 -0700 | [diff] [blame] | 52 | // | 
|  | 53 | //	(system, system_ext) => system partition group | 
|  | 54 | //	(vendor, odm) => vendor partition group | 
|  | 55 | //	(product) => product partition group | 
| JaeMan Park | ff71556 | 2020-10-19 17:25:58 +0900 | [diff] [blame] | 56 | func (j *Module) partitionGroup(ctx android.EarlyModuleContext) partitionGroup { | 
|  | 57 | // system and system_ext partition can be treated as the same in terms of inter-partition dependency. | 
|  | 58 | if j.Platform() || j.SystemExtSpecific() { | 
|  | 59 | return partitionGroupSystem | 
|  | 60 | } | 
|  | 61 |  | 
|  | 62 | // vendor and odm partition can be treated as the same in terms of inter-partition dependency. | 
|  | 63 | if j.SocSpecific() || j.DeviceSpecific() { | 
|  | 64 | return partitionGroupVendor | 
|  | 65 | } | 
|  | 66 |  | 
|  | 67 | // product partition is independent. | 
|  | 68 | if j.ProductSpecific() { | 
|  | 69 | return partitionGroupProduct | 
|  | 70 | } | 
|  | 71 |  | 
|  | 72 | panic("Cannot determine partition type") | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | func (j *Module) allowListedInterPartitionJavaLibrary(ctx android.EarlyModuleContext) bool { | 
|  | 76 | return inList(j.Name(), ctx.Config().InterPartitionJavaLibraryAllowList()) | 
|  | 77 | } | 
|  | 78 |  | 
| Colin Cross | 75ce9ec | 2021-02-26 16:20:32 -0800 | [diff] [blame] | 79 | func (j *Module) syspropWithPublicStubs() bool { | 
|  | 80 | return j.deviceProperties.SyspropPublicStub != "" | 
|  | 81 | } | 
|  | 82 |  | 
| JaeMan Park | ff71556 | 2020-10-19 17:25:58 +0900 | [diff] [blame] | 83 | type javaSdkLibraryEnforceContext interface { | 
|  | 84 | Name() string | 
|  | 85 | allowListedInterPartitionJavaLibrary(ctx android.EarlyModuleContext) bool | 
|  | 86 | partitionGroup(ctx android.EarlyModuleContext) partitionGroup | 
| Colin Cross | 75ce9ec | 2021-02-26 16:20:32 -0800 | [diff] [blame] | 87 | syspropWithPublicStubs() bool | 
| JaeMan Park | ff71556 | 2020-10-19 17:25:58 +0900 | [diff] [blame] | 88 | } | 
|  | 89 |  | 
|  | 90 | var _ javaSdkLibraryEnforceContext = (*Module)(nil) | 
|  | 91 |  | 
|  | 92 | func (j *Module) checkPartitionsForJavaDependency(ctx android.EarlyModuleContext, propName string, dep javaSdkLibraryEnforceContext) { | 
|  | 93 | if dep.allowListedInterPartitionJavaLibrary(ctx) { | 
|  | 94 | return | 
|  | 95 | } | 
|  | 96 |  | 
| Colin Cross | 75ce9ec | 2021-02-26 16:20:32 -0800 | [diff] [blame] | 97 | if dep.syspropWithPublicStubs() { | 
|  | 98 | return | 
|  | 99 | } | 
|  | 100 |  | 
| JaeMan Park | ff71556 | 2020-10-19 17:25:58 +0900 | [diff] [blame] | 101 | // If product interface is not enforced, skip check between system and product partition. | 
|  | 102 | // But still need to check between product and vendor partition because product interface flag | 
|  | 103 | // just represents enforcement between product and system, and vendor interface enforcement | 
|  | 104 | // that is enforced here by precondition is representing enforcement between vendor and other partitions. | 
|  | 105 | if !ctx.Config().EnforceProductPartitionInterface() { | 
|  | 106 | productToSystem := j.partitionGroup(ctx) == partitionGroupProduct && dep.partitionGroup(ctx) == partitionGroupSystem | 
|  | 107 | systemToProduct := j.partitionGroup(ctx) == partitionGroupSystem && dep.partitionGroup(ctx) == partitionGroupProduct | 
|  | 108 |  | 
|  | 109 | if productToSystem || systemToProduct { | 
|  | 110 | return | 
|  | 111 | } | 
|  | 112 | } | 
|  | 113 |  | 
|  | 114 | // If module and dependency library is inter-partition | 
|  | 115 | if j.partitionGroup(ctx) != dep.partitionGroup(ctx) { | 
|  | 116 | errorFormat := "dependency on java_library (%q) is not allowed across the partitions (%s -> %s), use java_sdk_library instead" | 
|  | 117 | ctx.PropertyErrorf(propName, errorFormat, dep.Name(), j.partitionGroup(ctx), dep.partitionGroup(ctx)) | 
|  | 118 | } | 
|  | 119 | } |