build(android): integrate Google Services plugin for Firebase support
Add Google Services Gradle plugin integration to withHuaweiPush.js to enable Firebase initialization alongside Huawei Push. This includes: - Adding google-services classpath dependency for buildscript - Applying com.google.gms.google-services plugin after React plugin - Copying google-services.json to android/app/ for runtime initialization Without these changes, Firebase initialization fails at runtime with "default FirebaseApp is not initialized" when google-services.json is configured in app.json.
This commit is contained in:
@@ -97,6 +97,17 @@ const withHuaweiPush = (config, options = {}) => {
|
||||
);
|
||||
}
|
||||
|
||||
// Google Services plugin classpath — required for Firebase init via google-services.json.
|
||||
if (!contents.includes('com.google.gms:google-services')) {
|
||||
const depsPattern = /(buildscript\s*\{[\s\S]*?dependencies\s*\{[\s\S]*?classpath\(['"]org\.jetbrains\.kotlin:kotlin-gradle-plugin['"]\))/;
|
||||
if (depsPattern.test(config.modResults.contents)) {
|
||||
config.modResults.contents = config.modResults.contents.replace(
|
||||
depsPattern,
|
||||
`$1\n classpath('com.google.gms:google-services:4.4.4')`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!config.modResults.contents.includes('developer.huawei.com/repo')) {
|
||||
const bsRepoPattern = /(buildscript\s*\{[\s\S]*?repositories\s*\{)/;
|
||||
if (bsRepoPattern.test(config.modResults.contents)) {
|
||||
@@ -113,6 +124,22 @@ const withHuaweiPush = (config, options = {}) => {
|
||||
config = withAppBuildGradle(config, (config) => {
|
||||
const contents = config.modResults.contents;
|
||||
|
||||
// Apply Google Services plugin (Firebase) before the Huawei plugin.
|
||||
// The googleServicesFile in app.json only sets up the file copy + plugin
|
||||
// when run through `expo prebuild`, but it does not coexist with this
|
||||
// Huawei plugin reliably, so we apply it explicitly here.
|
||||
if (!contents.includes('com.google.gms.google-services')) {
|
||||
const reactApply = /apply plugin:\s*['"]com\.facebook\.react['"]\s*\n/;
|
||||
if (reactApply.test(contents)) {
|
||||
config.modResults.contents = contents.replace(
|
||||
reactApply,
|
||||
`apply plugin: "com.facebook.react"\napply plugin: 'com.google.gms.google-services'\n`
|
||||
);
|
||||
} else {
|
||||
config.modResults.contents = `apply plugin: 'com.google.gms.google-services'\n` + contents;
|
||||
}
|
||||
}
|
||||
|
||||
if (!contents.includes('com.huawei.agconnect')) {
|
||||
const applyPluginPattern = /apply plugin:\s*['"]com\.google\.gms\.google-services['"]/;
|
||||
if (applyPluginPattern.test(contents)) {
|
||||
@@ -163,6 +190,18 @@ const withHuaweiPush = (config, options = {}) => {
|
||||
console.warn('[withHuaweiPush] agconnect-services.json not found at project root');
|
||||
}
|
||||
|
||||
// Copy google-services.json to android/app/ so the Google Services
|
||||
// Gradle plugin can find it. Without this, FCM / Firebase init fails
|
||||
// at runtime with "default FirebaseApp is not initialized".
|
||||
const gmsSrc = path.join(config.modRequest.projectRoot, 'google-services.json');
|
||||
const gmsDest = path.join(appDir, 'google-services.json');
|
||||
if (fs.existsSync(gmsSrc)) {
|
||||
fs.copyFileSync(gmsSrc, gmsDest);
|
||||
console.log('[withHuaweiPush] copied google-services.json to android/app/');
|
||||
} else {
|
||||
console.warn('[withHuaweiPush] google-services.json not found at project root');
|
||||
}
|
||||
|
||||
// RN 0.85.3 ships Gradle 9.3.1 in its template, but Kotlin 2.1.20 is incompatible
|
||||
// with Gradle 9.x (CompilerEnvironment ClassNotFoundException). Downgrade to 8.14.5.
|
||||
const wrapperFile = path.join(config.modRequest.platformProjectRoot, 'gradle', 'wrapper', 'gradle-wrapper.properties');
|
||||
|
||||
Reference in New Issue
Block a user