Yes, to a certain degree. LinearGradient has a constructor that takes multiple colors and positions, so you can approximate non-linear progression using piece-wise linear function.
The code below is based on answer https://stackoverflow.com/a/4381192/8568479
ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
    @Override
    public Shader resize(int width, int height) {
        LinearGradient gradient = new LinearGradient(0, 0, width, height,
            new int[] { 
                Color.parseColor("#000000"),
                Color.parseColor("#777777"),
                Color.parseColor("#FFFFFF")
            },
            new float[] { 0, 0.3f, 1 },
            Shader.TileMode.REPEAT
        );
        return gradient;
    }
};
PaintDrawable p = new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(shaderFactory);
You can add as many stops as you need to make the gradient look smooth. I've also found this link helpful to select the coefficients for a smooth-looking gradient https://css-tricks.com/easing-linear-gradients/