proyecto26 / react-native-inappbrowser

📱InAppBrowser for React Native (Android & iOS) 🤘
https://www.npmjs.com/package/react-native-inappbrowser-reborn
MIT License
1.33k stars 228 forks source link

Namespace in AndroidManifest no longer supported #451

Open isitcrazythough opened 10 months ago

isitcrazythough commented 10 months ago

Which platform(s) does your issue occur on?

Android

Please, provide the following version numbers that your issue occurs with:

Please, tell us how to recreate the issue in as much detail as possible.

Compiling react native android version is impossible due to the following error:

Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported. Recommendation: remove package="com.proyecto26.inappbrowser" from the source AndroidManifest.xml.

Reproduce by having the specified react native and gradle versions and trying to run the app with the inappbrowser module. It seems that specifying the package in the android manifest instead of a build file is deprecated, so compiling apps with newer react native versions is impossible.

isitcrazythough commented 10 months ago

Took a look at the code and it seems to be fixed in develop. Is there a reason why it's not published already, considering that the package did not receive an update for 2 years?

isitcrazythough commented 10 months ago

Guess I'll leave it open until we get an update, considering it's quite critical.

abramval commented 10 months ago

How can I get around this error while there are no fixes?

isitcrazythough commented 10 months ago

I worked around this by forcing the correct namespace for all my dependencies by specifying this in android/build.gradle

subprojects {
    beforeEvaluate {
        project ->
            if (project.hasProperty("android")) {
                android {
                    def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
                    if (namespace == null && agpVersion >= 7) {
                        namespace project.group
                    }
                }
            }
    }
}
rajdeepnanua-okta commented 9 months ago

@jdnichollsc, could you publish a new release? I see that the fix for this has already been merged, and react-native 0.73 is unusable without the fix or a workaround.

gabrielnascr commented 8 months ago

any updates?

danielyooo commented 7 months ago

I do the namespace in the buil.gradle of the app. Just do: namespace = "com.proyecto26.inappbrowser" And remove the line package="com.proyecto26.inappbrowser" in the AndroidManifest

SabriGhazali commented 3 months ago

For me the solution it was a script before the compile to set the namespace in build.gradle and remove the package attribute from AndroidManifest.xml.

Here's the script:


allprojects {
    repositories {

        maven {
            // https://wix.github.io/Detox/docs/introduction/project-setup
            url("$rootDir/../node_modules/detox/Detox-android")
        }

    }
  subprojects {
    afterEvaluate { project ->
      if (project.hasProperty('android')) {
        project.android {
          if (namespace == null || namespace.isEmpty()) {
            def defaultNamespace = project.group.toString().replace('.', '_')
            namespace = defaultNamespace
          }

          buildFeatures {
            buildConfig = true
          }
        }

        // Task to ensure namespace and remove package attribute
        project.tasks.register("fixManifestsAndNamespace") {
          doLast {
            // Ensure namespace in build.gradle
            def buildGradleFile = file("${project.projectDir}/build.gradle")
            if (buildGradleFile.exists()) {
              def buildGradleContent = buildGradleFile.getText('UTF-8')
              def manifestFile = file("${project.projectDir}/src/main/AndroidManifest.xml")
              if (manifestFile.exists()) {
                def manifestContent = manifestFile.getText('UTF-8')
                def packageName = manifestContent.find(/package="([^"]+)"/) { match, p -> p }
                if (packageName && !buildGradleContent.contains("namespace")) {
                  println "Setting namespace in ${buildGradleFile}"
                  buildGradleContent = buildGradleContent.replaceFirst(
                    /android\s*\{/, "android {\n    namespace '${packageName}'"
                  )
                  buildGradleFile.write(buildGradleContent, 'UTF-8')
                }
              }
            }

            // Remove package attribute from AndroidManifest.xml
            def manifests = fileTree(dir: project.projectDir, includes: ['**/AndroidManifest.xml'])
            manifests.each { File manifestFile ->
              def manifestContent = manifestFile.getText('UTF-8')
              if (manifestContent.contains('package=')) {
                println "Removing package attribute from ${manifestFile}"
                manifestContent = manifestContent.replaceAll(/package="[^"]*"/, '')
                manifestFile.write(manifestContent, 'UTF-8')
              }
            }
          }
        }

        // Ensure the task runs before the build process
        project.tasks.matching { it.name.startsWith("preBuild") }.all {
          dependsOn project.tasks.named("fixManifestsAndNamespace")
        }
      }
    }
  }

}
thernandezcolon commented 3 months ago

@SabriGhazali thank you so much for sharing, the subproject did it work for me!

rajeevCs commented 3 months ago

thanks ,works for me too

alexanderdavide commented 1 month ago

@SabriGhazali's solution works but in my case it is important to put the allprojects block at the top with buildscript coming afterwards. Otherwise, the following error appears:

Cannot run Project.afterEvaluate(Closure) when the project is already evaluated.

wbjohnson commented 1 month ago
t.projectDir}/build.gradle")
            if (buildGradleFile.exists()) {
              def buildGradleContent = buildGradleFile.getText('UTF-8')
              def manifestFile = file("${project.projectDir}/src/main/AndroidManifest.xml")
              if (manifestFile.exists()) {
                def manifestContent = manifestFile.getText('UTF-8')
                def packageName = manifestContent.find(/packa

This looks like what I've spent all day looking for! I assume it will work for Manifests in older, unsupported libraries that are declared in the pubspec?