react-native-inappbrowser icon indicating copy to clipboard operation
react-native-inappbrowser copied to clipboard

Namespace in AndroidManifest no longer supported

Open isitcrazythough opened this issue 1 year ago • 14 comments

Which platform(s) does your issue occur on?

Android

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

  • React native: 0.73.2
  • Inappbrowser: 3.7.0
  • gradle distribution used: 8.3-all

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 avatar Jan 30 '24 09:01 isitcrazythough

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 avatar Jan 30 '24 10:01 isitcrazythough

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

isitcrazythough avatar Jan 30 '24 10:01 isitcrazythough

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

abramval avatar Feb 05 '24 05:02 abramval

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
                    }
                }
            }
    }
}

isitcrazythough avatar Feb 05 '24 08:02 isitcrazythough

@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.

rajdeepnanua-okta avatar Feb 29 '24 14:02 rajdeepnanua-okta

any updates?

gabrielnascr avatar Mar 19 '24 17:03 gabrielnascr

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

danielyooo avatar Apr 25 '24 17:04 danielyooo

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")
        }
      }
    }
  }

}

SabriGhazali avatar Aug 08 '24 11:08 SabriGhazali

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

thernandezcolon avatar Aug 09 '24 13:08 thernandezcolon

thanks ,works for me too

rajeevCs avatar Aug 22 '24 08:08 rajeevCs