Merge "Set a dedicated variable for the runtime apex libs."
diff --git a/android/arch.go b/android/arch.go
index b88b275..151cabd 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -107,6 +107,7 @@
 
 var archVariants = map[ArchType][]string{
 	Arm: {
+		"armv7-a",
 		"armv7-a-neon",
 		"armv8-a",
 		"armv8-2a",
@@ -1314,6 +1315,7 @@
 
 func getMegaDeviceConfig() []archConfig {
 	return []archConfig{
+		{"arm", "armv7-a", "generic", []string{"armeabi-v7a"}},
 		{"arm", "armv7-a-neon", "generic", []string{"armeabi-v7a"}},
 		{"arm", "armv7-a-neon", "cortex-a7", []string{"armeabi-v7a"}},
 		{"arm", "armv7-a-neon", "cortex-a8", []string{"armeabi-v7a"}},
@@ -1365,7 +1367,7 @@
 
 func getNdkAbisConfig() []archConfig {
 	return []archConfig{
-		{"arm", "armv7-a-neon", "", []string{"armeabi"}},
+		{"arm", "armv7-a", "", []string{"armeabi"}},
 		{"arm64", "armv8-a", "", []string{"arm64-v8a"}},
 		{"x86", "", "", []string{"x86"}},
 		{"x86_64", "", "", []string{"x86_64"}},
diff --git a/cc/config/arm_device.go b/cc/config/arm_device.go
index aee16eb..cd7c410 100644
--- a/cc/config/arm_device.go
+++ b/cc/config/arm_device.go
@@ -51,6 +51,11 @@
 	}
 
 	armClangArchVariantCflags = map[string][]string{
+		"armv7-a": []string{
+			"-march=armv7-a",
+			"-mfloat-abi=softfp",
+			"-mfpu=vfpv3-d16",
+		},
 		"armv7-a-neon": []string{
 			"-march=armv7-a",
 			"-mfloat-abi=softfp",
@@ -184,6 +189,8 @@
 	pctx.StaticVariable("ArmClangThumbCflags", strings.Join(ClangFilterUnknownCflags(armThumbCflags), " "))
 
 	// Clang arch variant cflags
+	pctx.StaticVariable("ArmClangArmv7ACflags",
+		strings.Join(armClangArchVariantCflags["armv7-a"], " "))
 	pctx.StaticVariable("ArmClangArmv7ANeonCflags",
 		strings.Join(armClangArchVariantCflags["armv7-a-neon"], " "))
 	pctx.StaticVariable("ArmClangArmv8ACflags",
@@ -212,6 +219,7 @@
 
 var (
 	armClangArchVariantCflagsVar = map[string]string{
+		"armv7-a":      "${config.ArmClangArmv7ACflags}",
 		"armv7-a-neon": "${config.ArmClangArmv7ANeonCflags}",
 		"armv8-a":      "${config.ArmClangArmv8ACflags}",
 		"armv8-2a":     "${config.ArmClangArmv82ACflags}",
@@ -327,6 +335,8 @@
 		default:
 			fixCortexA8 = "-Wl,--no-fix-cortex-a8"
 		}
+	case "armv7-a":
+		fixCortexA8 = "-Wl,--fix-cortex-a8"
 	case "armv8-a", "armv8-2a":
 		// Nothing extra for armv8-a/armv8-2a
 	default:
diff --git a/cc/config/clang.go b/cc/config/clang.go
index 832689b..6a1c736 100644
--- a/cc/config/clang.go
+++ b/cc/config/clang.go
@@ -97,7 +97,7 @@
 	pctx.StaticVariable("ClangExtraCflags", strings.Join([]string{
 		"-D__compiler_offsetof=__builtin_offsetof",
 
-		// -Wimplicit fallthrough is not enabled by -Wall.
+		// -Wimplicit-fallthrough is not enabled by -Wall.
 		"-Wimplicit-fallthrough",
 
 		// Help catch common 32/64-bit errors.
diff --git a/cc/proto.go b/cc/proto.go
index 61fd607..ce8a30e 100644
--- a/cc/proto.go
+++ b/cc/proto.go
@@ -112,6 +112,18 @@
 	case "nanopb-c-enable_malloc":
 		lib = "libprotobuf-c-nano-enable_malloc"
 		static = true
+	case "nanopb-c-16bit":
+		lib = "libprotobuf-c-nano-16bit"
+		static = true
+	case "nanopb-c-enable_malloc-16bit":
+		lib = "libprotobuf-c-nano-enable_malloc-16bit"
+		static = true
+	case "nanopb-c-32bit":
+		lib = "libprotobuf-c-nano-32bit"
+		static = true
+	case "nanopb-c-enable_malloc-32bit":
+		lib = "libprotobuf-c-nano-enable_malloc-32bit"
+		static = true
 	default:
 		ctx.PropertyErrorf("proto.type", "unknown proto type %q",
 			String(p.Proto.Type))
@@ -142,7 +154,7 @@
 	var plugin string
 
 	switch String(p.Proto.Type) {
-	case "nanopb-c", "nanopb-c-enable_malloc":
+	case "nanopb-c", "nanopb-c-enable_malloc", "nanopb-c-16bit", "nanopb-c-enable_malloc-16bit", "nanopb-c-32bit", "nanopb-c-enable_malloc-32bit":
 		flags.protoC = true
 		flags.protoOptionsFile = true
 		flags.protoOutTypeFlag = "--nanopb_out"
diff --git a/java/aapt2.go b/java/aapt2.go
index 86eb9c8..d217b9f 100644
--- a/java/aapt2.go
+++ b/java/aapt2.go
@@ -109,6 +109,31 @@
 	})
 }
 
+var aapt2CompileZipRule = pctx.AndroidStaticRule("aapt2CompileZip",
+	blueprint.RuleParams{
+		Command: `${config.ZipSyncCmd} -d $resZipDir $in && ` +
+			`${config.Aapt2Cmd} compile -o $out $cFlags --legacy --dir $resZipDir`,
+		CommandDeps: []string{
+			"${config.Aapt2Cmd}",
+			"${config.ZipSyncCmd}",
+		},
+	}, "cFlags", "resZipDir")
+
+func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip android.Path) {
+	ctx.Build(pctx, android.BuildParams{
+		Rule:        aapt2CompileZipRule,
+		Description: "aapt2 compile zip",
+		Input:       zip,
+		Output:      flata,
+		Args: map[string]string{
+			// Always set --pseudo-localize, it will be stripped out later for release
+			// builds that don't want it.
+			"cFlags":    "--pseudo-localize",
+			"resZipDir": android.PathForModuleOut(ctx, "aapt2", "reszip", flata.Base()).String(),
+		},
+	})
+}
+
 var aapt2LinkRule = pctx.AndroidStaticRule("aapt2Link",
 	blueprint.RuleParams{
 		Command: `rm -rf $genDir && ` +
diff --git a/java/aar.go b/java/aar.go
index e5ab036..9eb2b27 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -16,6 +16,7 @@
 
 import (
 	"android/soong/android"
+	"fmt"
 	"strings"
 
 	"github.com/google/blueprint"
@@ -62,6 +63,9 @@
 	// Set to [] to disable the default.
 	Resource_dirs []string
 
+	// list of zip files containing Android resources.
+	Resource_zips []string
+
 	// path to AndroidManifest.xml.  If unset, defaults to "AndroidManifest.xml".
 	Manifest *string
 }
@@ -95,7 +99,7 @@
 }
 
 func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext, manifestPath android.Path) (flags []string,
-	deps android.Paths, resDirs, overlayDirs []globbedResourceDir, rroDirs android.Paths) {
+	deps android.Paths, resDirs, overlayDirs []globbedResourceDir, rroDirs, resZips android.Paths) {
 
 	hasVersionCode := false
 	hasVersionName := false
@@ -117,6 +121,7 @@
 	// Find implicit or explicit asset and resource dirs
 	assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets")
 	resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res")
+	resourceZips := ctx.ExpandSources(a.aaptProperties.Resource_zips, nil)
 
 	var linkDeps android.Paths
 
@@ -167,7 +172,7 @@
 		linkFlags = append(linkFlags, "--version-name ", versionName)
 	}
 
-	return linkFlags, linkDeps, resDirs, overlayDirs, rroDirs
+	return linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips
 }
 
 func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkContext sdkContext) {
@@ -175,6 +180,8 @@
 	if sdkDep.frameworkResModule != "" {
 		ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
 	}
+
+	android.ExtractSourcesDeps(ctx, a.aaptProperties.Resource_zips)
 }
 
 func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, extraLinkFlags ...string) {
@@ -187,7 +194,7 @@
 	manifestPath := manifestMerger(ctx, manifestSrcPath, sdkContext, staticLibManifests, a.isLibrary,
 		a.uncompressedJNI, a.useEmbeddedDex, a.usesNonSdkApis)
 
-	linkFlags, linkDeps, resDirs, overlayDirs, rroDirs := a.aapt2Flags(ctx, sdkContext, manifestPath)
+	linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, sdkContext, manifestPath)
 
 	rroDirs = append(rroDirs, staticRRODirs...)
 	linkFlags = append(linkFlags, libFlags...)
@@ -209,6 +216,12 @@
 		compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files).Paths())
 	}
 
+	for i, zip := range resZips {
+		flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
+		aapt2CompileZip(ctx, flata, zip)
+		compiledResDirs = append(compiledResDirs, android.Paths{flata})
+	}
+
 	var compiledRes, compiledOverlay android.Paths
 
 	compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)