我面临问题。我需要以两种方式构建一个应用程序,第一种是用于开发(测试)的版本,第二种是生产版。有没有办法以编程方式实现?(使用某些构建引擎)我的意思是,如果可能的话,这两个应用程序都应该在同一设备上同时运行。这两个版本都是来自同一个Android项目的APK。
谢谢
个人而言,我使用这个来确定我是否处于调试模式:
final PackageInfo pinfo = getPackageInfo(ctx);
final boolean debugMode = (pinfo.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
android-manifest.xml
文件中Application
标记的debuggable
属性:
如果将该属性显式设置为true
,则debugMode
将被设置为true
。
但是,如果将其显式设置为false
或在xml中不存在(隐式值),则debugMode
将被设置为false
。
com.example.myapp.debug
和com.example.myapp
)并且可以使用一个公共库(com.example.myapp.common
),其中包含几乎所有代码:
com.example.myapp.debug
的debuggable
标志设置为true
com.example.myapp
的debuggable
标志设置为false
我知道问题有点晚,但我会回答。
您可以使用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
我认为最简单的解决方案是使用某种源代码控制工具来实现。有很多好理由使用源代码控制,我相信大多数开发人员已经在使用它了。
解决方案概述:
解决方案描述:
我个人使用GIT,我相信这种方法也适用于其他源代码管理工具,但我没有测试过。
我有两个代码库,一个是开发用的,一个是发布用的(你也可以使用发布分支来达到相同的效果,但我更喜欢使用不同的代码库,因为我从不知道何时会有其他开发人员加入,我不想给任何人(包括我自己)犯下错误而没有备份代码的机会)。
你只需要在每个代码库的清单文件中设置不同的包名即可,例如:
发布用清单文件的包名 - com.foo.appName
对于每个活动,需要使用绝对路径而不是相对路径。由于您几乎不可能更改软件包名称(如果真的更改了,所有更改都在清单文件中),我认为这种方法几乎没有什么缺点。
然后,每次你从开发代码库拉取代码到发布代码库时,清单文件中这些行应该会发生“冲突”,但实际上只有第一次拉取代码时才会有冲突,之后合并工具会知道你在发布代码库中喜欢哪一行。
使用这种方法一段时间后,我发现生成的 R 文件存在问题。
问题: R 文件的包名是在清单文件中的 package 属性中定义的。然后所有对 R 文件的引用都无法找到(源文件的包名与清单文件中声明的包名不同)。
有三种解决方案:
最佳方案: 这个解决方案是最健壮的,我建议你使用它(虽然我自己没有尝试过)。这个解决方案的思路是将 R 文件生成到一个与清单文件中声明的类名不同的类名中。在清单文件中,包名将是 dev.com.foo.appName,但 R 文件将生成到 com.foo.appName 中。 为了实现这一点,请参考 this answer。
不好的: 不要使用这个解决方案,它真的很糟糕,我在这里声明,你可以避免它。在每个使用 R 文件的文件中,添加与清单中包名称相同的导入到 R 文件中。这是一个非常糟糕的解决方案,因为你将输入大量不相关的代码,你需要在生产环境中进行更改,并且对于每个新类,你都需要记住添加它。
还有更糟的: 最好不要使用这个解决方案,因为它是一种hack。此解决方案仅适用于资源不会经常更改的成熟应用程序。每当更改资源时,R文件将被重新生成,然后生成到清单中的包名称。你所需要做的就是将包名称(在清单中)更改为生产环境中的名称,清理项目,再次构建,并将包名称改回开发环境。然后Eclipse会询问是否更改配置,你选择不更改。这样,将存在两个R文件,一个带有开发包名称,一个带有生产包名称。由于成熟的应用程序中资源变化不多,你只需偶尔这样做一次。你将无法忘记它,因为如果你更改了资源,你将开始看到奇怪的bug。
boolean debuggable = (0 != (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
- Lisandro