diff --git a/Android.mk b/Android.mk
index 102b2b18840d99f78ff49415bb166c857bf736f9..a41fc037a6e9df9c68ded2f5f43b6d432b24c94c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -30,6 +30,13 @@ endif
 # $(1): the set of policy name paths to build
 build_policy = $(foreach type, $(1), $(foreach file, $(addsuffix /$(type), $(LOCAL_PATH) $(BOARD_SEPOLICY_DIRS)), $(sort $(wildcard $(file)))))
 
+# Add a file containing only a newline in-between each policy configuration
+# 'contexts' file. This will allow OEM policy configuration files without a
+# final newline (0x0A) to be built correctly by the m4(1) macro processor.
+# $(1): the set of contexts file names.
+# $(2): the file containing only 0x0A.
+add_nl = $(foreach entry, $(1), $(subst $(entry), $(entry) $(2), $(entry)))
+
 sepolicy_build_files := security_classes \
                         initial_sids \
                         access_vectors \
@@ -52,6 +59,21 @@ sepolicy_build_files := security_classes \
 ##################################
 include $(CLEAR_VARS)
 
+LOCAL_MODULE := sectxfile_nl
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_TAGS := optional
+
+# Create a file containing newline only to add between context config files
+include $(BUILD_SYSTEM)/base_rules.mk
+$(LOCAL_BUILT_MODULE): $(all_fcfiles_with_nl) $(all_pcfiles_with_nl) $(all_svcfiles_with_nl)
+	@mkdir -p $(dir $@)
+	$(hide) echo > $@
+
+built_nl := $(LOCAL_BUILT_MODULE)
+
+#################################
+include $(CLEAR_VARS)
+
 LOCAL_MODULE := sepolicy
 LOCAL_MODULE_CLASS := ETC
 LOCAL_MODULE_TAGS := optional
@@ -161,11 +183,12 @@ ifneq ($(filter address,$(SANITIZE_TARGET)),)
   all_fc_files := $(all_fc_files) file_contexts_asan
 endif
 all_fc_files := $(call build_policy, $(all_fc_files))
+all_fcfiles_with_nl := $(call add_nl, $(all_fc_files), $(built_nl))
 
 file_contexts.tmp := $(intermediates)/file_contexts.tmp
-$(file_contexts.tmp): PRIVATE_FC_FILES := $(all_fc_files)
+$(file_contexts.tmp): PRIVATE_FC_FILES := $(all_fcfiles_with_nl)
 $(file_contexts.tmp): PRIVATE_ADDITIONAL_M4DEFS := $(LOCAL_ADDITIONAL_M4DEFS)
-$(file_contexts.tmp): $(all_fc_files)
+$(file_contexts.tmp): $(all_fc_files) $(all_fcfiles_with_nl) $(built_nl)
 	@mkdir -p $(dir $@)
 	$(hide) m4 -s $(PRIVATE_ADDITIONAL_M4DEFS) $(PRIVATE_FC_FILES) > $@
 
@@ -263,11 +286,12 @@ LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
 include $(BUILD_SYSTEM)/base_rules.mk
 
 all_pc_files := $(call build_policy, property_contexts)
+all_pcfiles_with_nl := $(call add_nl, $(all_pc_files), $(built_nl))
 
 property_contexts.tmp := $(intermediates)/property_contexts.tmp
-$(property_contexts.tmp): PRIVATE_PC_FILES := $(all_pc_files)
+$(property_contexts.tmp): PRIVATE_PC_FILES := $(all_pcfiles_with_nl)
 $(property_contexts.tmp): PRIVATE_ADDITIONAL_M4DEFS := $(LOCAL_ADDITIONAL_M4DEFS)
-$(property_contexts.tmp): $(all_pc_files)
+$(property_contexts.tmp): $(all_pc_files) $(all_pcfiles_with_nl) $(built_nl)
 	@mkdir -p $(dir $@)
 	$(hide) m4 -s $(PRIVATE_ADDITIONAL_M4DEFS) $(PRIVATE_PC_FILES) > $@
 
@@ -315,11 +339,12 @@ LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
 include $(BUILD_SYSTEM)/base_rules.mk
 
 all_svc_files := $(call build_policy, service_contexts)
+all_svcfiles_with_nl := $(call add_nl, $(all_svc_files), $(built_nl))
 
 service_contexts.tmp := $(intermediates)/service_contexts.tmp
-$(service_contexts.tmp): PRIVATE_SVC_FILES := $(all_svc_files)
+$(service_contexts.tmp): PRIVATE_SVC_FILES := $(all_svcfiles_with_nl)
 $(service_contexts.tmp): PRIVATE_ADDITIONAL_M4DEFS := $(LOCAL_ADDITIONAL_M4DEFS)
-$(service_contexts.tmp): $(all_svc_files)
+$(service_contexts.tmp): $(all_svc_files) $(all_svcfiles_with_nl) $(built_nl)
 	@mkdir -p $(dir $@)
 	$(hide) m4 -s $(PRIVATE_ADDITIONAL_M4DEFS) $(PRIVATE_SVC_FILES) > $@
 
@@ -407,5 +432,6 @@ built_pc :=
 built_svc :=
 built_general_sepolicy :=
 built_general_sepolicy.conf :=
+built_nl :=
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/README b/README
index 972997a10f7abde07f070d58ae7397165529fe1f..a3c75b833616c549831ca36fd35e9642e4a74727 100644
--- a/README
+++ b/README
@@ -7,11 +7,19 @@ into the policy build as described below.
 Policy Generation:
 
 Additional, per device, policy files can be added into the
-policy build.
-
-They can be configured through the use of the BOARD_SEPOLICY_DIRS
-variable. This variable should be set in the BoardConfig.mk file in
-the device or vendor directories.
+policy build. These files should have each line including the
+final line terminated by a newline character (0x0A).  This
+will allow files to be concatenated and processed whenever
+the m4(1) macro processor is called by the build process.
+Adding the newline will also make the intermediate text files
+easier to read when debugging build failures.  The sets of file,
+service and property contexts files will automatically have a
+newline inserted between each file as these are common failure
+points.
+
+These device policy files can be configured through the use of
+the BOARD_SEPOLICY_DIRS variable. This variable should be set
+in the BoardConfig.mk file in the device or vendor directories.
 
 BOARD_SEPOLICY_DIRS contains a list of directories to search
 for additional policy files. Order matters in this list.