Build.py will just use the default from the argparser instead of overwriting it with the shell variable value or using that value as the default in the argparser.
Quick fixes in either AndroidManifest.xml.tmpl or build.py but I don't want to screw up buildozer's expected behavior or I'd patch it myself.
In AndroidManifest.xml.tmpl:
<uses-sdk android:minSdkVersion="{{ args.min_sdk_version }}" androi...
In build.py:
# Get target android API
android_api = int(os.environ.get('ANDROIDAPI', '8'))
args.min_sdk_version isn't being overwritten by the shell variable and the shell variable isn't used as the default value in the arg parser. It would seem that shell variables are less specific than args, but really why isn't the API version hard-coded into each build.py considering that the SDK is set during distribute.sh?