使用Android Studio如何获得已签名,非调试和zip对齐的APK?

时间:2014-01-02 03:52:09

标签: android android-studio apk android-gradle

使用Android Studio如何获得已签名,非调试和zip对齐的APK?

到目前为止,我可以获得一个已签名的,但它会被拒绝,因为它已在其中进行调试。

我可以获得一个非调试版本的apk但它会被拒绝,因为它不是拉链对齐的。

我可以拉链对齐但是我无法上传它,因为那个没有签名。

编辑:我应该提到我在Windows上。我所看到的大部分内容都是基于Linux的,很难将linux路径与配置路径分开。

Edit2:目前情况暂停。我更新了Android Studio并杀死了所有内容,因为它带有gradle 1.9 dependancies,但没有正确安装gradle 1.9。所以我想我会用gradle 1.9下载完整的安装程序,但是下载链接给了我开始的版本。我知道。我应该知道比更新更好,但考虑到我认为它可能实际上包含修复的问题。

Edit3:问题解决了。我有一个完整的答案打印好准备发布但是我不会让我发布到明天。

4 个答案:

答案 0 :(得分:16)

所有构建都是签名的,甚至是调试版(使用调试密钥签名)。只需将其设置为使用正确的密钥签署发布版本即可。您可以通过“项目结构”对话框设置签名配置,也可以按照Gradle Plugin User Guide

中的说明手动编辑build.gradle文件

设置构建文件后,您可以使用命令

从命令行生成发布APK
./gradlew assembleRelease

在Linux或Mac上,或在Windows上:

gradlew.bat assembleRelease

或在GUI中,您可以通过从Build Variants视图中选择它来生成发布版本:

IDE window showing Build Variants view

构建APK,并使用向导对其进行签名。

答案 1 :(得分:5)

我已经解决了这个问题 第1部分:k3v1n4ud3的链接确实有助于合并信息。谢谢你。 这是我整个build.gradle,位于项目文件夹下:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.6.+'
        }
    }
    apply plugin: 'android'

    repositories {
        mavenCentral()
    }

    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.0"

        signingConfigs {
            debug {
                storeFile file("debug.keystore")
            }

            release {
                storeFile file("D:\\AndroidStudioProjects\\KeyStore\\Keystore_password1.jks")
                storePassword "password"
                keyAlias "MyAppName"
                keyPassword "password"
            }
        }

        productFlavors {
            free {
                packageName "com.mypackage.myappname"
            }

            paid {
                packageName "com.mypackage.myappname"
            }
        }

        buildTypes {
            debug {
                signingConfig signingConfigs.release
            }

            release {
                signingConfig signingConfigs.release
                debuggable false
                zipAlign true
            }

            /*
            alpha {
                packageNameSuffix ".alpha"
            }
            beta {
                packageNameSuffix ".beta"
            }*/
        }


        defaultConfig {
            minSdkVersion 7
            targetSdkVersion 19
        }
    }

    android.applicationVariants.all { variant ->
        if (variant.buildType.name == "release") {
            switch (variant.name) {
                case "FreeRelease":
                    variant.mergeResources.doFirst {
                        android.sourceSets.debug.setRoot("src/free")
                    }
                    break;
                case "PaidDebug":
                    variant.mergeResources.doFirst {
                        android.sourceSets.debug.setRoot("src/paid")
                    }
                    break;
            }
        }
        else if (variant.buildType.name == "debug") {
            switch (variant.name) {
                case "FreeDebug":
                    variant.mergeResources.doFirst {
                        android.sourceSets.debug.setRoot("src/debug/free")
                    }
                    break;
                case "PaidDebug":
                    variant.mergeResources.doFirst {
                        android.sourceSets.debug.setRoot("src/debug/paid")
                    }
                    break;
            }
        }
    }


    dependencies {
        compile 'com.android.support:appcompat-v7:+'
    }

第2部分:我使用了最初使用Build-> Generate Signed APK ...向导时创建的密钥库。注意使用的keyalias。在我的头撞到墙上半天后,我忘记了我输入的内容: - )

第3部分:这个主题帮助我设置源文件夹并理解其风格。 Folder naming convention for gradle build variants

第4部分:只有一个AndroidManifest.xml我无法在包名上使用后缀。使用后缀时,上传到设备时会被拒绝。当build.gradle的每个例子都包含后缀时,这就成了一个问题。

第5部分:使用View->工具Windows-> BuildVariants来调出构建变体。第二列实际上是一个下拉列表。选择你想要在这里构建的内容,否则它将继续构建调试版本。 (为什么它不在构建菜单下或运行/调试配置是一个谜?)

第6部分:未来......我必须尝试解决这些问题以及如何设置它们,因为我最终希望在相同的代码库中部署免费和付费版本。我将开始用自己的密钥签署调试版本。

答案 2 :(得分:4)

可以使用任何现有的Android Studio gradle项目,并从命令行构建/签名,而无需编辑任何文件。这使得将项目存储在版本控制中非常好,同时保持密钥和密码分开,而不是在build.gradle文件中:

./gradlew assembleRelease -Pandroid.injected.signing.store.file=$KEYFILE -Pandroid.injected.signing.store.password=$STORE_PASSWORD -Pandroid.injected.signing.key.alias=$KEY_ALIAS -Pandroid.injected.signing.key.password=$KEY_PASSWORD

答案 3 :(得分:0)

如果您使用的是不同的gradle构建版本而不是您开发密钥库文件,那么它可能会影响。

我在项目中也遇到了这个问题,我做了以下更改:

设置classpath

来自classpath'com.android.tools.build:gradle:2.2.0-alpha3'

classpath'com.android.tools.build:gradle:2.1.2'