You can use some of these libraries: osmdroid, mapsforge. Both of them provides interface to some internet map databases and allows to create your own maps provider.
They allows you to have (and handle) your offline cache, dynamic asynchronous maps loading, resampling on zoom, adding overlays and so on, like original MapView does.
Another good point of using these libraries is that they are well-designed for in-place substitution of google MapView.
Also you may be interested in Google's Javascript maps api, which also allows to use custom maps source (see this link). This approach can be used with loading map into your WebView. But in this case you still need Google's Maps API key and I'm afraids that you'll be still limited to 25000 usages per day.
== UPDATE ==
Now, Google Maps for Android (that one in Google Play Services) support custom tiles, so there is no more need to use 3rd-party libraries for applying you own tiles (if the usage meets license agreement).