我可以将我的Android应用程序构建为调试,但使用发布密钥库进行签名

时间:2012-08-22 16:23:42

标签: android ant intellij-idea

我正在尝试在我的应用中测试应用内结算。我在Play商店中设置了计费和产品ID,但为了测试一个事务,我需要使用我的发布密钥库来签署我的应用程序,否则它将失败。

我正在使用IntelliJ Idea(Ver.11 CE),并且无法弄清楚如何配置项目以使用调试集进行构建,并在部署到我的设备之前使用我的发布密钥库进行签名。

我看到我可以为配置设置一个ant目标,我假设这是要走的路,但是因为我的build.xml导入了Android SDK /tools/ant/build.xml,所以没有任何目标。选择。

要调试,我只需要在清单中启用set android:debuggable =“true”吗?任何人都有一个蚂蚁目标的建议,可以做我需要的东西吗?我可以添加到build.xml中吗?

6 个答案:

答案 0 :(得分:2)

指向正确的方向形式Ixx我最终设置android:debuggable =“true”并使用命令行进行构建和部署。然后附加到正在运行的进程进行调试。

我的应用程序设置为在命令行中使用ant build.xml文件构建,该文件导入androidSDK / tools / ant / build.xml和支持的build.properties文件。我发现当我设置android:debuggable =“true”然后执行'ant release'时,构建过程将创建一个可调试的apk并使用释放键对其进行签名。

我在build.xml文件中创建了一个目标,我可以为此案例设置一个名为set-debuggable

的目标
<target name="set-debuggable" description="sets internal named property">
    <echo>Setting internal named property...</echo>
    <property name="set.debuggable" value="true" />
</target>

然后在我的-pre-build目标中添加了

    <if>
        <condition>
            <isset property="set.debuggable"/>
        </condition>
        <then>
            <replaceregexp
                    file="AndroidManifest.xml"
                    match="(android:debuggable=&#34;).*(&#34;)"
                    replace="\1true\2"/>

        </then>
        <else>
            <replaceregexp
                    file="AndroidManifest.xml"
                    match="(android:debuggable=&#34;).*(&#34;)"
                    replace="\1false\2"/>

        </else>
    </if>

这会创建我的debuggable apk,当我使用'ant set-debuggable release'时,我用我的发布密钥签名。然后我使用'adb install -r myApp-release.apk'重新安装新版本。然后,我可以通过应用程序内购买启动并附加到正在运行的应用程序进行调试。

似乎IntelliJ Idea和Eclipse在您的系统上某处使用自签名调试密钥来从IDE构建和部署调试apk。

事后我可能已经能够用我的发布密钥替换IDE创建的调试密钥,并尝试使用该密钥签署构建(并找到使用密钥的密码),但上面的构建过程采取了我很少有时间设置并开始使用。如果有人朝着这个方向前进并开始工作,请在我的回答中添加评论。

答案 1 :(得分:1)

从IntelliJ IDEA 12开始(不了解以前的版本),您可以在Android facet中为顶级模块设置“自定义调试密钥库”。这样,您就可以控制APK的签名方式,并实际使用发布密钥从IDE进行调试。

答案 2 :(得分:0)

我在build.xml中有这个来设置debuggable属性:

<condition property="build.env" value="${build.env}" else="local">
    <isset property="build.env" />
</condition>

<!-- set debuggable=false for release and true for debug and others -->
<condition property="isDebuggable" value="false" else="true">
        <equals arg1="${build.env}" arg2="release" />
    </condition>
    <replaceregexp 
        file="AndroidManifest.xml"
        match="(android:debuggable=&#34;).*(&#34;)" 
        replace="\1${isDebuggable}\2"
        >
    </replaceregexp>

将build.env传递给这样的ant程序(在“release”的情况下):

ant <targets> -Dbuild.env=release

要进行签名,请将其添加到属性文件中:

key.store=C:/path/to/keystore/mykeystore.keystore

Debug app有一个调试密钥库(虽然我目前还不记得为什么需要这个密钥库) - &gt; here有关它的更多信息。可能你只需要使用发布密钥库。

答案 3 :(得分:0)

IntelliJ使用defult的.android / debug.keystore文件来签署应用程序的调试版本。您可以使用发布密钥库更改此文件,或将发布证书导入debug.keystore文件。我在http://www.denizoguz.com/2013/01/12/failure-install_parse_failed_inconsistent_certificates/

准备了一步一步的说明

答案 4 :(得分:0)

鉴于Lint现在建议不要在AndroidManifest.xml中对“android:debuggable”标志进行硬编码,我会提供更好的解决方案(至少在我的情况下)。只需在custom_rules.xml中定义一个新的ant目标,该目标执行与android调试目标完全相同的操作,但也会使用release key对apk进行签名。

<target name="build-debug" depends="-set-debug-files, -do-debug, -release-sign, -post-build" />

需要添加的唯一子任务是“-post-build”之前的“-release-sign”,然后运行“bulid-debug”而不是android“debug”目标。

或者,您可以“发布签名”来调试依赖关系,如下所示:

<target name="build-debug" depends="debug, -release-sign" />

但这对我不起作用,因为我在“-post-build”上做了一些额外的工作,需要在“-post-build”之前签署包。

答案 5 :(得分:-1)

尝试在android清单中将debuggable标志设置为true。

 <application
        android:debuggable="true"

Debuggable Flag