Last active
June 13, 2021 21:04
-
-
Save empathicqubit/c075158e915e4d85651bb83d4196cab4 to your computer and use it in GitHub Desktop.
Patch GBoard to include keyboard layout from http://sangaline.com/post/finding-an-optimal-keyboard-layout-for-swype/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
CURDIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")" | |
which patch diff curl java 2>/dev/null || { echo "You need patch, diff, curl, and java to continue" ; exit 1 ; } | |
TMP="$(mktemp -d "$CURDIR/gboard-tmp-XXXXXX")" | |
echo "Building in $TMP..." | |
cat <<'HERE' > "$TMP/patch.patch" | |
diff -rc gboard/AndroidManifest.xml decomp/AndroidManifest.xml | |
*** gboard/AndroidManifest.xml 2019-03-18 22:24:42.239348074 +0000 | |
--- decomp/AndroidManifest.xml 2019-03-18 21:48:43.000000000 +0000 | |
*************** | |
*** 27,33 **** | |
<uses-feature android:name="android.hardware.camera" android:required="false"/> | |
<permission android:name="com.google.android.apps.inputmethod.latin.permission.UPDATE_STICKER_INDEX" android:protectionLevel="signature"/> | |
<uses-permission android:name="com.google.android.apps.inputmethod.latin.permission.UPDATE_STICKER_INDEX"/> | |
! <application android:allowBackup="true" android:backupAgent="com.google.android.apps.inputmethod.latin.core.LatinBackupAgent" android:debuggable="false" android:extractNativeLibs="false" android:icon="@mipmap/ic_app" android:killAfterRestore="false" android:label="@string/ime_name" android:name="com.google.android.apps.inputmethod.latin.LatinApp" android:restoreAnyVersion="true" android:roundIcon="@mipmap/ic_app_round" android:supportsRtl="true" android:theme="@style/AppThemeSelector" android:usesCleartextTraffic="false"> | |
<meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIl3fO6Spo7vqdonbORA0gOqfXPTnKWTdG6eHJNA"/> | |
<meta-data android:name="com.google.android.partnersetup.RLZ_BOUNTY_ACCESS_POINT" android:value="y0,yg"/> | |
<service android:directBootAware="true" android:label="@string/ime_name" android:name="com.android.inputmethod.latin.LatinIME" android:permission="android.permission.BIND_INPUT_METHOD"> | |
--- 27,33 ---- | |
<uses-feature android:name="android.hardware.camera" android:required="false"/> | |
<permission android:name="com.google.android.apps.inputmethod.latin.permission.UPDATE_STICKER_INDEX" android:protectionLevel="signature"/> | |
<uses-permission android:name="com.google.android.apps.inputmethod.latin.permission.UPDATE_STICKER_INDEX"/> | |
! <application android:allowBackup="true" android:backupAgent="com.google.android.apps.inputmethod.latin.core.LatinBackupAgent" android:debuggable="false" android:extractNativeLibs="true" android:icon="@mipmap/ic_app" android:killAfterRestore="false" android:label="@string/ime_name" android:name="com.google.android.apps.inputmethod.latin.LatinApp" android:restoreAnyVersion="true" android:roundIcon="@mipmap/ic_app_round" android:supportsRtl="true" android:theme="@style/AppThemeSelector" android:usesCleartextTraffic="false"> | |
<meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIl3fO6Spo7vqdonbORA0gOqfXPTnKWTdG6eHJNA"/> | |
<meta-data android:name="com.google.android.partnersetup.RLZ_BOUNTY_ACCESS_POINT" android:value="y0,yg"/> | |
<service android:directBootAware="true" android:label="@string/ime_name" android:name="com.android.inputmethod.latin.LatinIME" android:permission="android.permission.BIND_INPUT_METHOD"> | |
*************** | |
*** 227,230 **** | |
</intent-filter> | |
</service> | |
</application> | |
! </manifest> | |
\ No newline at end of file | |
--- 227,230 ---- | |
</intent-filter> | |
</service> | |
</application> | |
! </manifest> | |
diff -rc gboard/apktool.yml decomp/apktool.yml | |
*** gboard/apktool.yml 2019-03-18 22:24:50.987348074 +0000 | |
--- decomp/apktool.yml 2019-03-18 21:58:08.084348074 +0000 | |
*************** | |
*** 176,179 **** | |
version: 2.3.3 | |
versionInfo: | |
versionCode: '26800414' | |
! versionName: 8.0.4.236324529-release-arm64-v8a | |
--- 176,179 ---- | |
version: 2.3.3 | |
versionInfo: | |
versionCode: '26800414' | |
! versionName: 8.0.4.236324529-sangaline-release-arm64-v8a | |
diff -rc gboard/res/xml/keymapping_dvorak.xml decomp/res/xml/keymapping_dvorak.xml | |
*** gboard/res/xml/keymapping_dvorak.xml 2019-03-18 22:24:44.292348074 +0000 | |
--- decomp/res/xml/keymapping_dvorak.xml 2019-03-18 20:53:48.394348074 +0000 | |
*************** | |
*** 1,83 **** | |
<?xml version="1.0" encoding="utf-8"?> | |
<framework> | |
<key_mapping> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_apostrophe" /> | |
! <mapping view_id="@id/key_pos_0_1" key_id="@id/softkey_lower_comma" /> | |
! <mapping view_id="@id/key_pos_0_2" key_id="@id/softkey_full_stop" /> | |
<mapping view_id="@id/key_pos_0_3" key_id="@id/softkey_latin_small_letter_p" /> | |
! <mapping view_id="@id/key_pos_0_4" key_id="@id/softkey_latin_small_letter_y" /> | |
! <mapping view_id="@id/key_pos_0_5" key_id="@id/softkey_latin_small_letter_f" /> | |
! <mapping view_id="@id/key_pos_0_6" key_id="@id/softkey_latin_small_letter_g" /> | |
! <mapping view_id="@id/key_pos_0_7" key_id="@id/softkey_latin_small_letter_c" /> | |
! <mapping view_id="@id/key_pos_0_8" key_id="@id/softkey_latin_small_letter_r" /> | |
! <mapping view_id="@id/key_pos_0_9" key_id="@id/softkey_latin_small_letter_l" /> | |
! <mapping view_id="@id/key_pos_1_0" key_id="@id/softkey_latin_small_letter_a" /> | |
! <mapping view_id="@id/key_pos_1_1" key_id="@id/softkey_latin_small_letter_o" /> | |
! <mapping view_id="@id/key_pos_1_2" key_id="@id/softkey_latin_small_letter_e" /> | |
<mapping view_id="@id/key_pos_1_3" key_id="@id/softkey_latin_small_letter_u" /> | |
! <mapping view_id="@id/key_pos_1_4" key_id="@id/softkey_latin_small_letter_i" /> | |
! <mapping view_id="@id/key_pos_1_5" key_id="@id/softkey_latin_small_letter_d" /> | |
! <mapping view_id="@id/key_pos_1_6" key_id="@id/softkey_latin_small_letter_h" /> | |
! <mapping view_id="@id/key_pos_1_7" key_id="@id/softkey_latin_small_letter_t" /> | |
! <mapping view_id="@id/key_pos_1_8" key_id="@id/softkey_latin_small_letter_n" /> | |
! <mapping view_id="@id/key_pos_1_9" key_id="@id/softkey_latin_small_letter_s" /> | |
! <mapping view_id="@id/key_pos_2_1" key_id="@id/softkey_latin_small_letter_j" /> | |
! <mapping view_id="@id/key_pos_2_2" key_id="@id/softkey_latin_small_letter_k" /> | |
! <mapping view_id="@id/key_pos_2_3" key_id="@id/softkey_latin_small_letter_x" /> | |
! <mapping view_id="@id/key_pos_2_4" key_id="@id/softkey_latin_small_letter_b" /> | |
! <mapping view_id="@id/key_pos_2_5" key_id="@id/softkey_latin_small_letter_m" /> | |
! <mapping view_id="@id/key_pos_2_6" key_id="@id/softkey_latin_small_letter_w" /> | |
! <mapping view_id="@id/key_pos_2_7" key_id="@id/softkey_latin_small_letter_v" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_1" key_id="@id/softkey_latin_small_letter_q" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_2" key_id="@id/softkey_latin_small_letter_z" /> | |
</key_mapping> | |
<key_mapping state="SHIFT"> | |
<mapping view_id="@id/key_pos_0_3" key_id="@id/softkey_latin_capital_letter_p" /> | |
! <mapping view_id="@id/key_pos_0_4" key_id="@id/softkey_latin_capital_letter_y" /> | |
! <mapping view_id="@id/key_pos_0_5" key_id="@id/softkey_latin_capital_letter_f" /> | |
! <mapping view_id="@id/key_pos_0_6" key_id="@id/softkey_latin_capital_letter_g" /> | |
! <mapping view_id="@id/key_pos_0_7" key_id="@id/softkey_latin_capital_letter_c" /> | |
! <mapping view_id="@id/key_pos_0_8" key_id="@id/softkey_latin_capital_letter_r" /> | |
! <mapping view_id="@id/key_pos_0_9" key_id="@id/softkey_latin_capital_letter_l" /> | |
! <mapping view_id="@id/key_pos_1_0" key_id="@id/softkey_latin_capital_letter_a" /> | |
! <mapping view_id="@id/key_pos_1_1" key_id="@id/softkey_latin_capital_letter_o" /> | |
! <mapping view_id="@id/key_pos_1_2" key_id="@id/softkey_latin_capital_letter_e" /> | |
<mapping view_id="@id/key_pos_1_3" key_id="@id/softkey_latin_capital_letter_u" /> | |
! <mapping view_id="@id/key_pos_1_4" key_id="@id/softkey_latin_capital_letter_i" /> | |
! <mapping view_id="@id/key_pos_1_5" key_id="@id/softkey_latin_capital_letter_d" /> | |
! <mapping view_id="@id/key_pos_1_6" key_id="@id/softkey_latin_capital_letter_h" /> | |
! <mapping view_id="@id/key_pos_1_7" key_id="@id/softkey_latin_capital_letter_t" /> | |
! <mapping view_id="@id/key_pos_1_8" key_id="@id/softkey_latin_capital_letter_n" /> | |
! <mapping view_id="@id/key_pos_1_9" key_id="@id/softkey_latin_capital_letter_s" /> | |
! <mapping view_id="@id/key_pos_2_1" key_id="@id/softkey_latin_capital_letter_j" /> | |
! <mapping view_id="@id/key_pos_2_2" key_id="@id/softkey_latin_capital_letter_k" /> | |
! <mapping view_id="@id/key_pos_2_3" key_id="@id/softkey_latin_capital_letter_x" /> | |
! <mapping view_id="@id/key_pos_2_4" key_id="@id/softkey_latin_capital_letter_b" /> | |
! <mapping view_id="@id/key_pos_2_5" key_id="@id/softkey_latin_capital_letter_m" /> | |
! <mapping view_id="@id/key_pos_2_6" key_id="@id/softkey_latin_capital_letter_w" /> | |
! <mapping view_id="@id/key_pos_2_7" key_id="@id/softkey_latin_capital_letter_v" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_1" key_id="@id/softkey_latin_capital_letter_q" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_2" key_id="@id/softkey_latin_capital_letter_z" /> | |
</key_mapping> | |
! <key_mapping state="MANUAL_SHIFT"> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_quot" /> | |
! <mapping view_id="@id/key_pos_0_1" key_id="@id/softkey_lt" /> | |
! <mapping view_id="@id/key_pos_0_2" key_id="@id/softkey_gt" /> | |
! </key_mapping> | |
! <key_mapping state="INPUT_TYPE_EMAIL_ADDRESS"> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_commercial_at" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_1" key_id="@id/softkey_latin_small_letter_q" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_2" key_id="@id/softkey_latin_small_letter_z" /> | |
! </key_mapping> | |
! <key_mapping state="INPUT_TYPE_URI"> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_solidus" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_1" key_id="@id/softkey_latin_small_letter_q" /> | |
! <mapping view_id="@id/key_pos_bottom_symbol_2" key_id="@id/softkey_latin_small_letter_z" /> | |
! </key_mapping> | |
! <key_mapping state="INPUT_TYPE_EMAIL_ADDRESS+MANUAL_SHIFT"> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_quot" /> | |
! </key_mapping> | |
! <key_mapping state="INPUT_TYPE_URI+MANUAL_SHIFT"> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_quot" /> | |
! </key_mapping> | |
! </framework> | |
\ No newline at end of file | |
--- 1,59 ---- | |
<?xml version="1.0" encoding="utf-8"?> | |
<framework> | |
<key_mapping> | |
! <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_latin_small_letter_d" /> | |
! <mapping view_id="@id/key_pos_0_1" key_id="@id/softkey_latin_small_letter_g" /> | |
! <mapping view_id="@id/key_pos_0_2" key_id="@id/softkey_latin_small_letter_h" /> | |
<mapping view_id="@id/key_pos_0_3" key_id="@id/softkey_latin_small_letter_p" /> | |
! <mapping view_id="@id/key_pos_0_4" key_id="@id/softkey_latin_small_letter_a" /> | |
! <mapping view_id="@id/key_pos_0_5" key_id="@id/softkey_latin_small_letter_s" /> | |
! <mapping view_id="@id/key_pos_0_6" key_id="@id/softkey_latin_small_letter_j" /> | |
! <mapping view_id="@id/key_pos_0_7" key_id="@id/softkey_latin_small_letter_r" /> | |
! <mapping view_id="@id/key_pos_0_8" key_id="@id/softkey_latin_small_letter_k" /> | |
! <mapping view_id="@id/key_pos_0_9" key_id="@id/softkey_latin_small_letter_n" /> | |
! <mapping view_id="@id/key_pos_1_0" key_id="@id/softkey_latin_small_letter_i" /> | |
! <mapping view_id="@id/key_pos_1_1" key_id="@id/softkey_latin_small_letter_q" /> | |
! <mapping view_id="@id/key_pos_1_2" key_id="@id/softkey_latin_small_letter_v" /> | |
<mapping view_id="@id/key_pos_1_3" key_id="@id/softkey_latin_small_letter_u" /> | |
! <mapping view_id="@id/key_pos_1_4" key_id="@id/softkey_latin_small_letter_w" /> | |
! <mapping view_id="@id/key_pos_1_5" key_id="@id/softkey_latin_small_letter_c" /> | |
! <mapping view_id="@id/key_pos_1_6" key_id="@id/softkey_latin_small_letter_l" /> | |
! <mapping view_id="@id/key_pos_1_7" key_id="@id/softkey_latin_small_letter_x" /> | |
! <mapping view_id="@id/key_pos_1_8" key_id="@id/softkey_latin_small_letter_m" /> | |
! <mapping view_id="@id/key_pos_2_1" key_id="@id/softkey_latin_small_letter_t" /> | |
! <mapping view_id="@id/key_pos_2_2" key_id="@id/softkey_latin_small_letter_y" /> | |
! <mapping view_id="@id/key_pos_2_3" key_id="@id/softkey_latin_small_letter_b" /> | |
! <mapping view_id="@id/key_pos_2_4" key_id="@id/softkey_latin_small_letter_e" /> | |
! <mapping view_id="@id/key_pos_2_5" key_id="@id/softkey_latin_small_letter_z" /> | |
! <mapping view_id="@id/key_pos_2_6" key_id="@id/softkey_latin_small_letter_f" /> | |
! <mapping view_id="@id/key_pos_2_7" key_id="@id/softkey_latin_small_letter_o" /> | |
</key_mapping> | |
<key_mapping state="SHIFT"> | |
+ <mapping view_id="@id/key_pos_0_0" key_id="@id/softkey_latin_capital_letter_d" /> | |
+ <mapping view_id="@id/key_pos_0_1" key_id="@id/softkey_latin_capital_letter_g" /> | |
+ <mapping view_id="@id/key_pos_0_2" key_id="@id/softkey_latin_capital_letter_h" /> | |
<mapping view_id="@id/key_pos_0_3" key_id="@id/softkey_latin_capital_letter_p" /> | |
! <mapping view_id="@id/key_pos_0_4" key_id="@id/softkey_latin_capital_letter_a" /> | |
! <mapping view_id="@id/key_pos_0_5" key_id="@id/softkey_latin_capital_letter_s" /> | |
! <mapping view_id="@id/key_pos_0_6" key_id="@id/softkey_latin_capital_letter_j" /> | |
! <mapping view_id="@id/key_pos_0_7" key_id="@id/softkey_latin_capital_letter_r" /> | |
! <mapping view_id="@id/key_pos_0_8" key_id="@id/softkey_latin_capital_letter_k" /> | |
! <mapping view_id="@id/key_pos_0_9" key_id="@id/softkey_latin_capital_letter_n" /> | |
! <mapping view_id="@id/key_pos_1_0" key_id="@id/softkey_latin_capital_letter_i" /> | |
! <mapping view_id="@id/key_pos_1_1" key_id="@id/softkey_latin_capital_letter_q" /> | |
! <mapping view_id="@id/key_pos_1_2" key_id="@id/softkey_latin_capital_letter_v" /> | |
<mapping view_id="@id/key_pos_1_3" key_id="@id/softkey_latin_capital_letter_u" /> | |
! <mapping view_id="@id/key_pos_1_4" key_id="@id/softkey_latin_capital_letter_w" /> | |
! <mapping view_id="@id/key_pos_1_5" key_id="@id/softkey_latin_capital_letter_c" /> | |
! <mapping view_id="@id/key_pos_1_6" key_id="@id/softkey_latin_capital_letter_l" /> | |
! <mapping view_id="@id/key_pos_1_7" key_id="@id/softkey_latin_capital_letter_x" /> | |
! <mapping view_id="@id/key_pos_1_8" key_id="@id/softkey_latin_capital_letter_m" /> | |
! <mapping view_id="@id/key_pos_2_1" key_id="@id/softkey_latin_capital_letter_t" /> | |
! <mapping view_id="@id/key_pos_2_2" key_id="@id/softkey_latin_capital_letter_y" /> | |
! <mapping view_id="@id/key_pos_2_3" key_id="@id/softkey_latin_capital_letter_b" /> | |
! <mapping view_id="@id/key_pos_2_4" key_id="@id/softkey_latin_capital_letter_e" /> | |
! <mapping view_id="@id/key_pos_2_5" key_id="@id/softkey_latin_capital_letter_z" /> | |
! <mapping view_id="@id/key_pos_2_6" key_id="@id/softkey_latin_capital_letter_f" /> | |
! <mapping view_id="@id/key_pos_2_7" key_id="@id/softkey_latin_capital_letter_o" /> | |
</key_mapping> | |
! </framework> | |
diff -rc gboard/smali/com/google/android/apps/inputmethod/latin/LatinApp.smali decomp/smali/com/google/android/apps/inputmethod/latin/LatinApp.smali | |
*** gboard/smali/com/google/android/apps/inputmethod/latin/LatinApp.smali 2019-03-18 22:24:48.527348074 +0000 | |
--- decomp/smali/com/google/android/apps/inputmethod/latin/LatinApp.smali 2019-03-18 21:15:03.786348074 +0000 | |
*************** | |
*** 126,132 **** | |
move-result v1 | |
! if-eqz v1, :cond_a | |
.line 10 | |
invoke-static {p0}, Lcve;->a(Landroid/content/Context;)Lcve; | |
--- 126,132 ---- | |
move-result v1 | |
! #if-eqz v1, :cond_a | |
.line 10 | |
invoke-static {p0}, Lcve;->a(Landroid/content/Context;)Lcve; | |
HERE | |
{ | |
echo "* Downloading GBoard from GCS..." | |
curl -L 'https://storage.googleapis.com/allons-me-322e36cf-static/com.google.android.inputmethod.latin_8.0.4.236324529-release-arm64-v8a-26800414_minAPI21(arm64-v8a)(nodpi)_apkmirror.com.apk' > "$TMP/gboard.apk" | |
} & | |
{ | |
echo "* Downloading APKTool..." | |
curl -L 'https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.3.3.jar' > "$TMP/apktool.jar" | |
} & | |
{ | |
echo "* Downloading uber-apk-signer..." | |
curl -L 'https://github.com/patrickfav/uber-apk-signer/releases/download/v0.8.4/uber-apk-signer-0.8.4.jar' > "$TMP/ubersigner.jar" | |
} & | |
wait || exit $? | |
cd "$TMP" | |
echo "* Decompiling..." | |
java -jar "$TMP/apktool.jar" d -o "$TMP/decomp" "$TMP/gboard.apk" || exit $? | |
echo "* Patching..." | |
cd "$TMP/decomp" | |
patch -Np1 < "$TMP/patch.patch" || exit $? | |
cd "$TMP" | |
echo "* Compiling..." | |
java -jar "$TMP/apktool.jar" b "$TMP/decomp" || exit $? | |
echo "* Signing..." | |
java -jar "$TMP/ubersigner.jar" -a "$TMP/decomp/dist/gboard.apk" || exit $? | |
NEWAPK="$(mktemp "$CURDIR/gboard-XXXX.apk")" | |
mv "$TMP/decomp/dist/gboard-aligned-debugSigned.apk" "$NEWAPK" | |
echo "* APK saved to $NEWAPK" | |
rm -rf "$TMP" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment