Merge "Revert "Set LOCAL_PREBUILT_MODULE_FILE for hostdex modules""
diff --git a/Android.bp b/Android.bp
index d5f052e..b4a9d30 100644
--- a/Android.bp
+++ b/Android.bp
@@ -285,6 +285,7 @@
deps: [
"blueprint",
"soong-android",
+ "soong-tradefed",
],
srcs: [
"python/androidmk.go",
diff --git a/OWNERS b/OWNERS
index d56644b..892beb7 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,4 +1,4 @@
-per-file * = ccross@android.com,dwillemsen@google.com,nanzhang@google.com,jungjw@google.com
+per-file * = ccross@android.com,dwillemsen@google.com,jungjw@google.com
per-file ndk_*.go, *gen_stub_libs.py = danalbert@google.com
per-file clang.go,global.go = srhines@google.com, chh@google.com, pirama@google.com, yikong@google.com
per-file tidy.go = srhines@google.com, chh@google.com
diff --git a/android/arch.go b/android/arch.go
index bee09b0..e8d9c6e 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -106,6 +106,7 @@
var archVariants = map[ArchType][]string{}
var archFeatures = map[ArchType][]string{}
var archFeatureMap = map[ArchType]map[string][]string{}
+var defaultArchFeatureMap = map[OsType]map[ArchType][]string{}
func RegisterArchVariants(arch ArchType, variants ...string) {
checkCalledFromInit()
@@ -117,9 +118,24 @@
archFeatures[arch] = append(archFeatures[arch], features...)
}
+func RegisterDefaultArchVariantFeatures(os OsType, arch ArchType, features ...string) {
+ checkCalledFromInit()
+
+ for _, feature := range features {
+ if !InList(feature, archFeatures[arch]) {
+ panic(fmt.Errorf("Invalid feature %q for arch %q variant \"\"", feature, arch))
+ }
+ }
+
+ if defaultArchFeatureMap[os] == nil {
+ defaultArchFeatureMap[os] = make(map[ArchType][]string)
+ }
+ defaultArchFeatureMap[os][arch] = features
+}
+
func RegisterArchVariantFeatures(arch ArchType, variant string, features ...string) {
checkCalledFromInit()
- if variant != "" && !InList(variant, archVariants[arch]) {
+ if !InList(variant, archVariants[arch]) {
panic(fmt.Errorf("Invalid variant %q for arch %q", variant, arch))
}
@@ -952,7 +968,7 @@
return
}
- arch, err := decodeArch(archName, archVariant, cpuVariant, abi)
+ arch, err := decodeArch(os, archName, archVariant, cpuVariant, abi)
if err != nil {
targetErr = err
return
@@ -1127,11 +1143,11 @@
}
}
-func decodeArchSettings(archConfigs []archConfig) ([]Target, error) {
+func decodeArchSettings(os OsType, archConfigs []archConfig) ([]Target, error) {
var ret []Target
for _, config := range archConfigs {
- arch, err := decodeArch(config.arch, &config.archVariant,
+ arch, err := decodeArch(os, config.arch, &config.archVariant,
&config.cpuVariant, &config.abi)
if err != nil {
return nil, err
@@ -1147,7 +1163,7 @@
}
// Convert a set of strings from product variables into a single Arch struct
-func decodeArch(arch string, archVariant, cpuVariant *string, abi *[]string) (Arch, error) {
+func decodeArch(os OsType, arch string, archVariant, cpuVariant *string, abi *[]string) (Arch, error) {
stringPtr := func(p *string) string {
if p != nil {
return *p
@@ -1190,8 +1206,14 @@
}
}
- if featureMap, ok := archFeatureMap[archType]; ok {
- a.ArchFeatures = featureMap[a.ArchVariant]
+ if a.ArchVariant == "" {
+ if featureMap, ok := defaultArchFeatureMap[os]; ok {
+ a.ArchFeatures = featureMap[archType]
+ }
+ } else {
+ if featureMap, ok := archFeatureMap[archType]; ok {
+ a.ArchFeatures = featureMap[a.ArchVariant]
+ }
}
return a, nil
diff --git a/android/config.go b/android/config.go
index 38f6ec8..7c1278e 100644
--- a/android/config.go
+++ b/android/config.go
@@ -303,7 +303,7 @@
}
if archConfig != nil {
- androidTargets, err := decodeArchSettings(archConfig)
+ androidTargets, err := decodeArchSettings(Android, archConfig)
if err != nil {
return Config{}, err
}
@@ -649,7 +649,7 @@
func (c *config) EnableXOM() bool {
if c.productVariables.EnableXOM == nil {
- return false
+ return true
} else {
return Bool(c.productVariables.EnableXOM)
}
@@ -749,6 +749,14 @@
return c.productVariables.ModulesLoadedByPrivilegedModules
}
+func (c *config) BootJars() []string {
+ return c.productVariables.BootJars
+}
+
+func (c *config) PreoptBootJars() []string {
+ return c.productVariables.PreoptBootJars
+}
+
func (c *config) DisableDexPreopt(name string) bool {
return Bool(c.productVariables.DisableDexPreopt) || InList(name, c.productVariables.DisableDexPreoptModules)
}
diff --git a/android/neverallow.go b/android/neverallow.go
index f6caebc..18744e8 100644
--- a/android/neverallow.go
+++ b/android/neverallow.go
@@ -100,7 +100,6 @@
"core-all",
"core-oj",
"core-libart",
- "core-simple",
"okhttp",
"bouncycastle",
"conscrypt",
diff --git a/android/prebuilt_etc.go b/android/prebuilt_etc.go
index f7d08cc..40da653 100644
--- a/android/prebuilt_etc.go
+++ b/android/prebuilt_etc.go
@@ -17,6 +17,7 @@
import (
"fmt"
"io"
+ "strings"
)
// prebuilt_etc is for prebuilts that will be installed to
@@ -148,6 +149,7 @@
fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", "$(OUT_DIR)/"+p.installDirPath.RelPathString())
fmt.Fprintln(w, "LOCAL_INSTALLED_MODULE_STEM :=", p.outputFilePath.Base())
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !p.Installable())
+ fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(data.Required, " "))
if p.additionalDependencies != nil {
fmt.Fprint(w, "LOCAL_ADDITIONAL_DEPENDENCIES :=")
for _, path := range *p.additionalDependencies {
diff --git a/android/variable.go b/android/variable.go
index 7e976cd..ddaf166 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -198,6 +198,9 @@
UncompressPrivAppDex *bool `json:",omitempty"`
ModulesLoadedByPrivilegedModules []string `json:",omitempty"`
+ BootJars []string `json:",omitempty"`
+ PreoptBootJars []string `json:",omitempty"`
+
DisableDexPreopt *bool `json:",omitempty"`
DisableDexPreoptModules []string `json:",omitempty"`
DexPreoptProfileDir *string `json:",omitempty"`
diff --git a/apex/apex.go b/apex/apex.go
index a360374..6269868 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -346,7 +346,6 @@
bundleModuleFile android.WritablePath
outputFiles map[apexPackaging]android.WritablePath
installDir android.OutputPath
- runtimeDir android.OutputPath
// list of files to be included in this apex
filesInfo []apexFile
@@ -483,6 +482,11 @@
}
}
+func (a *apexBundle) IsSanitizerEnabled() bool {
+ // APEX can be mutated for sanitizers
+ return true
+}
+
func getCopyManifestForNativeLibrary(cc *cc.Module) (fileToCopy android.Path, dirInApex string) {
// Decide the APEX-local directory by the multilib of the library
// In the future, we may query this to the module.
@@ -661,7 +665,6 @@
}
a.installDir = android.PathForModuleInstall(ctx, "apex")
- a.runtimeDir = android.PathForOutput(ctx, "target", "product", ctx.Config().DeviceName(), "apex")
a.filesInfo = filesInfo
if a.apexTypes.zip() {
@@ -888,60 +891,53 @@
}
func (a *apexBundle) androidMkForType(apexType apexPackaging) android.AndroidMkData {
- return android.AndroidMkData{
- Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
- moduleNames := []string{}
- for _, fi := range a.filesInfo {
- if !android.InList(fi.moduleName, moduleNames) {
- moduleNames = append(moduleNames, fi.moduleName)
- }
- }
-
- for _, fi := range a.filesInfo {
- fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)")
- fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
- fmt.Fprintln(w, "LOCAL_MODULE :=", fi.moduleName)
- if a.flattened {
- // /system/apex/<name>/{lib|framework|...}
- fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", filepath.Join("$(OUT_DIR)",
- a.installDir.RelPathString(), name, fi.installDir))
- } else {
- // /apex/<name>/{lib|framework|...}
- fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", filepath.Join("$(OUT_DIR)",
- a.runtimeDir.RelPathString(), name, fi.installDir))
- }
- fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", fi.builtFile.String())
- fmt.Fprintln(w, "LOCAL_INSTALLED_MODULE_STEM :=", fi.builtFile.Base())
- fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", fi.class.NameInMake())
- fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !a.installable())
- archStr := fi.archType.String()
- if archStr != "common" {
- fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH :=", archStr)
- }
- if fi.class == nativeSharedLib || fi.class == nativeExecutable {
- if cc, ok := fi.module.(*cc.Module); ok && cc.UnstrippedOutputFile() != nil {
- fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", cc.UnstrippedOutputFile().String())
+ // Only image APEXes can be flattened.
+ if a.flattened && apexType.image() {
+ return android.AndroidMkData{
+ Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
+ moduleNames := []string{}
+ for _, fi := range a.filesInfo {
+ if !android.InList(fi.moduleName, moduleNames) {
+ moduleNames = append(moduleNames, fi.moduleName)
}
}
- if fi.class == javaSharedLib {
- javaModule := fi.module.(*java.Library)
- fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", javaModule.ImplementationAndResourcesJars()[0].String())
- fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", javaModule.HeaderJars()[0].String())
- fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", fi.builtFile.String())
- fmt.Fprintln(w, "LOCAL_DEX_PREOPT := false")
- fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_java_prebuilt.mk")
- } else {
- fmt.Fprintln(w, "include $(BUILD_PREBUILT)")
- }
- }
- if a.flattened && apexType.image() {
- // Only image APEXes can be flattened.
fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)")
fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
fmt.Fprintln(w, "LOCAL_MODULE :=", name)
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(moduleNames, " "))
fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)")
- } else {
+
+ for _, fi := range a.filesInfo {
+ if cc, ok := fi.module.(*cc.Module); ok && cc.Properties.HideFromMake {
+ continue
+ }
+ fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)")
+ fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
+ fmt.Fprintln(w, "LOCAL_MODULE :=", fi.moduleName)
+ fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", filepath.Join("$(OUT_DIR)", a.installDir.RelPathString(), name, fi.installDir))
+ fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", fi.builtFile.Base())
+ fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", fi.builtFile.String())
+ fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", fi.class.NameInMake())
+ fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !a.installable())
+ archStr := fi.archType.String()
+ if archStr != "common" {
+ fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH :=", archStr)
+ }
+ if fi.class == javaSharedLib {
+ javaModule := fi.module.(*java.Library)
+ fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", javaModule.ImplementationAndResourcesJars()[0].String())
+ fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", javaModule.HeaderJars()[0].String())
+ fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", fi.builtFile.String())
+ fmt.Fprintln(w, "LOCAL_DEX_PREOPT := false")
+ fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_java_prebuilt.mk")
+ } else {
+ fmt.Fprintln(w, "include $(BUILD_PREBUILT)")
+ }
+ }
+ }}
+ } else {
+ return android.AndroidMkData{
+ Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
// zip-apex is the less common type so have the name refer to the image-apex
// only and use {name}.zip if you want the zip-apex
if apexType == zipApex && a.apexTypes == both {
@@ -956,14 +952,13 @@
fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", name+apexType.suffix())
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !a.installable())
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", String(a.properties.Key))
- fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(moduleNames, " "))
fmt.Fprintln(w, "include $(BUILD_PREBUILT)")
if apexType == imageApex {
fmt.Fprintln(w, "ALL_MODULES.$(LOCAL_MODULE).BUNDLE :=", a.bundleModuleFile.String())
}
- }
- }}
+ }}
+ }
}
func ApexBundleFactory() android.Module {
diff --git a/cc/cc.go b/cc/cc.go
index e5d1dd3..4717b72 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -60,6 +60,7 @@
ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
+ ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
ctx.BottomUp("coverage", coverageLinkingMutator).Parallel()
ctx.TopDown("vndk_deps", sabiDepsMutator)
@@ -398,15 +399,6 @@
return c.outputFile
}
-func (c *Module) UnstrippedOutputFile() android.Path {
- if library, ok := c.linker.(*libraryDecorator); ok {
- return library.unstrippedOutputFile
- } else if binary, ok := c.linker.(*binaryDecorator); ok {
- return binary.unstrippedOutputFile
- }
- return nil
-}
-
func (c *Module) Init() android.Module {
c.AddProperties(&c.Properties, &c.VendorProperties)
if c.compiler != nil {
@@ -533,6 +525,8 @@
func (c *Module) IsStubs() bool {
if library, ok := c.linker.(*libraryDecorator); ok {
return library.buildStubs()
+ } else if _, ok := c.linker.(*llndkStubDecorator); ok {
+ return true
}
return false
}
@@ -578,12 +572,7 @@
}
func (ctx *moduleContextImpl) staticBinary() bool {
- if static, ok := ctx.mod.linker.(interface {
- staticBinary() bool
- }); ok {
- return static.staticBinary()
- }
- return false
+ return ctx.mod.staticBinary()
}
func (ctx *moduleContextImpl) useSdk() bool {
@@ -900,7 +889,7 @@
}
}
-func (c *Module) toolchain(ctx BaseModuleContext) config.Toolchain {
+func (c *Module) toolchain(ctx android.BaseContext) config.Toolchain {
if c.cachedToolchain == nil {
c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
}
@@ -1717,6 +1706,15 @@
return false
}
+func (c *Module) staticBinary() bool {
+ if static, ok := c.linker.(interface {
+ staticBinary() bool
+ }); ok {
+ return static.staticBinary()
+ }
+ return false
+}
+
func (c *Module) getMakeLinkType() string {
if c.useVndk() {
if inList(c.Name(), vndkCoreLibraries) || inList(c.Name(), vndkSpLibraries) || inList(c.Name(), llndkLibraries) {
diff --git a/cc/config/clang.go b/cc/config/clang.go
index a0ebd10..832689b 100644
--- a/cc/config/clang.go
+++ b/cc/config/clang.go
@@ -135,10 +135,6 @@
// codebase for it.
"-Wno-inconsistent-missing-override",
- // Bug: http://b/29823425 Disable -Wnull-dereference until the
- // new instances detected by this warning are fixed.
- "-Wno-null-dereference",
-
// Enable clang's thread-safety annotations in libcxx.
// Turn off -Wthread-safety-negative, to avoid breaking projects that use -Weverything.
"-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS",
@@ -187,6 +183,10 @@
// http://b/72331524 Allow null pointer arithmetic until the instances detected by
// this new warning are fixed.
"-Wno-null-pointer-arithmetic",
+
+ // Bug: http://b/29823425 Disable -Wnull-dereference until the
+ // new instances detected by this warning are fixed.
+ "-Wno-null-dereference",
}, " "))
}
diff --git a/cc/config/global.go b/cc/config/global.go
index 13ad27c..5d98d67 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -120,8 +120,8 @@
// prebuilts/clang default settings.
ClangDefaultBase = "prebuilts/clang/host"
- ClangDefaultVersion = "clang-r346389b"
- ClangDefaultShortVersion = "8.0.6"
+ ClangDefaultVersion = "clang-r346389c"
+ ClangDefaultShortVersion = "8.0.7"
// Directories with warnings from Android.bp files.
WarningAllowedProjects = []string{
diff --git a/cc/config/x86_64_device.go b/cc/config/x86_64_device.go
index ff8a6da..381f7e7 100644
--- a/cc/config/x86_64_device.go
+++ b/cc/config/x86_64_device.go
@@ -81,7 +81,7 @@
"aes_ni",
"avx",
"popcnt")
- android.RegisterArchVariantFeatures(android.X86_64, "",
+ android.RegisterDefaultArchVariantFeatures(android.Android, android.X86_64,
"ssse3",
"sse4",
"sse4_1",
diff --git a/cc/library.go b/cc/library.go
index da223dc..4adb081 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -646,6 +646,11 @@
linkerDeps = append(linkerDeps, forceWeakSymbols.Path())
}
}
+ if library.buildStubs() {
+ linkerScriptFlags := "-Wl,--version-script," + library.versionScriptPath.String()
+ flags.LdFlags = append(flags.LdFlags, linkerScriptFlags)
+ linkerDeps = append(linkerDeps, library.versionScriptPath)
+ }
fileName := library.getLibName(ctx) + flags.Toolchain.ShlibSuffix()
outputFile := android.PathForModuleOut(ctx, fileName)
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index 47994a8..ffeeb69 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -103,6 +103,10 @@
return nil
}
+func (p *prebuiltLibraryLinker) shared() bool {
+ return p.libraryDecorator.shared()
+}
+
func prebuiltSharedLibraryFactory() android.Module {
module, _ := NewPrebuiltSharedLibrary(android.HostAndDeviceSupported)
return module.Init()
@@ -121,6 +125,10 @@
module.AddProperties(&prebuilt.properties)
android.InitPrebuiltModule(module, &prebuilt.properties.Srcs)
+
+ // Prebuilt libraries can be included in APEXes
+ android.InitApexModule(module)
+
return module, library
}
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 8d33de5..d19e54a 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -16,7 +16,6 @@
import (
"fmt"
- "io"
"sort"
"strings"
"sync"
@@ -138,18 +137,17 @@
Blacklist *string
} `android:"arch_variant"`
- SanitizerEnabled bool `blueprint:"mutated"`
- SanitizeDep bool `blueprint:"mutated"`
- MinimalRuntimeDep bool `blueprint:"mutated"`
- UbsanRuntimeDep bool `blueprint:"mutated"`
- InSanitizerDir bool `blueprint:"mutated"`
+ SanitizerEnabled bool `blueprint:"mutated"`
+ SanitizeDep bool `blueprint:"mutated"`
+ MinimalRuntimeDep bool `blueprint:"mutated"`
+ UbsanRuntimeDep bool `blueprint:"mutated"`
+ InSanitizerDir bool `blueprint:"mutated"`
+ Sanitizers []string `blueprint:"mutated"`
+ DiagSanitizers []string `blueprint:"mutated"`
}
type sanitize struct {
Properties SanitizeProperties
-
- runtimeLibrary string
- androidMkRuntimeLibrary string
}
func init() {
@@ -405,46 +403,6 @@
return flags
}
- var sanitizers []string
- var diagSanitizers []string
-
- if Bool(sanitize.Properties.Sanitize.All_undefined) {
- sanitizers = append(sanitizers, "undefined")
- } else {
- if Bool(sanitize.Properties.Sanitize.Undefined) {
- sanitizers = append(sanitizers,
- "bool",
- "integer-divide-by-zero",
- "return",
- "returns-nonnull-attribute",
- "shift-exponent",
- "unreachable",
- "vla-bound",
- // TODO(danalbert): The following checks currently have compiler performance issues.
- //"alignment",
- //"bounds",
- //"enum",
- //"float-cast-overflow",
- //"float-divide-by-zero",
- //"nonnull-attribute",
- //"null",
- //"shift-base",
- //"signed-integer-overflow",
- // TODO(danalbert): Fix UB in libc++'s __tree so we can turn this on.
- // https://llvm.org/PR19302
- // http://reviews.llvm.org/D6974
- // "object-size",
- )
- }
- sanitizers = append(sanitizers, sanitize.Properties.Sanitize.Misc_undefined...)
- }
-
- if Bool(sanitize.Properties.Sanitize.Diag.Undefined) {
- diagSanitizers = append(diagSanitizers, "undefined")
- }
-
- diagSanitizers = append(diagSanitizers, sanitize.Properties.Sanitize.Diag.Misc_undefined...)
-
if Bool(sanitize.Properties.Sanitize.Address) {
if ctx.Arch().ArchType == android.Arm {
// Frame pointer based unwinder in ASan requires ARM frame setup.
@@ -465,34 +423,22 @@
flags.DynamicLinker += "64"
}
}
- sanitizers = append(sanitizers, "address")
- diagSanitizers = append(diagSanitizers, "address")
}
if Bool(sanitize.Properties.Sanitize.Hwaddress) {
flags.CFlags = append(flags.CFlags, hwasanCflags...)
- sanitizers = append(sanitizers, "hwaddress")
- }
-
- if Bool(sanitize.Properties.Sanitize.Thread) {
- sanitizers = append(sanitizers, "thread")
}
if Bool(sanitize.Properties.Sanitize.Coverage) {
flags.CFlags = append(flags.CFlags, "-fsanitize-coverage=trace-pc-guard,indirect-calls,trace-cmp")
}
- if Bool(sanitize.Properties.Sanitize.Safestack) {
- sanitizers = append(sanitizers, "safe-stack")
- }
-
if Bool(sanitize.Properties.Sanitize.Cfi) {
if ctx.Arch().ArchType == android.Arm {
// __cfi_check needs to be built as Thumb (see the code in linker_cfi.cpp). LLVM is not set up
// to do this on a function basis, so force Thumb on the entire module.
flags.RequiredInstructionSet = "thumb"
}
- sanitizers = append(sanitizers, "cfi")
flags.CFlags = append(flags.CFlags, cfiCflags...)
flags.AsFlags = append(flags.AsFlags, cfiAsflags...)
@@ -502,9 +448,6 @@
flags.CFlags = append(flags.CFlags, "-fvisibility=default")
}
flags.LdFlags = append(flags.LdFlags, cfiLdflags...)
- if Bool(sanitize.Properties.Sanitize.Diag.Cfi) {
- diagSanitizers = append(diagSanitizers, "cfi")
- }
if ctx.staticBinary() {
_, flags.CFlags = removeFromList("-fsanitize-cfi-cross-dso", flags.CFlags)
@@ -513,25 +456,11 @@
}
if Bool(sanitize.Properties.Sanitize.Integer_overflow) {
- sanitizers = append(sanitizers, "unsigned-integer-overflow")
- sanitizers = append(sanitizers, "signed-integer-overflow")
flags.CFlags = append(flags.CFlags, intOverflowCflags...)
- if Bool(sanitize.Properties.Sanitize.Diag.Integer_overflow) {
- diagSanitizers = append(diagSanitizers, "unsigned-integer-overflow")
- diagSanitizers = append(diagSanitizers, "signed-integer-overflow")
- }
}
- if Bool(sanitize.Properties.Sanitize.Scudo) {
- sanitizers = append(sanitizers, "scudo")
- }
-
- if Bool(sanitize.Properties.Sanitize.Scs) {
- sanitizers = append(sanitizers, "shadow-call-stack")
- }
-
- if len(sanitizers) > 0 {
- sanitizeArg := "-fsanitize=" + strings.Join(sanitizers, ",")
+ if len(sanitize.Properties.Sanitizers) > 0 {
+ sanitizeArg := "-fsanitize=" + strings.Join(sanitize.Properties.Sanitizers, ",")
flags.CFlags = append(flags.CFlags, sanitizeArg)
flags.AsFlags = append(flags.AsFlags, sanitizeArg)
@@ -556,8 +485,8 @@
}
}
- if len(diagSanitizers) > 0 {
- flags.CFlags = append(flags.CFlags, "-fno-sanitize-trap="+strings.Join(diagSanitizers, ","))
+ if len(sanitize.Properties.DiagSanitizers) > 0 {
+ flags.CFlags = append(flags.CFlags, "-fno-sanitize-trap="+strings.Join(sanitize.Properties.DiagSanitizers, ","))
}
// FIXME: enable RTTI if diag + (cfi or vptr)
@@ -571,46 +500,6 @@
strings.Join(sanitize.Properties.Sanitize.Diag.No_recover, ","))
}
- // Link a runtime library if needed.
- runtimeLibrary := ""
- if Bool(sanitize.Properties.Sanitize.Address) {
- runtimeLibrary = config.AddressSanitizerRuntimeLibrary(ctx.toolchain())
- } else if Bool(sanitize.Properties.Sanitize.Hwaddress) {
- runtimeLibrary = config.HWAddressSanitizerRuntimeLibrary(ctx.toolchain())
- } else if Bool(sanitize.Properties.Sanitize.Thread) {
- runtimeLibrary = config.ThreadSanitizerRuntimeLibrary(ctx.toolchain())
- } else if Bool(sanitize.Properties.Sanitize.Scudo) {
- if len(diagSanitizers) == 0 && !sanitize.Properties.UbsanRuntimeDep {
- runtimeLibrary = config.ScudoMinimalRuntimeLibrary(ctx.toolchain())
- } else {
- runtimeLibrary = config.ScudoRuntimeLibrary(ctx.toolchain())
- }
- } else if len(diagSanitizers) > 0 || sanitize.Properties.UbsanRuntimeDep {
- runtimeLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary(ctx.toolchain())
- }
-
- if runtimeLibrary != "" {
- runtimeLibraryPath := "${config.ClangAsanLibDir}/" + runtimeLibrary
- if !ctx.static() {
- runtimeLibraryPath = runtimeLibraryPath + ctx.toolchain().ShlibSuffix()
- } else {
- runtimeLibraryPath = runtimeLibraryPath + ".a"
- }
-
- // ASan runtime library must be the first in the link order.
- flags.libFlags = append([]string{runtimeLibraryPath}, flags.libFlags...)
- sanitize.runtimeLibrary = runtimeLibrary
-
- // When linking against VNDK, use the vendor variant of the runtime lib
- if ctx.useVndk() {
- sanitize.androidMkRuntimeLibrary = sanitize.runtimeLibrary + vendorSuffix
- } else if ctx.inRecovery() {
- sanitize.androidMkRuntimeLibrary = sanitize.runtimeLibrary + recoverySuffix
- } else {
- sanitize.androidMkRuntimeLibrary = sanitize.runtimeLibrary
- }
- }
-
blacklist := android.OptionalPathForModuleSrc(ctx, sanitize.Properties.Sanitize.Blacklist)
if blacklist.Valid() {
flags.CFlags = append(flags.CFlags, "-fsanitize-blacklist="+blacklist.String())
@@ -621,12 +510,6 @@
}
func (sanitize *sanitize) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
- ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
- if sanitize.androidMkRuntimeLibrary != "" {
- fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES += "+sanitize.androidMkRuntimeLibrary)
- }
- })
-
// Add a suffix for CFI-enabled static libraries to allow surfacing both to make without a
// name conflict.
if ret.Class == "STATIC_LIBRARIES" && Bool(sanitize.Properties.Sanitize.Cfi) {
@@ -782,6 +665,159 @@
}
}
+// Add the dependency to the runtime library for each of the sanitizer variants
+func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) {
+ if mctx.Os() != android.Android {
+ return
+ }
+ if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil {
+ var sanitizers []string
+ var diagSanitizers []string
+
+ if Bool(c.sanitize.Properties.Sanitize.All_undefined) {
+ sanitizers = append(sanitizers, "undefined")
+ } else {
+ if Bool(c.sanitize.Properties.Sanitize.Undefined) {
+ sanitizers = append(sanitizers,
+ "bool",
+ "integer-divide-by-zero",
+ "return",
+ "returns-nonnull-attribute",
+ "shift-exponent",
+ "unreachable",
+ "vla-bound",
+ // TODO(danalbert): The following checks currently have compiler performance issues.
+ //"alignment",
+ //"bounds",
+ //"enum",
+ //"float-cast-overflow",
+ //"float-divide-by-zero",
+ //"nonnull-attribute",
+ //"null",
+ //"shift-base",
+ //"signed-integer-overflow",
+ // TODO(danalbert): Fix UB in libc++'s __tree so we can turn this on.
+ // https://llvm.org/PR19302
+ // http://reviews.llvm.org/D6974
+ // "object-size",
+ )
+ }
+ sanitizers = append(sanitizers, c.sanitize.Properties.Sanitize.Misc_undefined...)
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Diag.Undefined) {
+ diagSanitizers = append(diagSanitizers, "undefined")
+ }
+
+ diagSanitizers = append(diagSanitizers, c.sanitize.Properties.Sanitize.Diag.Misc_undefined...)
+
+ if Bool(c.sanitize.Properties.Sanitize.Address) {
+ sanitizers = append(sanitizers, "address")
+ diagSanitizers = append(diagSanitizers, "address")
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Hwaddress) {
+ sanitizers = append(sanitizers, "hwaddress")
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Thread) {
+ sanitizers = append(sanitizers, "thread")
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Safestack) {
+ sanitizers = append(sanitizers, "safe-stack")
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Cfi) {
+ sanitizers = append(sanitizers, "cfi")
+
+ if Bool(c.sanitize.Properties.Sanitize.Diag.Cfi) {
+ diagSanitizers = append(diagSanitizers, "cfi")
+ }
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Integer_overflow) {
+ sanitizers = append(sanitizers, "unsigned-integer-overflow")
+ sanitizers = append(sanitizers, "signed-integer-overflow")
+ if Bool(c.sanitize.Properties.Sanitize.Diag.Integer_overflow) {
+ diagSanitizers = append(diagSanitizers, "unsigned-integer-overflow")
+ diagSanitizers = append(diagSanitizers, "signed-integer-overflow")
+ }
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Scudo) {
+ sanitizers = append(sanitizers, "scudo")
+ }
+
+ if Bool(c.sanitize.Properties.Sanitize.Scs) {
+ sanitizers = append(sanitizers, "shadow-call-stack")
+ }
+
+ // Save the list of sanitizers. These will be used again when generating
+ // the build rules (for Cflags, etc.)
+ c.sanitize.Properties.Sanitizers = sanitizers
+ c.sanitize.Properties.DiagSanitizers = diagSanitizers
+
+ // Determine the runtime library required
+ runtimeLibrary := ""
+ toolchain := c.toolchain(mctx)
+ if Bool(c.sanitize.Properties.Sanitize.Address) {
+ runtimeLibrary = config.AddressSanitizerRuntimeLibrary(toolchain)
+ } else if Bool(c.sanitize.Properties.Sanitize.Hwaddress) {
+ if c.staticBinary() {
+ runtimeLibrary = config.HWAddressSanitizerStaticLibrary(toolchain)
+ } else {
+ runtimeLibrary = config.HWAddressSanitizerRuntimeLibrary(toolchain)
+ }
+ } else if Bool(c.sanitize.Properties.Sanitize.Thread) {
+ runtimeLibrary = config.ThreadSanitizerRuntimeLibrary(toolchain)
+ } else if Bool(c.sanitize.Properties.Sanitize.Scudo) {
+ if len(diagSanitizers) == 0 && !c.sanitize.Properties.UbsanRuntimeDep {
+ runtimeLibrary = config.ScudoMinimalRuntimeLibrary(toolchain)
+ } else {
+ runtimeLibrary = config.ScudoRuntimeLibrary(toolchain)
+ }
+ } else if len(diagSanitizers) > 0 || c.sanitize.Properties.UbsanRuntimeDep {
+ runtimeLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)
+ }
+
+ if mctx.Device() && runtimeLibrary != "" {
+ if inList(runtimeLibrary, llndkLibraries) && !c.static() {
+ runtimeLibrary = runtimeLibrary + llndkLibrarySuffix
+ }
+
+ // Adding dependency to the runtime library. We are using *FarVariation*
+ // because the runtime libraries themselves are not mutated by sanitizer
+ // mutators and thus don't have sanitizer variants whereas this module
+ // has been already mutated.
+ //
+ // Note that by adding dependency with {static|shared}DepTag, the lib is
+ // added to libFlags and LOCAL_SHARED_LIBRARIES by cc.Module
+ if c.staticBinary() {
+ // static executable gets static runtime libs
+ mctx.AddFarVariationDependencies([]blueprint.Variation{
+ {Mutator: "link", Variation: "static"},
+ {Mutator: "arch", Variation: mctx.Target().String()},
+ }, staticDepTag, runtimeLibrary)
+ } else if !c.static() {
+ // dynamic executable andshared libs get shared runtime libs
+ mctx.AddFarVariationDependencies([]blueprint.Variation{
+ {Mutator: "link", Variation: "shared"},
+ {Mutator: "arch", Variation: mctx.Target().String()},
+ }, sharedDepTag, runtimeLibrary)
+ }
+ // static lib does not have dependency to the runtime library. The
+ // dependency will be added to the executables or shared libs using
+ // the static lib.
+ }
+ }
+}
+
+type Sanitizeable interface {
+ android.Module
+ IsSanitizerEnabled() bool
+}
+
// Create sanitized variants for modules that need them
func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) {
return func(mctx android.BottomUpMutatorContext) {
@@ -883,6 +919,9 @@
}
}
c.sanitize.Properties.SanitizeDep = false
+ } else if sanitizeable, ok := mctx.Module().(Sanitizeable); ok && sanitizeable.IsSanitizerEnabled() {
+ // APEX modules fall here
+ mctx.CreateVariations(t.String())
}
}
}
diff --git a/dexpreopt/config.go b/dexpreopt/config.go
index 6b5c40d..503af7e 100644
--- a/dexpreopt/config.go
+++ b/dexpreopt/config.go
@@ -36,6 +36,7 @@
PreoptBootClassPathDexLocations []string // virtual locations of boot class path files
BootJars []string // modules for jars that form the boot class path
+ PreoptBootJars []string // modules for jars that form the boot image
SystemServerJars []string // jars that form the system server
SystemServerApps []string // apps that are loaded into system server
SpeedApps []string // apps that should be speed optimized
diff --git a/java/config/config.go b/java/config/config.go
index da4eed7..92cfb84 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -43,7 +43,6 @@
"android.car7",
"core-oj",
"core-libart",
- "core-simple",
}
ManifestMergerClasspath = []string{
diff --git a/java/java.go b/java/java.go
index fa4aee4..a23835b 100644
--- a/java/java.go
+++ b/java/java.go
@@ -1364,6 +1364,12 @@
}
func (j *Library) shouldUncompressDex(ctx android.ModuleContext) bool {
+ // Store uncompressed (and do not strip) dex files from boot class path jars that are not
+ // part of the boot image.
+ if inList(ctx.ModuleName(), ctx.Config().BootJars()) &&
+ !inList(ctx.ModuleName(), ctx.Config().PreoptBootJars()) {
+ return true
+ }
return false
}
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 55a9590..941e665 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -134,11 +134,6 @@
// Defaults to "android.annotation".
Srcs_lib_whitelist_pkgs []string
- // if set to true, create stubs through Metalava instead of Doclava. Javadoc/Doclava is
- // currently still used for documentation generation, and will be replaced by Dokka soon.
- // Defaults to true.
- Metalava_enabled *bool
-
// TODO: determines whether to create HTML doc or not
//Html_doc *bool
}
@@ -447,9 +442,6 @@
Local_include_dirs []string
}
}{}
- droiddocProps := struct {
- Custom_template *string
- }{}
props.Name = proptools.StringPtr(module.docsName(apiScope))
props.Srcs = append(props.Srcs, module.properties.Srcs...)
@@ -462,25 +454,12 @@
props.Aidl.Include_dirs = module.deviceProperties.Aidl.Include_dirs
props.Aidl.Local_include_dirs = module.deviceProperties.Aidl.Local_include_dirs
- if module.properties.Metalava_enabled == nil {
- module.properties.Metalava_enabled = proptools.BoolPtr(true)
- }
-
- droiddocArgs := ""
- if Bool(module.properties.Metalava_enabled) == true {
- droiddocArgs = " --stub-packages " + strings.Join(module.properties.Api_packages, ":") +
- " " + android.JoinWithPrefix(module.properties.Hidden_api_packages, " --hide-package ") +
- " " + android.JoinWithPrefix(module.properties.Droiddoc_options, " ") +
- " --hide MissingPermission --hide BroadcastBehavior " +
- "--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +
- "--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo"
- } else {
- droiddocProps.Custom_template = proptools.StringPtr("droiddoc-templates-sdk")
- droiddocArgs = " -stubpackages " + strings.Join(module.properties.Api_packages, ":") +
- " " + android.JoinWithPrefix(module.properties.Hidden_api_packages, " -hidePackage ") +
- " " + android.JoinWithPrefix(module.properties.Droiddoc_options, " ") +
- " -hide 110 -hide 111 -hide 113 -hide 121 -hide 125 -hide 126 -hide 127 -hide 128 -nodocs"
- }
+ droiddocArgs := " --stub-packages " + strings.Join(module.properties.Api_packages, ":") +
+ " " + android.JoinWithPrefix(module.properties.Hidden_api_packages, " --hide-package ") +
+ " " + android.JoinWithPrefix(module.properties.Droiddoc_options, " ") +
+ " --hide MissingPermission --hide BroadcastBehavior " +
+ "--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +
+ "--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo"
switch apiScope {
case apiScopeSystem:
@@ -519,45 +498,11 @@
module.latestApiFilegroupName(apiScope))
props.Check_api.Last_released.Removed_api_file = proptools.StringPtr(
module.latestRemovedApiFilegroupName(apiScope))
- if Bool(module.properties.Metalava_enabled) == false {
- // any change is reported as error
- props.Check_api.Current.Args = proptools.StringPtr("-error 2 -error 3 -error 4 -error 5 " +
- "-error 6 -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 " +
- "-error 14 -error 15 -error 16 -error 17 -error 18 -error 19 -error 20 " +
- "-error 21 -error 23 -error 24 -error 25 -error 26 -error 27")
+ props.Srcs_lib = module.properties.Srcs_lib
+ props.Srcs_lib_whitelist_dirs = module.properties.Srcs_lib_whitelist_dirs
+ props.Srcs_lib_whitelist_pkgs = module.properties.Srcs_lib_whitelist_pkgs
- // backward incompatible changes are reported as error
- props.Check_api.Last_released.Args = proptools.StringPtr("-hide 2 -hide 3 -hide 4 -hide 5 " +
- "-hide 6 -hide 24 -hide 25 -hide 26 -hide 27 " +
- "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 " +
- "-error 15 -error 16 -error 17 -error 18")
-
- // Include the part of the framework source. This is required for the case when
- // API class is extending from the framework class. In that case, doclava needs
- // to know whether the base class is hidden or not. Since that information is
- // encoded as @hide string in the comment, we need source files for the classes,
- // not the compiled ones.
- props.Srcs_lib = proptools.StringPtr("framework")
- props.Srcs_lib_whitelist_dirs = []string{"core/java"}
-
- // Add android.annotation package to give access to the framework-defined
- // annotations such as SystemApi, NonNull, etc.
- if module.properties.Srcs_lib_whitelist_pkgs != nil {
- props.Srcs_lib_whitelist_pkgs = module.properties.Srcs_lib_whitelist_pkgs
- } else {
- props.Srcs_lib_whitelist_pkgs = []string{"android.annotation"}
- }
- } else {
- props.Srcs_lib = module.properties.Srcs_lib
- props.Srcs_lib_whitelist_dirs = module.properties.Srcs_lib_whitelist_dirs
- props.Srcs_lib_whitelist_pkgs = module.properties.Srcs_lib_whitelist_pkgs
- }
-
- if Bool(module.properties.Metalava_enabled) == true {
- mctx.CreateModule(android.ModuleFactoryAdaptor(DroidstubsFactory), &props)
- } else {
- mctx.CreateModule(android.ModuleFactoryAdaptor(DroiddocFactory), &props, &droiddocProps)
- }
+ mctx.CreateModule(android.ModuleFactoryAdaptor(DroidstubsFactory), &props)
}
// Creates the runtime library. This is not directly linkable from other modules.
diff --git a/python/androidmk.go b/python/androidmk.go
index 20861cb..c1eaa5e 100644
--- a/python/androidmk.go
+++ b/python/androidmk.go
@@ -70,6 +70,11 @@
if p.testProperties.Test_config != nil {
fmt.Fprintln(w, "LOCAL_TEST_CONFIG :=",
*p.testProperties.Test_config)
+ } else {
+ if p.testConfig != nil {
+ fmt.Fprintln(w, "LOCAL_FULL_TEST_CONFIG :=",
+ p.testConfig.String())
+ }
}
})
base.subAndroidMk(ret, p.binaryDecorator.pythonInstaller)
diff --git a/python/test.go b/python/test.go
index 39326f0..43ee54c 100644
--- a/python/test.go
+++ b/python/test.go
@@ -16,6 +16,7 @@
import (
"android/soong/android"
+ "android/soong/tradefed"
)
// This file contains the module types for building Python test.
@@ -29,12 +30,18 @@
// the name of the test configuration (for example "AndroidTest.xml") that should be
// installed with the module.
Test_config *string `android:"arch_variant"`
+
+ // the name of the test configuration template (for example "AndroidTestTemplate.xml") that
+ // should be installed with the module.
+ Test_config_template *string `android:"arch_variant"`
}
type testDecorator struct {
*binaryDecorator
testProperties TestProperties
+
+ testConfig android.Path
}
func (test *testDecorator) bootstrapperProps() []interface{} {
@@ -42,6 +49,9 @@
}
func (test *testDecorator) install(ctx android.ModuleContext, file android.Path) {
+ test.testConfig = tradefed.AutoGenPythonBinaryHostTestConfig(ctx, test.testProperties.Test_config,
+ test.testProperties.Test_config_template)
+
test.binaryDecorator.pythonInstaller.dir = "nativetest"
test.binaryDecorator.pythonInstaller.dir64 = "nativetest64"
diff --git a/tradefed/autogen.go b/tradefed/autogen.go
index 131fdc4..e6a1b48 100644
--- a/tradefed/autogen.go
+++ b/tradefed/autogen.go
@@ -118,6 +118,22 @@
return path
}
+func AutoGenPythonBinaryHostTestConfig(ctx android.ModuleContext, testConfigProp *string,
+ testConfigTemplateProp *string) android.Path {
+
+ path, autogenPath := testConfigPath(ctx, testConfigProp)
+ if autogenPath != nil {
+ templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
+ if templatePath.Valid() {
+ autogenTemplate(ctx, autogenPath, templatePath.String())
+ } else {
+ autogenTemplate(ctx, autogenPath, "${PythonBinaryHostTestConfigTemplate}")
+ }
+ return autogenPath
+ }
+ return path
+}
+
var autogenInstrumentationTest = pctx.StaticRule("autogenInstrumentationTest", blueprint.RuleParams{
Command: "${AutoGenTestConfigScript} $out $in ${EmptyTestConfig} $template",
CommandDeps: []string{
diff --git a/tradefed/config.go b/tradefed/config.go
index 2c432d0..141e0c5 100644
--- a/tradefed/config.go
+++ b/tradefed/config.go
@@ -30,6 +30,7 @@
pctx.SourcePathVariable("NativeBenchmarkTestConfigTemplate", "build/make/core/native_benchmark_test_config_template.xml")
pctx.SourcePathVariable("NativeHostTestConfigTemplate", "build/make/core/native_host_test_config_template.xml")
pctx.SourcePathVariable("NativeTestConfigTemplate", "build/make/core/native_test_config_template.xml")
+ pctx.SourcePathVariable("PythonBinaryHostTestConfigTemplate", "build/make/core/python_binary_host_test_config_template.xml")
pctx.SourcePathVariable("EmptyTestConfig", "build/make/core/empty_test_config.xml")
}
diff --git a/tradefed/makevars.go b/tradefed/makevars.go
index 3ec7997..aad7273 100644
--- a/tradefed/makevars.go
+++ b/tradefed/makevars.go
@@ -30,6 +30,7 @@
ctx.Strict("NATIVE_BENCHMARK_TEST_CONFIG_TEMPLATE", "${NativeBenchmarkTestConfigTemplate}")
ctx.Strict("NATIVE_HOST_TEST_CONFIG_TEMPLATE", "${NativeHostTestConfigTemplate}")
ctx.Strict("NATIVE_TEST_CONFIG_TEMPLATE", "${NativeTestConfigTemplate}")
+ ctx.Strict("PYTHON_BINARY_HOST_TEST_CONFIG_TEMPLATE", "${PythonBinaryHostTestConfigTemplate}")
ctx.Strict("EMPTY_TEST_CONFIG", "${EmptyTestConfig}")
}
diff --git a/ui/build/ninja.go b/ui/build/ninja.go
index e5d6da1..cb41579 100644
--- a/ui/build/ninja.go
+++ b/ui/build/ninja.go
@@ -54,9 +54,12 @@
args = append(args, "-f", config.CombinedNinjaFile())
- args = append(args, "-w", "dupbuild=err")
+ args = append(args,
+ "-w", "dupbuild=err",
+ "-w", "missingdepfile=err")
cmd := Command(ctx, config, "ninja", executable, args...)
+ cmd.Sandbox = ninjaSandbox
if config.HasKatiSuffix() {
cmd.Environment.AppendFromKati(config.KatiEnvFile())
}
diff --git a/ui/build/paths/config.go b/ui/build/paths/config.go
index 4dc62b8..f4ef034 100644
--- a/ui/build/paths/config.go
+++ b/ui/build/paths/config.go
@@ -85,7 +85,6 @@
"egrep": Allowed,
"find": Allowed,
"fuser": Allowed,
- "getconf": Allowed,
"getopt": Allowed,
"git": Allowed,
"grep": Allowed,
@@ -98,7 +97,6 @@
"lsof": Allowed,
"m4": Allowed,
"md5sum": Allowed,
- "mktemp": Allowed,
"mv": Allowed,
"openssl": Allowed,
"patch": Allowed,
@@ -109,7 +107,6 @@
"python": Allowed,
"python2.7": Allowed,
"python3": Allowed,
- "readlink": Allowed,
"realpath": Allowed,
"rm": Allowed,
"rsync": Allowed,
@@ -118,15 +115,12 @@
"sha1sum": Allowed,
"sha256sum": Allowed,
"sha512sum": Allowed,
- "sort": Allowed,
- "stat": Allowed,
"tar": Allowed,
"timeout": Allowed,
"tr": Allowed,
"unzip": Allowed,
"wc": Allowed,
"which": Allowed,
- "xargs": Allowed,
"xz": Allowed,
"zip": Allowed,
"zipinfo": Allowed,
@@ -158,16 +152,21 @@
"env": Toybox,
"expr": Toybox,
"head": Toybox,
+ "getconf": Toybox,
"id": Toybox,
"ln": Toybox,
"ls": Toybox,
"mkdir": Toybox,
+ "mktemp": Toybox,
"od": Toybox,
"paste": Toybox,
"pwd": Toybox,
+ "readlink": Toybox,
"rmdir": Toybox,
"setsid": Toybox,
"sleep": Toybox,
+ "sort": Toybox,
+ "stat": Toybox,
"tail": Toybox,
"tee": Toybox,
"touch": Toybox,
@@ -176,6 +175,7 @@
"uniq": Toybox,
"unix2dos": Toybox,
"whoami": Toybox,
+ "xargs": Toybox,
"xxd": Toybox,
}
diff --git a/ui/build/sandbox_darwin.go b/ui/build/sandbox_darwin.go
index 7e75167..43c5480 100644
--- a/ui/build/sandbox_darwin.go
+++ b/ui/build/sandbox_darwin.go
@@ -21,12 +21,12 @@
type Sandbox string
const (
- noSandbox = ""
- globalSandbox = "build/soong/ui/build/sandbox/darwin/global.sb"
- dumpvarsSandbox = globalSandbox
- soongSandbox = globalSandbox
- katiSandbox = globalSandbox
- katiCleanSpecSandbox = globalSandbox
+ noSandbox = ""
+ globalSandbox = "build/soong/ui/build/sandbox/darwin/global.sb"
+ dumpvarsSandbox = globalSandbox
+ soongSandbox = globalSandbox
+ katiSandbox = globalSandbox
+ ninjaSandbox = noSandbox
)
var sandboxExecPath string
diff --git a/ui/build/sandbox_linux.go b/ui/build/sandbox_linux.go
index f2bfac2..b87637f 100644
--- a/ui/build/sandbox_linux.go
+++ b/ui/build/sandbox_linux.go
@@ -14,20 +14,154 @@
package build
-type Sandbox bool
-
-const (
- noSandbox = false
- globalSandbox = false
- dumpvarsSandbox = false
- soongSandbox = false
- katiSandbox = false
- katiCleanSpecSandbox = false
+import (
+ "bytes"
+ "os"
+ "os/exec"
+ "os/user"
+ "strings"
+ "sync"
)
+type Sandbox struct {
+ Enabled bool
+ DisableWhenUsingGoma bool
+}
+
+var (
+ noSandbox = Sandbox{}
+ basicSandbox = Sandbox{
+ Enabled: true,
+ }
+
+ dumpvarsSandbox = basicSandbox
+ katiSandbox = basicSandbox
+ soongSandbox = basicSandbox
+ ninjaSandbox = Sandbox{
+ Enabled: true,
+ DisableWhenUsingGoma: true,
+ }
+)
+
+const nsjailPath = "prebuilts/build-tools/linux-x86/bin/nsjail"
+
+var sandboxConfig struct {
+ once sync.Once
+
+ working bool
+ group string
+}
+
func (c *Cmd) sandboxSupported() bool {
- return false
+ if !c.Sandbox.Enabled {
+ return false
+ }
+
+ // Goma is incompatible with PID namespaces and Mount namespaces. b/122767582
+ if c.Sandbox.DisableWhenUsingGoma && c.config.UseGoma() {
+ return false
+ }
+
+ sandboxConfig.once.Do(func() {
+ sandboxConfig.group = "nogroup"
+ if _, err := user.LookupGroup(sandboxConfig.group); err != nil {
+ sandboxConfig.group = "nobody"
+ }
+
+ cmd := exec.CommandContext(c.ctx.Context, nsjailPath,
+ "-H", "android-build",
+ "-e",
+ "-u", "nobody",
+ "-g", sandboxConfig.group,
+ "-B", "/",
+ "--disable_clone_newcgroup",
+ "--",
+ "/bin/bash", "-c", `if [ $(hostname) == "android-build" ]; then echo "Android" "Success"; else echo Failure; fi`)
+ cmd.Env = c.config.Environment().Environ()
+
+ c.ctx.Verboseln(cmd.Args)
+ data, err := cmd.CombinedOutput()
+ if err == nil && bytes.Contains(data, []byte("Android Success")) {
+ sandboxConfig.working = true
+ return
+ }
+
+ c.ctx.Println("Build sandboxing disabled due to nsjail error. This may become fatal in the future.")
+ c.ctx.Println("Please let us know why nsjail doesn't work in your environment at:")
+ c.ctx.Println(" https://groups.google.com/forum/#!forum/android-building")
+ c.ctx.Println(" https://issuetracker.google.com/issues/new?component=381517")
+
+ for _, line := range strings.Split(strings.TrimSpace(string(data)), "\n") {
+ c.ctx.Verboseln(line)
+ }
+
+ if err == nil {
+ c.ctx.Verboseln("nsjail exited successfully, but without the correct output")
+ } else if e, ok := err.(*exec.ExitError); ok {
+ c.ctx.Verbosef("nsjail failed with %v", e.ProcessState.String())
+ } else {
+ c.ctx.Verbosef("nsjail failed with %v", err)
+ }
+ })
+
+ return sandboxConfig.working
}
func (c *Cmd) wrapSandbox() {
+ wd, _ := os.Getwd()
+
+ sandboxArgs := []string{
+ // The executable to run
+ "-x", c.Path,
+
+ // Set the hostname to something consistent
+ "-H", "android-build",
+
+ // Use the current working dir
+ "--cwd", wd,
+
+ // No time limit
+ "-t", "0",
+
+ // Keep all environment variables, we already filter them out
+ // in soong_ui
+ "-e",
+
+ // Use a consistent user & group.
+ // Note that these are mapped back to the real UID/GID when
+ // doing filesystem operations, so they're rather arbitrary.
+ "-u", "nobody",
+ "-g", sandboxConfig.group,
+
+ // Set high values, as nsjail uses low defaults.
+ "--rlimit_as", "soft",
+ "--rlimit_core", "soft",
+ "--rlimit_cpu", "soft",
+ "--rlimit_fsize", "soft",
+ "--rlimit_nofile", "soft",
+
+ // For now, just map everything. Eventually we should limit this, especially to make most things readonly.
+ "-B", "/",
+
+ // Enable networking for now. TODO: remove
+ "-N",
+
+ // Disable newcgroup for now, since it may require newer kernels
+ // TODO: try out cgroups
+ "--disable_clone_newcgroup",
+
+ // Only log important warnings / errors
+ "-q",
+
+ // Stop parsing arguments
+ "--",
+ }
+ c.Args = append(sandboxArgs, c.Args[1:]...)
+ c.Path = nsjailPath
+
+ env := Environment(c.Env)
+ if _, hasUser := env.Get("USER"); hasUser {
+ env.Set("USER", "nobody")
+ }
+ c.Env = []string(env)
}