Background
I'm creating a layout for an android application and have until now been using font sizes expressed in sp (or dp) in order that they scale correctly for different devices. However the result has been different to what I was hoping. The result has been that text is the same physical size (in terms of inches) on all devices whereas what I'd like is for it to occupy the same proportion of the screen.
At present my menu buttons look somewhat small on tablets but ludicrously large on phones (see screenshots; although it doesn't do justice to how bad the phone version looks).
Using px actually gives me the results I want for these particular devices but that is because they have similar resolutions (but very different pixel densities). If I used pixels based upon how I want it to look on these two devices (both approximately 1,200 x 700) and the Galaxy S10 came out that was the same physical size as the galaxy S3 but had a resolution of 10,000 x 7,000 then my buttons would look ridiculously small.
Question
How can I set a font size (or any size) that is resolution independent (not density independent)?
Galaxy S3 - large phone

Tab 3 - medium sided tablet

Current layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center"
android:background="@drawable/menubackground"
>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center"
>
<Button
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/singleplayer"
android:layout_marginTop="50dp"
android:layout_marginBottom="50dp"
android:textSize="50sp"
android:onClick="singleplayer"
/>
<Button
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/twoplayer"
android:layout_marginTop="50dp"
android:layout_marginBottom="50dp"
android:textSize="50sp"
android:onClick="twoplayer"
/>
<Button
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/campaign"
android:layout_marginTop="50dp"
android:layout_marginBottom="50dp"
android:textSize="50sp"
android:onClick="campaign"
/>
<Button
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/ai_vs_ai"
android:layout_marginTop="50dp"
android:layout_marginBottom="50dp"
android:textSize="50sp"
android:onClick="aiVsAI"
/>
</LinearLayout>
</LinearLayout>