Java 使用一个APK更改为两个环境

Java 使用一个APK更改为两个环境,java,android,apk,Java,Android,Apk,我们正在开发android应用程序,我们需要分别指出两个不同的环境。让我们说它是登台和生产,但由于法规遵从性要求,我们需要提供一个apk文件,并且应该有一种改变环境的方法 当需要时,这样他们就可以确保相同的文件进入生产,他们在登台测试 我们将url详细信息保存在string.xml中,通常会给出两个指向两个不同环境的APK 所以我们只是想知道是否有任何工具或其他方法可以在apk中更改string.xml值。这样他们就可以用这个工具 在需要时更改url 使用这种方式来分隔URL buildType

我们正在开发android应用程序,我们需要分别指出两个不同的环境。让我们说它是登台和生产,但由于法规遵从性要求,我们需要提供一个apk文件,并且应该有一种改变环境的方法 当需要时,这样他们就可以确保相同的文件进入生产,他们在登台测试

我们将url详细信息保存在string.xml中,通常会给出两个指向两个不同环境的APK

所以我们只是想知道是否有任何工具或其他方法可以在apk中更改string.xml值。这样他们就可以用这个工具
在需要时更改url

使用这种方式来分隔URL

buildTypes {
debug {
    buildConfigField "Boolean", "IS_DEBUG", 'true'
    buildConfigField "String", "URL", 'https://appsgit.com/debugurl'
}

release {
    buildConfigField "Boolean", "IS_DEBUG", 'false'
    buildConfigField "String", "URL", 'https://appsgit.com/releaseurl'
}
}

请查看此以了解更多信息

如果这个解决方案不起作用。您可以尝试Gradle BuildFlavor

添加ProductFlavor,如下所示(免费和付费)

}

然后像这里一样创建代码库


别忘了
Main
是所有口味共享的

因为apk中的strings.xml将被更改,所以它将是两个用于暂存和生产的不同apk(不同的sha256总和)

如果这不是问题,那么您可以在两种不同的环境中使用“flavor”

如果只需要一个apk用于暂存和生产,那么您可以添加某种killswitch。例如,它可能是具有特殊名称的文件。如果设备上存在该文件,则apk使用暂存路径,而apk使用生产方式


希望对您有所帮助。

您应该让用户在运行时选择环境

为此,您应该从共享首选项中读取环境选项


最简单的方法是创建一个对话框,其中有一个复选框来选择是使用生产环境还是临时环境。然后,映射逻辑以在复选框被选中或未选中时使用适当的基本URL。

这里的问题是我们需要生成两个指向调试和发布的APK,但我们只需要发送一个APK解决您的问题?使用共享首选项保存环境并基于此加载。您必须从要使用运行时的环境的用户处获取输入。
productFlavors {
free {
    applicationId "com.appsgit.freeapp"
    buildConfigField 'boolean', 'IS_PAID', 'false'
    buildConfigField 'boolean', 'URL', 'http://freeversion.com'
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "app-free-" + defaultConfig.versionName + ".apk"))
        }
    }
}

paid {
    applicationId "com.appsgit.paidapp"
    buildConfigField 'boolean', 'IS_PAID', 'true'
    buildConfigField 'boolean', 'URL', 'https://paidversion.com'
    versionCode 1
    versionName "1.0"
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "app-paid-" + defaultConfig.versionName + ".apk"))
        }
    }
}