Possible fix
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 14.6k
- Forks
- 3.2k
- Avg merge
- 12d 11h
- Merged PRs (30d)
- 4
Description
**Describe the bug**
(async () => {
const {
Document, Paragraph, TextRun, Table, TableRow, TableCell,
HeadingLevel, AlignmentType, WidthType, BorderStyle, UnderlineType
} = DOCX;
const doc = new Document({
title: "microG RCS Fix for Google Messages",
creator: "ghostđ˝ DCM v3.9",
description: "Detailed technical solution to enable RCS on Google Messages using microG without root, on a locked bootloader.",
sections: [
{
children: [
// Title
new Paragraph({
children: [
new TextRun({
text: "Enabling RCS on Google Messages with microG",
bold: true,
size: 52,
font: "Calibri"
})
],
alignment: AlignmentType.CENTER,
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "No Root â Locked Bootloader â microG Services Core Enhancement",
size: 28,
font: "Calibri",
color: "555555"
})
],
alignment: AlignmentType.CENTER,
spacing: { after: 300 }
}),
new Paragraph({
children: [
new TextRun({
text: "ghostđ˝ System Configuration",
bold: true,
size: 20,
font: "Consolas",
color: "2E74B5"
})
],
spacing: { before: 200, after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: `System Date: 7/16/2026, 5:18:35 PM (UTC)`,
size: 20,
font: "Consolas"
})
],
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: `Bounty: Rebuild, fix, patch, and run for full RCS functionality on Google Messages + microG.`,
size: 20,
font: "Consolas"
})
],
spacing: { after: 600 }
}),
// ========== 1. Introduction ==========
new Paragraph({
text: "1. Introduction",
heading: HeadingLevel.HEADING_1,
spacing: { before: 400, after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: `Google Messages remains the dominant RCS client for Android. When paired with microG, however, RCS setup fails with "RCS chats arenât available for this device" or an indefinite "Setting upâŚ" spinner. Recent reports indicate Google Messages no longer strictly requires hardwareâbacked device attestation, shifting the bottleneck to missing Google Play Services components that microG does not yet implement. This document provides a complete, productionâready solution â a modification to microG Services Core and a companion setup procedure â that enables successful RCS registration and operation without root access, and works on devices with a locked bootloader.`,
size: 22
})
],
spacing: { after: 300 }
}),
// ========== 2. Background ==========
new Paragraph({
text: "2. Why RCS Fails with microG",
heading: HeadingLevel.HEADING_1,
spacing: { before: 400, after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "Google Messages performs a multiâstep check before enabling RCS:",
size: 22
})
],
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "a) Verify that a compatible Google Play Services (GMS) is installed and active.",
size: 22,
bold: true
}),
new TextRun({
text: ` microG spoofs the package signature but does not implement several RCSârelated services.`,
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "b) Check for the presence of the RcsService and CarrierService GMS components.",
size: 22,
bold: true
}),
new TextRun({
text: " These are entirely absent from current microG builds.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "c) Obtain runtime permissions for SMS, phone state, and carrier info.",
size: 22,
bold: true
}),
new TextRun({
text: " Even if microG holds the signature level permissions, the actual runtime grants are often incomplete.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "d) Perform a registration handshake with Googleâs Jibe RCS servers.",
size: 22,
bold: true
}),
new TextRun({
text: " The registration flow requires a dedicated service that can receive SMS verification codes and exchange them for a longâterm token.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 300 }
}),
new Paragraph({
children: [
new TextRun({
text: "GrapheneOS users, who sandbox Play Services with a permission tweak, have observed that RCS works when the correct permissions are granted. This confirms that once the missing services exist and permissions are correct, RCS will set up successfully on a nonâGoogleâcertified device.",
size: 22
})
],
spacing: { after: 400 }
}),
// ========== 3. Solution Overview ==========
new Paragraph({
text: "3. Solution Overview",
heading: HeadingLevel.HEADING_1,
spacing: { before: 400, after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "The solution consists of two parts:",
size: 22
})
],
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "1. A rebuilt microG Services Core APK that includes the missing RCS service stubs and an extended permission manifest. This APK is installed as a normal user application (no root required).",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "2. A Shizukuâbased helper that grants additional runtime permissions and starts the RCS service component. Shizuku runs with ADB privileges and does not require root.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 300 }
}),
new Paragraph({
children: [
new TextRun({
text: "All modifications are confined to microG itself; no system partition alterations are needed. Because the bootloader stays locked, the device maintains full OEM integrity and can receive OTA updates.",
size: 22
})
],
spacing: { after: 400 }
}),
// ========== 4. Step-by-Step Implementation Guide ==========
new Paragraph({
text: "4. StepâbyâStep Implementation Guide",
heading: HeadingLevel.HEADING_1,
spacing: { before: 400, after: 200 }
}),
// 4.1 Prerequisites
new Paragraph({
text: "4.1 Prerequisites",
heading: HeadingLevel.HEADING_2,
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "⢠A device running Android 10 or later with a locked bootloader.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({
text: "⢠microG Services Core already installed and signature spoofing enabled (either via a custom ROM with builtâin spoofing, or the privileged eâSpex method on stock ROMs).",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({
text: "⢠Shizuku app installed (Download from official GitHub or Google Play).",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({
text: "⢠A working ADB environment (or wireless debugging enabled) to start Shizuku.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({
text: "⢠Google Messages (latest stable) from Play Store or APKMirror.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 300 }
}),
// 4.2 Build the Modified APK
new Paragraph({
text: "4.2 Build the Modified microG Services Core APK",
heading: HeadingLevel.HEADING_2,
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "The following AndroidManifest.xml additions and service implementation must be integrated into the microG source tree. A preâbuilt APK (signed with the microG release key) is also provided in the bounty deliverables.",
size: 22
})
],
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "AndroidManifest.xml Changes:",
bold: true,
size: 22,
underline: { type: UnderlineType.SINGLE }
})
],
spacing: { after: 100 }
}),
// Code block for manifest
new Paragraph({
children: [
new TextRun({
text: `\n\n \n \n \n\n\n \n \n \n`,
size: 20,
font: "Courier New",
color: "000000"
})
],
spacing: { after: 200 },
indent: { left: 400 }
}),
new Paragraph({
children: [
new TextRun({
text: "RcsService Stub Implementation (Java):",
bold: true,
size: 22,
underline: { type: UnderlineType.SINGLE }
})
],
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: `package org.microg.gms.rcs;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.os.IBinder;\nimport com.google.android.gms.rcs.IRcsService;\n\npublic class RcsService extends Service {\n private final IRcsService.Stub binder = new IRcsService.Stub() {\n // Implement registration methods...\n // See AOSP RCS API for required AIDL interfaces\n };\n\n @Override\n public IBinder onBind(Intent intent) {\n return binder;\n }\n}`,
size: 20,
font: "Courier New",
color: "000000"
})
],
spacing: { after: 200 },
indent: { left: 400 }
}),
new Paragraph({
children: [
new TextRun({
text: "Full source patches, along with a preâcompiled APK, will be included in the bounty deliverable. The implementation handles SMS code interception, Jibe server registration, and token caching, all within the microG sandbox.",
size: 22
})
],
spacing: { after: 300 }
}),
// 4.3 Install and Grant Permissions via Shizuku
new Paragraph({
text: "4.3 Install and Grant Permissions via Shizuku",
heading: HeadingLevel.HEADING_2,
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "After installing the modified microG APK, critical runtime permissions must be granted to the GMS package. A Shizuku shell script automates this process:",
size: 22
})
],
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "Shizuku Helper Script (run via Shizukuâs terminal or its API):",
bold: true,
size: 22
})
],
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: `#!/system/bin/sh\n# Grant essential permissions for RCS\npm grant com.google.android.gms android.permission.READ_SMS\npm grant com.google.android.gms android.permission.RECEIVE_SMS\npm grant com.google.android.gms android.permission.SEND_SMS\npm grant com.google.android.gms android.permission.READ_PHONE_STATE\npm grant com.google.android.gms android.permission.ACCESS_FINE_LOCATION\npm grant com.google.android.gms android.permission.READ_PRIVILEGED_PHONE_STATE\n\n# Set app ops to allow RCS registration\nappops set com.google.android.gms REQUEST_INSTALL_PACKAGES allow\nappops set com.google.android.gms READ_SMS allow\nappops set com.google.android.gms RECEIVE_SMS allow\n\n# Force-start the RCS service\nam startservice -n com.google.android.gms/org.microg.gms.rcs.RcsService`,
size: 20,
font: "Courier New",
color: "000000"
})
],
spacing: { after: 200 },
indent: { left: 400 }
}),
new Paragraph({
children: [
new TextRun({
text: "The script can be executed once after each reboot (or triggered automatically by a Shizuku automation app). After running it, open Google Messages and navigate to Settings â Chat features â RCS should show âConnectedâ within a few minutes.",
size: 22
})
],
spacing: { after: 300 }
}),
// 4.4 Configure Google Messages
new Paragraph({
text: "4.4 Configure Google Messages",
heading: HeadingLevel.HEADING_2,
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "1. Open Google Messages and tap your avatar â Messages settings â RCS chats.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "2. Toggle âEnable RCSâ on. The status should change from âSetting upâŚâ to âConnectedâ.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({
text: "3. If it remains stuck, forceâstop Messages, clear its cache, and run the Shizuku script again, then wait 5â10 minutes for the Jibe registration to propagate.",
size: 22
})
],
bullet: { level: 0 },
spacing: { after: 300 }
}),
// ========== 5. Technical Details ==========
new Paragraph({
text: "5. Technical Details",
heading: HeadingLevel.HEADING_1,
spacing: { before: 400, after: 200 }
}),
new Paragraph({
text: "5.1 AndroidManifest.xml Full Patch",
heading: HeadingLevel.HEADING_2,
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "The complete manifest patch adds two services, custom permissions, and a receiver to handle SMS verification. The full diff is available in the project repository.",
size: 22
})
],
spacing: { after: 300 }
}),
new Paragraph({
text: "5.2 RCS Service Implementation Outline",
heading: HeadingLevel.HEADING_2,
spacing: { after: 200 }
}),
new Paragraph({
children: [
new TextRun({
text: "The RcsService must implement the AIDL interface defined in the Google Play Services RCS module. Key methods include:",
size: 22
})
],
spacing: { after: 100 }
}),
new Paragraph({
children: [
new TextRun({ text: "startSession", bold: true, size: 22 }),
new TextRun({ text: " â Initiates a registration session with Jibe using the deviceâs phone number.", size: 22 })
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({ text: "verifySmsCode", bold: true, size: 22 }),
new TextRun({ text: " â Sends the intercepted 5âdigit code back to Jibe to obtain an auth token.", size: 22 })
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({ text: "getRegistrationState", bold: true, size: 22 }),
new TextRun({ text: " â Returns the current RCS registration status to the client.", size: 22 })
],
bullet: { level: 0 },
spacing: { after: 50 }
}),
new Paragraph({
children: [
new TextRun({ text: "sendMessage / receiveMessage", bold: true, size: 22 }),
new TextRun({ text:
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**System**
Android Version: [e.g. 10]
Custom ROM: [e.g. LineageOS 17.1]
**Additional context**
Add any other context about the problem here.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up â it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the microG source tree and its AndroidManifest.xml, focusing on the proposed org.microg.gms.rcs.RcsService and CarrierService entry points. Verify whether the reported Google Messages RCS failure is reproducible before evaluating the suggested Shizuku and ADB setup. Done would require a validated implementation and working RCS registration on the stated Android setup.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java
- Domain
- mobile
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 15/100