Extract generateUpdatableBcpPackagesRule from updatableBcpPackagesRule

This simplifies the process of moving the updatableBcpPackagesRule to
the platform_bootclasspath by separating the gathering of the list of
updatable modules (which differs between the singleton and the
platform_bootclasspath module) from the gathering of the permitted
packages list and generation of the rule which are generally common.

Bug: 177892522
Test: lunch art_module_arm64
      m out/soong/module_arm64/dex_bootjars/updatable-bcp-packages.txt
      - make sure it is not affected by this change
Change-Id: I3cb64310f618059758a32cfe00d3745d52388e49
diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go
index 963bc96..8a6f3d1 100644
--- a/java/dexpreopt_bootjars.go
+++ b/java/dexpreopt_bootjars.go
@@ -893,29 +893,39 @@
 	}
 
 	global := dexpreopt.GetGlobalConfig(ctx)
+	var modules []android.Module
 	updatableModules := global.UpdatableBootJars.CopyOfJars()
-
-	// Collect `permitted_packages` for updatable boot jars.
-	var updatablePackages []string
 	ctx.VisitAllModules(func(module android.Module) {
 		if !isActiveModule(module) {
 			return
 		}
-		if j, ok := module.(PermittedPackagesForUpdatableBootJars); ok {
-			name := ctx.ModuleName(module)
-			if i := android.IndexList(name, updatableModules); i != -1 {
-				pp := j.PermittedPackagesForUpdatableBootJars()
-				if len(pp) > 0 {
-					updatablePackages = append(updatablePackages, pp...)
-				} else {
-					ctx.Errorf("Missing permitted_packages for %s", name)
-				}
-				// Do not match the same library repeatedly.
-				updatableModules = append(updatableModules[:i], updatableModules[i+1:]...)
-			}
+		name := ctx.ModuleName(module)
+		if i := android.IndexList(name, updatableModules); i != -1 {
+			modules = append(modules, module)
+			// Do not match the same library repeatedly.
+			updatableModules = append(updatableModules[:i], updatableModules[i+1:]...)
 		}
 	})
 
+	return generateUpdatableBcpPackagesRule(ctx, image, modules)
+}
+
+// generateUpdatableBcpPackagesRule generates the rule to create the updatable-bcp-packages.txt file
+// and returns a path to the generated file.
+func generateUpdatableBcpPackagesRule(ctx android.SingletonContext, image *bootImageConfig, updatableModules []android.Module) android.WritablePath {
+	// Collect `permitted_packages` for updatable boot jars.
+	var updatablePackages []string
+	for _, module := range updatableModules {
+		if j, ok := module.(PermittedPackagesForUpdatableBootJars); ok {
+			pp := j.PermittedPackagesForUpdatableBootJars()
+			if len(pp) > 0 {
+				updatablePackages = append(updatablePackages, pp...)
+			} else {
+				ctx.Errorf("Missing permitted_packages for %s", ctx.ModuleName(module))
+			}
+		}
+	}
+
 	// Sort updatable packages to ensure deterministic ordering.
 	sort.Strings(updatablePackages)