我正面临着问题。我需要以两种方式构建一个应用程序,第一个构建用于开发(测试)使用,第二个构建应该是生产版本。有没有办法以编程方式做到这一点? (使用一些构建引擎)我的意思是如果可能的话,两个应用程序同时在一个设备上运行。这两个版本都是来自一个Android项目的APK。
由于
答案 0 :(得分:7)
我个人用这个来判断我是否处于调试模式:
final PackageInfo pinfo = getPackageInfo(ctx);
final boolean debugMode = (pinfo.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
此代码基于debuggable
的{{1}}标记的Application
属性:
如果此属性明确设置为android-manifest.xml
true
,则设置为debugMode
。
但如果它明确地设置为true
或不存在于xml(隐含值)中,则false
将设置为debugMode
。
这样,您无法在同一设备上同时运行这两个应用程序,因为两个APK需要同时安装两个不同的程序包名称。所以你必须构建两个eclipse项目,每个项目都有自己的包名(例如false
和com.example.myapp.debug
),为什么不使用几乎包含的公共库(com.example.myapp
)你的所有代码:
com.example.myapp.common
将com.example.myapp.debug
标记设为debuggable
且true
将com.example.myapp
标记设为debuggable
答案 1 :(得分:1)
据我所知,您确实需要从基本代码创建不同的应用程序。正如我所做的那样,完成这项工作的一种方法是使用Ant脚本将整个项目源复制到另一个目录中,比如“测试”,然后这样做,替换(例如使用复制过滤)XML文件中的某些值,比如来自AndroidManifest.xml。要替换的第一件事是应用程序包,每个应用程序都需要是唯一的。像Activities这样的Java类仍然可以驻留在原始包中,它们在AndroidManifest.xml中的名称只需要是绝对的。复制并过滤源后,您可以使用主build.xml中的Ant的antcall任务来构建自定义应用程序。所以最后,你可以说:“ant -Denv = testing build”,你可以在你的生产版本旁边安装一个APK。
另一种选择是使用Maven,Android插件支持项目覆盖。当然,您可以使用库项目,请参阅:Android – multiple custom versions of the same app。
答案 2 :(得分:0)
我认为最简单的解决方案是使用某种源控制工具来实现此目的。有很多很好的理由使用源代码控制,我相信大多数开发人员已经使用它了。
解决方案总结:
解决方案说明。
我个人与GIT合作,我相信这种方法适用于其他SCM工具,但我没有测试它。
我有2个存储库,一个用于开发,一个用于生产(你可以使用生产分支获得相同的效果,但我更喜欢不同的存储库,因为我不知道我什么时候会有另一个开发人员,而且我不喜欢我想让任何人(包括我)在没有备份的情况下错误地使用代码。
您需要做的就是在每个存储库的清单文件中设置不同的包名称,例如:
生产清单包名称 - com.foo.appName
对于每个活动,需要使用绝对路径而不是相对方法。由于没有真正的选择,您将更改您的包名称,如果您这样做,所有更改都在清单文件中,我认为这种方法几乎没有任何缺点。
然后,每当您将更改从开发人员存储库提取到生产存储库时,清单文件中的这些行应该存在“冲突”,但实际上只会在第一时间发生冲突你拉动代码,然后合并工具知道你喜欢在生产存储库中的哪一行。
使用此方法一段时间后,我发现生成的R文件存在问题。
问题: 正在使用package属性中的Manifest文件中定义的包名生成R文件。然后无法找到对R文件的所有引用(源文件的包名称与清单文件中指定的包名称不同)。
该问题有3个解决方案:
好的: 这个解决方案是最强大的解决方案,我建议你使用它(尽管我自己也没试过)。此解决方案背后的想法是将R文件生成为与清单中所述的类名不同的类名。在清单中,包将是dev.com.foo.appName,但R文件将生成到com.foo.appName。 为实现这一目标,请按照this answer
进行操作糟糕: 不要使用这个解决方案,这真的很糟糕,我在这里说明你可以避免它。在使用R文件的每个文件中,将导入添加到R文件,包名称在清单中。这是一个非常糟糕的解决方案,因为您将输入大量不相关的代码,您需要在生产环境中更改它,并且对于每个新类,您需要记住添加它。
丑陋: 最好不要使用此解决方案,因为它是一种黑客攻击。此解决方案仅适用于资源中没有大量更改的成熟应用程序。当您更改资源时,将再次生成R文件,然后将其生成为清单中的包名称。您需要做的就是将包名称(在清单中)更改为在生产环境中,清理项目,再次构建它,并将包名称更改回开发环境。然后eclipse会询问是否要更改配置而你选择不这样做。这样,将存在2个R文件,一个具有开发包名称,另一个具有生产包。由于在成熟的应用程序中没有太多的资源更改,您将偶尔这样做。您将无法忘记它,因为如果您更改资源,您将开始看到奇怪的错误。
答案 3 :(得分:0)
我知道问题已经很晚了,但我会回答。
您可以使用 Gradle 。
在 build.gradle 文件中,您可以像这样定义单独的buildTypes
:
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
test {
applicationIdSuffix ".test"
versionNameSuffix "t"
debuggable false
}
设置applicationIdSuffix
以便在一台设备上安装测试和发布版本
有关详细信息,请转到http://tools.android.com/tech-docs/new-build-system/user-guide