Skip to content

Instantly share code, notes, and snippets.

@empathicqubit
Last active June 13, 2021 21:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save empathicqubit/c075158e915e4d85651bb83d4196cab4 to your computer and use it in GitHub Desktop.
Save empathicqubit/c075158e915e4d85651bb83d4196cab4 to your computer and use it in GitHub Desktop.
#! /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