From a4f08813a34418a07aa0ebd8b3e704f3a82081ef Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 2 Oct 2018 22:03:40 -0700 Subject: Add support for JNI libraries to android_app modules Make android_app modules a MultiTargets module, which means the common variant will have a list of Targets that it needs to handle. Collect JNI libraries for each Target, and package them into or alongside the APK. Bug: 80095087 Test: app_test.go Change-Id: Iabd3921e1d4c4b4cfcc7e131a0b0d9ab83b0ebbb --- java/java.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'java/java.go') diff --git a/java/java.go b/java/java.go index b4b8feb23..7ef3626d6 100644 --- a/java/java.go +++ b/java/java.go @@ -95,9 +95,6 @@ type CompilerProperties struct { // list of java libraries that will be compiled into the resulting jar Static_libs []string `android:"arch_variant"` - // list of native libraries that will be provided in or alongside the resulting jar - Jni_libs []string `android:"arch_variant"` - // manifest file to be included in resulting jar Manifest *string @@ -365,6 +362,11 @@ type dependencyTag struct { name string } +type jniDependencyTag struct { + blueprint.BaseDependencyTag + target android.Target +} + var ( staticLibTag = dependencyTag{name: "staticlib"} libTag = dependencyTag{name: "javalib"} @@ -389,6 +391,12 @@ type sdkDep struct { aidl android.Path } +type jniLib struct { + name string + path android.Path + target android.Target +} + func (j *Module) shouldInstrument(ctx android.BaseContext) bool { return j.properties.Instrument && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT") } @@ -597,6 +605,7 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { ctx.AddFarVariationDependencies([]blueprint.Variation{ {Mutator: "arch", Variation: ctx.Config().BuildOsCommonVariant}, }, annoTag, j.properties.Annotation_processors...) + android.ExtractSourcesDeps(ctx, j.properties.Srcs) android.ExtractSourcesDeps(ctx, j.properties.Exclude_srcs) android.ExtractSourcesDeps(ctx, j.properties.Java_resources) @@ -787,6 +796,11 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) + if _, ok := tag.(*jniDependencyTag); ok { + // Handled by AndroidApp.collectJniDeps + return + } + if to, ok := module.(*Library); ok { switch tag { case bootClasspathTag, libTag, staticLibTag: -- cgit v1.2.3-59-g8ed1b From bd01e2abee24a1567438f66602bec4309da85bde Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 4 Oct 2018 15:21:03 -0700 Subject: Add support for android_app_certificate modules Some android_app modules need certificates located outside their directory. Instead of requiring paths from the root of the tree, add an android_app_certificate module that exports the certificate files. Test: m checkbuild Change-Id: Icbf3898894f3eb857e2d907e3e58dd072c6fabe9 --- androidmk/cmd/androidmk/android.go | 1 + java/app.go | 114 ++++++++++++++++++++++++++----------- java/java.go | 7 ++- 3 files changed, 89 insertions(+), 33 deletions(-) (limited to 'java/java.go') diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index 0cb6dd68c..10e5b0a24 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -155,6 +155,7 @@ func init() { // java_library_static to android_library. "LOCAL_SHARED_ANDROID_LIBRARIES": "android_libs", "LOCAL_STATIC_ANDROID_LIBRARIES": "android_static_libs", + "LOCAL_ADDITIONAL_CERTIFICATES": "additional_certificates", }) addStandardProperties(bpparser.BoolType, diff --git a/java/app.go b/java/app.go index 843ced6af..b9088c335 100644 --- a/java/app.go +++ b/java/app.go @@ -30,17 +30,18 @@ import ( func init() { android.RegisterModuleType("android_app", AndroidAppFactory) android.RegisterModuleType("android_test", AndroidTestFactory) + android.RegisterModuleType("android_app_certificate", AndroidAppCertificateFactory) } // AndroidManifest.xml merging // package splits type appProperties struct { - // path to a certificate, or the name of a certificate in the default - // certificate directory, or blank to use the default product certificate + // The name of a certificate in the default certificate directory, blank to use the default product certificate, + // or an android_app_certificate module name in the form ":module". Certificate *string - // paths to extra certificates to sign the apk with + // Names of extra android_app_certificate modules to sign the apk with in the form ":module". Additional_certificates []string // If set, create package-export.apk, which other packages can @@ -116,6 +117,21 @@ func (a *AndroidApp) DepsMutator(ctx android.BottomUpMutatorContext) { } ctx.AddFarVariationDependencies(variation, tag, a.appProperties.Jni_libs...) } + + cert := android.SrcIsModule(String(a.appProperties.Certificate)) + if cert != "" { + ctx.AddDependency(ctx.Module(), certificateTag, cert) + } + + for _, cert := range a.appProperties.Additional_certificates { + cert = android.SrcIsModule(cert) + if cert != "" { + ctx.AddDependency(ctx.Module(), certificateTag, cert) + } else { + ctx.PropertyErrorf("additional_certificates", + `must be names of android_app_certificate modules in the form ":module"`) + } + } } func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -171,36 +187,12 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.Module.compile(ctx, a.aaptSrcJar) } - c := String(a.appProperties.Certificate) - switch { - case c == "": - pem, key := ctx.Config().DefaultAppCertificate(ctx) - a.certificate = certificate{pem, key} - case strings.ContainsRune(c, '/'): - a.certificate = certificate{ - android.PathForSource(ctx, c+".x509.pem"), - android.PathForSource(ctx, c+".pk8"), - } - default: - defaultDir := ctx.Config().DefaultAppCertificateDir(ctx) - a.certificate = certificate{ - defaultDir.Join(ctx, c+".x509.pem"), - defaultDir.Join(ctx, c+".pk8"), - } - } - - certificates := []certificate{a.certificate} - for _, c := range a.appProperties.Additional_certificates { - certificates = append(certificates, certificate{ - android.PathForSource(ctx, c+".x509.pem"), - android.PathForSource(ctx, c+".pk8"), - }) - } - packageFile := android.PathForModuleOut(ctx, "package.apk") + var certificates []certificate + var jniJarFile android.WritablePath - jniLibs := a.collectJniDeps(ctx) + jniLibs, certificateDeps := a.collectAppDeps(ctx) if len(jniLibs) > 0 { embedJni := ctx.Config().UnbundledBuild() || a.appProperties.EmbedJNI if embedJni { @@ -211,6 +203,28 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { } } + if ctx.Failed() { + return + } + + cert := String(a.appProperties.Certificate) + certModule := android.SrcIsModule(cert) + if certModule != "" { + a.certificate = certificateDeps[0] + certificateDeps = certificateDeps[1:] + } else if cert != "" { + defaultDir := ctx.Config().DefaultAppCertificateDir(ctx) + a.certificate = certificate{ + defaultDir.Join(ctx, cert+".x509.pem"), + defaultDir.Join(ctx, cert+".pk8"), + } + } else { + pem, key := ctx.Config().DefaultAppCertificate(ctx) + a.certificate = certificate{pem, key} + } + + certificates = append([]certificate{a.certificate}, certificateDeps...) + CreateAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, a.outputFile, certificates) a.outputFile = packageFile @@ -225,8 +239,9 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { } } -func (a *AndroidApp) collectJniDeps(ctx android.ModuleContext) []jniLib { +func (a *AndroidApp) collectAppDeps(ctx android.ModuleContext) ([]jniLib, []certificate) { var jniLibs []jniLib + var certificates []certificate ctx.VisitDirectDeps(func(module android.Module) { otherName := ctx.OtherModuleName(module) @@ -248,10 +263,16 @@ func (a *AndroidApp) collectJniDeps(ctx android.ModuleContext) []jniLib { ctx.ModuleErrorf("jni_libs dependency %q must be a cc library", otherName) } + } else if tag == certificateTag { + if dep, ok := module.(*AndroidAppCertificate); ok { + certificates = append(certificates, dep.certificate) + } else { + ctx.ModuleErrorf("certificate dependency %q must be an android_app_certificate module", otherName) + } } }) - return jniLibs + return jniLibs, certificates } func AndroidAppFactory() android.Module { @@ -337,3 +358,32 @@ func AndroidTestFactory() android.Module { android.InitDefaultableModule(module) return module } + +type AndroidAppCertificate struct { + android.ModuleBase + properties AndroidAppCertificateProperties + certificate certificate +} + +type AndroidAppCertificateProperties struct { + // Name of the certificate files. Extensions .x509.pem and .pk8 will be added to the name. + Certificate *string +} + +func AndroidAppCertificateFactory() android.Module { + module := &AndroidAppCertificate{} + module.AddProperties(&module.properties) + android.InitAndroidModule(module) + return module +} + +func (c *AndroidAppCertificate) DepsMutator(ctx android.BottomUpMutatorContext) { +} + +func (c *AndroidAppCertificate) GenerateAndroidBuildActions(ctx android.ModuleContext) { + cert := String(c.properties.Certificate) + c.certificate = certificate{ + android.PathForModuleSrc(ctx, cert+".x509.pem"), + android.PathForModuleSrc(ctx, cert+".pk8"), + } +} diff --git a/java/java.go b/java/java.go index 7ef3626d6..c5414f4fa 100644 --- a/java/java.go +++ b/java/java.go @@ -377,6 +377,7 @@ var ( frameworkApkTag = dependencyTag{name: "framework-apk"} kotlinStdlibTag = dependencyTag{name: "kotlin-stdlib"} proguardRaiseTag = dependencyTag{name: "proguard-raise"} + certificateTag = dependencyTag{name: "certificate"} ) type sdkDep struct { @@ -797,7 +798,11 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { tag := ctx.OtherModuleDependencyTag(module) if _, ok := tag.(*jniDependencyTag); ok { - // Handled by AndroidApp.collectJniDeps + // Handled by AndroidApp.collectAppDeps + return + } + if tag == certificateTag { + // Handled by AndroidApp.collectAppDeps return } -- cgit v1.2.3-59-g8ed1b