如何使Android应用程序自动配置使用调试或发布值?

4
我正在开发一个Android应用程序,具体来说是使用Facebook Android SDK的应用程序。在开发模式下,我正在使用一个测试Facebook应用程序,其ID为一个。然而,在发布模式下,该应用程序将与不同ID的第二个Facebook应用程序一起工作。
我想知道大多数Android(或Java可能是足够适合的知识领域)开发人员如何自动构建他们的应用程序以使用调试和发布值。理想的解决方案不涉及手动切换(例如:在构建之前将“public static final DEBUG = false;”切换为“true”)。
6个回答

9

你已经有一段时间没有问了,但我想分享一下我是如何做到的。

像Sebastian所暗示的那样,一个Ant脚本可以为您处理这个更改并生成您所需要的静态常量。您可以配置IntelliJ或Eclipse以使其几乎无缝。

我尝试详细说明了我所采取的不同步骤(在此处),如果有帮助,请告诉我。我知道在发布之前我不必进行任何手动更改,这是一种很好的放心感!


是的!这正是我在寻找的东西!感谢您分享您的解决方案,听起来非常完美。我今晚回家后会尝试一下。 :) - Matt Huggins
链接已经失效了。您能否把您的答案直接贴在这里? - Steve Pomeroy
抱歉,问题已经修复!(很不幸,它太长了无法在此发布) - Romain

6

5

我不建议使用IMEI方法...主要问题是并非所有Android设备都有IMEI。更好的方法是检查用于签署.apk的签名。

// See if we're a debug or a release build
try {
    PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
    if (packageInfo.signatures.length>0) {
        String signature = new String(packageInfo.signatures[0].toByteArray());
        isReleaseBuild = !signature.contains("Android Debug");
    }
} catch (NameNotFoundException e1) {
    e1.printStackTrace();
}

1

我使用了一种稍微平凡一些的方法(如果您仍然对解决方案感兴趣的话)。

在应用程序启动时,我的应用程序会检查存储在 /sdcard/ 中的文本文件是否存在。我拥有的每个应用程序都会寻找一个特定的文件,例如 "applicationdebug.txt"。如果该文件存在,则应用程序进入调试模式,并开始使用日志语句和我的调试 Facebook 密钥等详细信息。

然后,我只需将设备上的文件删除(或重命名),就可以查看应用程序在发布模式下的表现如何。


0

我使用Eclipse在工作区创建了3个项目:

  • ApplicationProject

这是一个库项目 包含所有源代码 在values/refs.xml中我添加了

<bool name="debug_mode">true</bool>
  • ApplicationProjectDEBUG

使用 ApplicationProject 覆盖 AndroidManifest 和其他 xml 文件,使用开发特定的配置 在 values/refs.xml 中添加

<bool name="debug_mode">true</bool>
  • ApplicationProjectPROD

使用 ApplicationProject 覆盖 AndroidManifest 和其他 xml 文件,使用生产环境特定的配置。 在 values/refs.xml 中添加:

<bool name="debug_mode">false</bool>

我签署了这个项目的APK文件,以便放在应用商店上。


0
通常情况下,您只会使用1或2个设备进行调试。因此,您可以根据设备设置DEBUG开关?这样,您就可以简单地使用IMEI。
  1. 在您的项目中添加一个新的Application类,并让它初始化字段(建议将其放在Const类中)。

    在您的应用程序的onCreate方法中,调用Const.setupDebug(getApplicationContext());

  2. 像这样实现setupDebug

    public class Const {

    private static boolean debug = false;
    
    
    public static boolean isDebug() {
        return debug;
    }
    
    
    private static void setDebug(boolean debug) {
        Const.debug = debug;
    }
    
    
    private static String [] DEBUG_DEVICES = new String[] {
            "000000000000000", "gfjdhsgfhjsdg" // add ur devices
    };
    
    
    public static void setupDebug(Context context) {
        Arrays.sort(DEBUG_DEVICES);
    
    
    <pre><code>TelephonyManager mTelephonyMgr = (TelephonyManager)
            context.getSystemService(Context.TELEPHONY_SERVICE);
    String imei = mTelephonyMgr.getDeviceId();
    if (imei == null) imei = "000000000000000";
    
    
    if(Arrays.binarySearch(DEBUG_DEVICES, imei) &gt; -1) {
        setDebug(true);
    }
    

    }

    }

  3. 从常量字段切换到常量方法。

    Const.isDebug()


这是一个不错的开始,但我想知道是否有更好的方法,使得Const.debug值可以成为公共的静态常量,在编译时,任何与调试值匹配/不匹配的内容都会被剔除出代码的编译版本。(参见“死代码消除”:http://en.wikipedia.org/wiki/Dead_code) - Matt Huggins
不据我所知 +:当构建您的应用程序以发布时,您可以简单地编写一个短的Ant脚本来为您完成这些事情。 - Sebastian Roth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接