diff --git a/android/arch.go b/android/arch.go
index 3a22569..e696a0d 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -119,12 +119,12 @@
 
 func RegisterArchVariantFeatures(arch ArchType, variant string, features ...string) {
 	checkCalledFromInit()
-	if variant != "" && !inList(variant, archVariants[arch]) {
+	if variant != "" && !InList(variant, archVariants[arch]) {
 		panic(fmt.Errorf("Invalid variant %q for arch %q", variant, arch))
 	}
 
 	for _, feature := range features {
-		if !inList(feature, archFeatures[arch]) {
+		if !InList(feature, archFeatures[arch]) {
 			panic(fmt.Errorf("Invalid feature %q for arch %q variant %q", feature, arch, variant))
 		}
 	}
@@ -481,13 +481,13 @@
 
 			if os.Linux() {
 				target := "Linux_" + archType.Name
-				if !inList(target, targets) {
+				if !InList(target, targets) {
 					targets = append(targets, target)
 				}
 			}
 			if os.Bionic() {
 				target := "Bionic_" + archType.Name
-				if !inList(target, targets) {
+				if !InList(target, targets) {
 					targets = append(targets, target)
 				}
 			}
diff --git a/android/config.go b/android/config.go
index 887291d..07e25f3 100644
--- a/android/config.go
+++ b/android/config.go
@@ -690,12 +690,12 @@
 func (c *deviceConfig) CoverageEnabledForPath(path string) bool {
 	coverage := false
 	if c.config.ProductVariables.CoveragePaths != nil {
-		if prefixInList(path, *c.config.ProductVariables.CoveragePaths) {
+		if PrefixInList(path, *c.config.ProductVariables.CoveragePaths) {
 			coverage = true
 		}
 	}
 	if coverage && c.config.ProductVariables.CoverageExcludePaths != nil {
-		if prefixInList(path, *c.config.ProductVariables.CoverageExcludePaths) {
+		if PrefixInList(path, *c.config.ProductVariables.CoverageExcludePaths) {
 			coverage = false
 		}
 	}
@@ -706,21 +706,21 @@
 	if c.ProductVariables.IntegerOverflowExcludePaths == nil {
 		return false
 	}
-	return prefixInList(path, *c.ProductVariables.IntegerOverflowExcludePaths)
+	return PrefixInList(path, *c.ProductVariables.IntegerOverflowExcludePaths)
 }
 
 func (c *config) CFIDisabledForPath(path string) bool {
 	if c.ProductVariables.CFIExcludePaths == nil {
 		return false
 	}
-	return prefixInList(path, *c.ProductVariables.CFIExcludePaths)
+	return PrefixInList(path, *c.ProductVariables.CFIExcludePaths)
 }
 
 func (c *config) CFIEnabledForPath(path string) bool {
 	if c.ProductVariables.CFIIncludePaths == nil {
 		return false
 	}
-	return prefixInList(path, *c.ProductVariables.CFIIncludePaths)
+	return PrefixInList(path, *c.ProductVariables.CFIIncludePaths)
 }
 
 func stringSlice(s *[]string) []string {
diff --git a/android/util.go b/android/util.go
index 29bb9b1..854d782 100644
--- a/android/util.go
+++ b/android/util.go
@@ -54,7 +54,7 @@
 	return s
 }
 
-func indexList(s string, list []string) int {
+func IndexList(s string, list []string) int {
 	for i, l := range list {
 		if l == s {
 			return i
@@ -64,11 +64,11 @@
 	return -1
 }
 
-func inList(s string, list []string) bool {
-	return indexList(s, list) != -1
+func InList(s string, list []string) bool {
+	return IndexList(s, list) != -1
 }
 
-func prefixInList(s string, list []string) bool {
+func PrefixInList(s string, list []string) bool {
 	for _, prefix := range list {
 		if strings.HasPrefix(s, prefix) {
 			return true
@@ -77,6 +77,37 @@
 	return false
 }
 
+func FilterList(list []string, filter []string) (remainder []string, filtered []string) {
+	for _, l := range list {
+		if InList(l, filter) {
+			filtered = append(filtered, l)
+		} else {
+			remainder = append(remainder, l)
+		}
+	}
+
+	return
+}
+
+func RemoveListFromList(list []string, filter_out []string) (result []string) {
+	result = make([]string, 0, len(list))
+	for _, l := range list {
+		if !InList(l, filter_out) {
+			result = append(result, l)
+		}
+	}
+	return
+}
+
+func RemoveFromList(s string, list []string) (bool, []string) {
+	i := IndexList(s, list)
+	if i != -1 {
+		return true, append(list[:i], list[i+1:]...)
+	} else {
+		return false, list
+	}
+}
+
 // FirstUniqueStrings returns all unique elements of a slice of strings, keeping the first copy of
 // each.  It modifies the slice contents in place, and returns a subslice of the original slice.
 func FirstUniqueStrings(list []string) []string {
diff --git a/cc/util.go b/cc/util.go
index 7041029..5131b09 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -40,50 +40,11 @@
 	return android.JoinWithPrefix(names, "-l")
 }
 
-func indexList(s string, list []string) int {
-	for i, l := range list {
-		if l == s {
-			return i
-		}
-	}
-
-	return -1
-}
-
-func inList(s string, list []string) bool {
-	return indexList(s, list) != -1
-}
-
-func filterList(list []string, filter []string) (remainder []string, filtered []string) {
-	for _, l := range list {
-		if inList(l, filter) {
-			filtered = append(filtered, l)
-		} else {
-			remainder = append(remainder, l)
-		}
-	}
-
-	return
-}
-
-func removeListFromList(list []string, filter_out []string) (result []string) {
-	result = make([]string, 0, len(list))
-	for _, l := range list {
-		if !inList(l, filter_out) {
-			result = append(result, l)
-		}
-	}
-	return
-}
-
-func removeFromList(s string, list []string) (bool, []string) {
-	i := indexList(s, list)
-	if i != -1 {
-		return true, append(list[:i], list[i+1:]...)
-	} else {
-		return false, list
-	}
-}
+var indexList = android.IndexList
+var inList = android.InList
+var filterList = android.FilterList
+var removeListFromList = android.RemoveListFromList
+var removeFromList = android.RemoveFromList
 
 var libNameRegexp = regexp.MustCompile(`^lib(.*)$`)
 
