Logré una buena solución con este:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item android:top="-1dp" android:right="-1dp" android:left="-1dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="#ffffff" />
</shape>
</item>
</layer-list>
Esto funciona bien en caso de que necesite un fondo transparente pero aún un color de trazo abierto (en mi caso, solo necesitaba una línea de fondo). Si necesita un color de fondo, puede agregar un color de forma sólida como en la respuesta de Maragues.
EDITAR 1
A veces, para dispositivos de alta densidad, el uso de valores de inmersión bajos puede terminar en trazos o distancias muy delgados o invisibles. Esto puede sucederle también al configurar divisores ListView.
La solución alternativa más sencilla es utilizar una distancia de 1 px en lugar de 1 dp. Esto hará que la línea sea siempre visible en todas las densidades. La mejor solución sería crear recursos de dimensión para cada densidad, para obtener el mejor tamaño para cada dispositivo.
Editar 2
Divertido, pero intenté usar esto 6 años después y no puedo obtener un buen resultado en los dispositivos Lollipop.
Probablemente la solución actual sea utilizar 9 parches. Android debería haber sido una solución fácil para este problema después de todo este tiempo.