欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android开发过程Debug包签名问题

程序员文章站 2022-05-02 15:53:01
...

android安装包签名,是一项重要的安全验证方式,各平台也大量在使用,像微信、QQ等开发SDK,各应用市场上架等等。

但是在接入这些开放开平台时又经常需要调试各种接口,对应的日志输出还是有点蛋痛的,遇到问题,往往没有什么提示。

找问题,很好的办法就是debug,因此签名debug,就在这种场景下经常要用到了,如果使用android studio开发的,倒还是不难。因为gradle很方便得支持debug包指定签名,简单的配置一下就可以了。

如下配置就可以以:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"


    signingConfigs {
        release {
            keyAlias 'xxx'
            keyPassword 'xxxx'
            storeFile file('../release-key.jks')
            storePassword 'xxxx'
        }

        debug {
            keyAlias 'xxxx'
            keyPassword 'xxx'
            storeFile file('../release-key.jks')
            storePassword 'xxx'
        }
    }

 

 

但是如果你在用eclipse开发,那么就痛苦了,eclipse的debug打包需要固定的签名(别名等),一般大家在这些开放平台上肯定都是使用release的签名,自然跟debug签名使用相同的还是少数,尤其是一些历史项目,eclipe设置成release签名debug又不行,当然也可以使用gradle脚本来编,不过项目结构往往不太一样,比较麻烦。

 

另一种打包方式ant的debug包,原生也不支持release签名,当然是说在自己没有修改脚本的情况下。

 

下面就简单贴一个解决方案,用ant debug打包的时候,同样签上我们的release签名。

 

build.xml修改,把android sdk下ant脚本部分target复制出来,修改一下,放到我们自己的项目的脚本中,这样在ant debug打出的包在调试的时候就不会因为签名问题而被拦住了。

 

完整的build.xml如下:

 

 <?xml version="1.0" encoding="UTF-8"?>
<project name="testxx" default="help">

    <!-- The local.properties file is created and updated by the 'android' tool.
         It contains the path to the SDK. It should *NOT* be checked into
         Version Control Systems. -->
    <property file="local.properties" />
	<tstamp>
	    
	    <format property="now" pattern="yyyyMMddHHmm"/>
	</tstamp>
	<target name="testTime">
	    <echo>${now}</echo>
	</target>
    <!-- The ant.properties file can be created by you. It is only edited by the
         'android' tool to add properties to it.
         This is the place to change some Ant specific build properties.
         Here are some properties you may want to change/update:

         source.dir
             The name of the source directory. Default is 'src'.
         out.dir
             The name of the output directory. Default is 'bin'.

         For other overridable properties, look at the beginning of the rules
         files in the SDK, at tools/ant/build.xml

         Properties related to the SDK location or the project target should
         be updated using the 'android' tool with the 'update' action.

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems.

         -->
    <property file="ant.properties" />

    <!-- The project.properties file is created and updated by the 'android'
         tool, as well as ADT.

         This contains project specific properties such as project target, and library
         dependencies. Lower level build properties are stored in ant.properties
         (or in .classpath for Eclipse projects).

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems. -->
    <loadproperties srcFile="project.properties" />

    <!-- quick check on sdk.dir -->
    <fail
            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
            unless="sdk.dir"
    />

    <!--
        Import per project custom build rules if present at the root of the project.
        This is the place to put custom intermediary targets such as:
            -pre-build
            -pre-compile
            -post-compile (This is typically used for code obfuscation.
                           Compiled code location: ${out.classes.absolute.dir}
                           If this is not done in place, override ${out.dex.input.absolute.dir})
            -post-package
            -post-build
            -pre-clean
    -->
    <import file="custom_rules.xml" optional="true" />

    <!-- Import the actual build file.

         To customize existing targets, there are two options:
         - Customize only one target:
             - copy/paste the target into this file, *before* the
               <import> task.
             - customize it to your needs.
         - Customize the whole content of build.xml
             - copy/paste the content of the rules files (minus the top node)
               into this file, replacing the <import> task.
             - customize to your needs.

         ***********************
         ****** IMPORTANT ******
         ***********************
         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
         in order to avoid having your file be overridden by tools such as "android update project"
    -->
    
      <target name="-set-debug-files" depends="-set-mode-check">
        <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-debug-unsigned.apk" />
        <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-debug.apk" />
        <property name="build.is.mode.set" value="true" />
    </target>
    
        <target name="-set-debug-mode" depends="-setup">
        <!-- record the current build target -->
        <property name="build.target" value="debug" />

        <if>
            <condition>
                <and>
                    <istrue value="${project.is.testapp}" />
                    <istrue value="${emma.enabled}" />
                </and>
            </condition>
            <then>
                <property name="build.is.instrumented" value="true" />
            </then>
            <else>
                <property name="build.is.instrumented" value="false" />
            </else>
        </if>
        
        <!-- whether the build is a debug build. always set. -->
        <property name="build.is.packaging.debug" value="true" />

        <!-- signing mode: debug -->
        <property name="build.is.signing.debug" value="false" />

        <!-- Renderscript optimization level: none -->
        <property name="renderscript.opt.level" value="${renderscript.debug.opt.level}" />

    </target>
    
    <target name="-debug-sign" if="has.keystore" >
        <!-- only create apk if *not* a library project -->
        <do-only-if-not-library elseText="Library project: do not create apk..." >
            <sequential>
                <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />

                <!-- Signs the APK -->
                <echo level="info">Signing final apk...</echo>
                <signapk
                        input="${out.packaged.file}"
                        output="${out.unaligned.file}"
                        keystore="${key.store}"
                        storepass="${key.store.password}"
                        alias="${key.alias}"
                        keypass="${key.alias.password}"/>

                <!-- Zip aligns the APK -->
                <zipalign-helper
                        in.package="${out.unaligned.file}"
                        out.package="${out.final.file}" />
                <echo level="info">Release Package: ${out.final.file}</echo>
            </sequential>
        </do-only-if-not-library>
        <record-build-info />
    </target>
     <target name="debug" depends="-set-debug-files, -set-debug-mode, -debug-obfuscation-check, -package, -post-package, -debug-sign, -post-build"
                description="Builds the application and signs it with a debug key.">
    </target>
     
     <target name="-set-release-mode" depends="-set-mode-check">
         
        <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk" />
        <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-release${now}.apk" />
        <property name="build.is.mode.set" value="true" />

        <!-- record the current build target -->
        <property name="build.target" value="release" />

        <property name="build.is.instrumented" value="false" />

        <!-- release mode is only valid if the manifest does not explicitly
             set debuggable to true. default is false. -->
        <xpath input="${manifest.abs.file}" expression="/manifest/application/@android:debuggable"
                output="build.is.packaging.debug" default="false"/>

        <!-- signing mode: release -->
        <property name="build.is.signing.debug" value="false" />

        <!-- Renderscript optimization level: aggressive -->
        <property name="renderscript.opt.level" value="${renderscript.release.opt.level}" />

        <if condition="${build.is.packaging.debug}">
            <then>
                <echo>*************************************************</echo>
                <echo>****  Android Manifest has debuggable=true   ****</echo>
                <echo>**** Doing DEBUG packaging with RELEASE keys ****</echo>
                <echo>*************************************************</echo>
            </then>
            <else>
                <!-- property only set in release mode.
                     Useful for if/unless attributes in target node
                     when using Ant before 1.8 -->
                <property name="build.is.mode.release" value="true"/>
            </else>
        </if>
    </target>
     
    <import file="${sdk.dir}/tools/ant/build.xml" />

</project>