github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/java/app.go (about) 1 // Copyright 2015 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 // This file contains the module types for compiling Android apps. 18 19 import ( 20 "strings" 21 22 "github.com/google/blueprint/proptools" 23 24 "android/soong/android" 25 ) 26 27 func init() { 28 android.RegisterModuleType("android_app", AndroidAppFactory) 29 } 30 31 // AndroidManifest.xml merging 32 // package splits 33 34 type appProperties struct { 35 // path to a certificate, or the name of a certificate in the default 36 // certificate directory, or blank to use the default product certificate 37 Certificate *string 38 39 // paths to extra certificates to sign the apk with 40 Additional_certificates []string 41 42 // If set, create package-export.apk, which other packages can 43 // use to get PRODUCT-agnostic resource data like IDs and type definitions. 44 Export_package_resources *bool 45 46 // Specifies that this app should be installed to the priv-app directory, 47 // where the system will grant it additional privileges not available to 48 // normal apps. 49 Privileged *bool 50 51 // list of resource labels to generate individual resource packages 52 Package_splits []string 53 54 Instrumentation_for *string 55 } 56 57 type AndroidApp struct { 58 Library 59 aapt 60 61 certificate certificate 62 63 appProperties appProperties 64 } 65 66 func (a *AndroidApp) ExportedProguardFlagFiles() android.Paths { 67 return nil 68 } 69 70 func (a *AndroidApp) ExportedStaticPackages() android.Paths { 71 return nil 72 } 73 74 var _ AndroidLibraryDependency = (*AndroidApp)(nil) 75 76 type certificate struct { 77 pem, key android.Path 78 } 79 80 func (a *AndroidApp) DepsMutator(ctx android.BottomUpMutatorContext) { 81 a.Module.deps(ctx) 82 if !Bool(a.properties.No_framework_libs) && !Bool(a.properties.No_standard_libs) { 83 a.aapt.deps(ctx, String(a.deviceProperties.Sdk_version)) 84 } 85 } 86 87 func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { 88 var linkFlags []string 89 if String(a.appProperties.Instrumentation_for) != "" { 90 linkFlags = append(linkFlags, 91 "--rename-instrumentation-target-package", 92 String(a.appProperties.Instrumentation_for)) 93 } else { 94 a.properties.Instrument = true 95 } 96 97 hasProduct := false 98 for _, f := range a.aaptProperties.Aaptflags { 99 if strings.HasPrefix(f, "--product") { 100 hasProduct = true 101 } 102 } 103 104 // Product characteristics 105 if !hasProduct && len(ctx.Config().ProductAAPTCharacteristics()) > 0 { 106 linkFlags = append(linkFlags, "--product", ctx.Config().ProductAAPTCharacteristics()) 107 } 108 109 // Product AAPT config 110 for _, aaptConfig := range ctx.Config().ProductAAPTConfig() { 111 linkFlags = append(linkFlags, "-c", aaptConfig) 112 } 113 114 // Product AAPT preferred config 115 if len(ctx.Config().ProductAAPTPreferredConfig()) > 0 { 116 linkFlags = append(linkFlags, "--preferred-density", ctx.Config().ProductAAPTPreferredConfig()) 117 } 118 119 // TODO: LOCAL_PACKAGE_OVERRIDES 120 // $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \ 121 122 a.aapt.buildActions(ctx, String(a.deviceProperties.Sdk_version), linkFlags...) 123 124 // apps manifests are handled by aapt, don't let Module see them 125 a.properties.Manifest = nil 126 127 var staticLibProguardFlagFiles android.Paths 128 ctx.VisitDirectDeps(func(m android.Module) { 129 if lib, ok := m.(AndroidLibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag { 130 staticLibProguardFlagFiles = append(staticLibProguardFlagFiles, lib.ExportedProguardFlagFiles()...) 131 } 132 }) 133 134 staticLibProguardFlagFiles = android.FirstUniquePaths(staticLibProguardFlagFiles) 135 136 a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles, staticLibProguardFlagFiles...) 137 a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles, a.proguardOptionsFile) 138 139 if ctx.ModuleName() != "framework-res" { 140 a.Module.compile(ctx, a.aaptSrcJar) 141 } 142 143 c := String(a.appProperties.Certificate) 144 switch { 145 case c == "": 146 pem, key := ctx.Config().DefaultAppCertificate(ctx) 147 a.certificate = certificate{pem, key} 148 case strings.ContainsRune(c, '/'): 149 a.certificate = certificate{ 150 android.PathForSource(ctx, c+".x509.pem"), 151 android.PathForSource(ctx, c+".pk8"), 152 } 153 default: 154 defaultDir := ctx.Config().DefaultAppCertificateDir(ctx) 155 a.certificate = certificate{ 156 defaultDir.Join(ctx, c+".x509.pem"), 157 defaultDir.Join(ctx, c+".pk8"), 158 } 159 } 160 161 certificates := []certificate{a.certificate} 162 for _, c := range a.appProperties.Additional_certificates { 163 certificates = append(certificates, certificate{ 164 android.PathForSource(ctx, c+".x509.pem"), 165 android.PathForSource(ctx, c+".pk8"), 166 }) 167 } 168 169 packageFile := android.PathForModuleOut(ctx, "package.apk") 170 171 CreateAppPackage(ctx, packageFile, a.exportPackage, a.outputFile, certificates) 172 173 a.outputFile = packageFile 174 175 if ctx.ModuleName() == "framework-res" { 176 // framework-res.apk is installed as system/framework/framework-res.apk 177 ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".apk", a.outputFile) 178 } else if Bool(a.appProperties.Privileged) { 179 ctx.InstallFile(android.PathForModuleInstall(ctx, "priv-app"), ctx.ModuleName()+".apk", a.outputFile) 180 } else { 181 ctx.InstallFile(android.PathForModuleInstall(ctx, "app"), ctx.ModuleName()+".apk", a.outputFile) 182 } 183 } 184 185 func AndroidAppFactory() android.Module { 186 module := &AndroidApp{} 187 188 module.Module.deviceProperties.Optimize.Enabled = proptools.BoolPtr(true) 189 module.Module.deviceProperties.Optimize.Shrink = proptools.BoolPtr(true) 190 191 module.AddProperties( 192 &module.Module.properties, 193 &module.Module.deviceProperties, 194 &module.Module.protoProperties, 195 &module.aaptProperties, 196 &module.appProperties) 197 198 android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 199 return module 200 }