diff --git a/cc/cc.go b/cc/cc.go
index c8d5251..ce1cb0a 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1585,6 +1585,7 @@
 }
 
 var Bool = proptools.Bool
+var BoolDefault = proptools.BoolDefault
 var BoolPtr = proptools.BoolPtr
 var String = proptools.String
 var StringPtr = proptools.StringPtr
diff --git a/cc/library.go b/cc/library.go
index 98a9673..00dc86b 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -700,13 +700,11 @@
 }
 
 func (library *libraryDecorator) buildStatic() bool {
-	return library.MutatedProperties.BuildStatic &&
-		(library.Properties.Static.Enabled == nil || *library.Properties.Static.Enabled)
+	return library.MutatedProperties.BuildStatic && BoolDefault(library.Properties.Static.Enabled, true)
 }
 
 func (library *libraryDecorator) buildShared() bool {
-	return library.MutatedProperties.BuildShared &&
-		(library.Properties.Shared.Enabled == nil || *library.Properties.Shared.Enabled)
+	return library.MutatedProperties.BuildShared && BoolDefault(library.Properties.Shared.Enabled, true)
 }
 
 func (library *libraryDecorator) getWholeStaticMissingDeps() []string {
diff --git a/cc/test.go b/cc/test.go
index b8e9cdb..fef6367 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -128,7 +128,7 @@
 }
 
 func (test *testDecorator) gtest() bool {
-	return test.Properties.Gtest == nil || *test.Properties.Gtest == true
+	return BoolDefault(test.Properties.Gtest, true)
 }
 
 func (test *testDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
diff --git a/java/androidmk.go b/java/androidmk.go
index fff034c..c9a05c3 100644
--- a/java/androidmk.go
+++ b/java/androidmk.go
@@ -235,7 +235,7 @@
 		Include:    "$(BUILD_SYSTEM)/soong_java_prebuilt.mk",
 		Extra: []android.AndroidMkExtraFunc{
 			func(w io.Writer, outputFile android.Path) {
-				if jd.properties.Installable == nil || *jd.properties.Installable == true {
+				if BoolDefault(jd.properties.Installable, true) {
 					fmt.Fprintln(w, "LOCAL_DROIDDOC_DOC_ZIP := ", jd.docZip.String())
 				}
 				if jd.stubsSrcJar != nil {
@@ -253,7 +253,7 @@
 		Include:    "$(BUILD_SYSTEM)/soong_java_prebuilt.mk",
 		Extra: []android.AndroidMkExtraFunc{
 			func(w io.Writer, outputFile android.Path) {
-				if ddoc.Javadoc.properties.Installable == nil || *ddoc.Javadoc.properties.Installable == true {
+				if BoolDefault(ddoc.Javadoc.properties.Installable, true) {
 					fmt.Fprintln(w, "LOCAL_DROIDDOC_DOC_ZIP := ", ddoc.Javadoc.docZip.String())
 				}
 				if ddoc.Javadoc.stubsSrcJar != nil {
diff --git a/java/java.go b/java/java.go
index fd0719c..a2eb810 100644
--- a/java/java.go
+++ b/java/java.go
@@ -1137,7 +1137,7 @@
 }
 
 func (j *Module) installable() bool {
-	return j.properties.Installable == nil || *j.properties.Installable
+	return BoolDefault(j.properties.Installable, true)
 }
 
 var _ Dependency = (*Library)(nil)
@@ -1231,7 +1231,7 @@
 
 func (j *Test) DepsMutator(ctx android.BottomUpMutatorContext) {
 	j.deps(ctx)
-	if j.testProperties.Junit == nil || *j.testProperties.Junit == true {
+	if BoolDefault(j.testProperties.Junit, true) {
 		ctx.AddDependency(ctx.Module(), staticLibTag, "junit")
 	}
 }
@@ -1460,5 +1460,6 @@
 }
 
 var Bool = proptools.Bool
+var BoolDefault = proptools.BoolDefault
 var String = proptools.String
 var inList = android.InList
