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

使用Android Studio如何获得签名、非调试和zip对齐的APK?,android,android-studio,apk,android-gradle-plugin,Android,Android Studio,Apk,Android Gradle Plugin,使用Android Studio如何获得签名、非调试和zip对齐的APK 到目前为止,我可以得到一个签名的,但它被拒绝,因为它有调试 我可以得到一个非调试版本的apk,但是它被拒绝了,因为它不是zip对齐的 我可以压缩对齐它,但我不能上传它,因为它没有签名 编辑:我应该提到我在windows上。我看到的大部分内容都是基于linux的,很难将linux路径与配置路径分开 Edit2:事情目前暂时搁置。我更新了Android Studio,这扼杀了一切,因为它附带了gradle 1.9依赖项,但没有

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

到目前为止,我可以得到一个签名的,但它被拒绝,因为它有调试

我可以得到一个非调试版本的apk,但是它被拒绝了,因为它不是zip对齐的

我可以压缩对齐它,但我不能上传它,因为它没有签名

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

Edit2:事情目前暂时搁置。我更新了Android Studio,这扼杀了一切,因为它附带了gradle 1.9依赖项,但没有正确安装gradle 1.9。所以我想用Gradle1.9下载完整的安装程序,但下载链接给出了我开始使用的版本。我知道。我应该知道不应该更新,但考虑到问题,我认为它实际上可能包含修复


编辑3:问题解决了。我已经打好了完整的答案,可以发布了,但是我明天才会发布。

所有版本都已签名,甚至调试版本(使用调试密钥签名)。只需将其设置为使用正确的密钥对发布版本进行签名。您可以通过“项目结构”对话框设置签名配置,也可以按照中的说明手动编辑
build.gradle
文件

设置构建文件后,您可以使用以下命令从命令行生成发布APK

./gradlew assembleRelease
在Linux或Mac或Windows上:

gradlew.bat assembleRelease
或者在GUI中,您可以通过从build Variants视图中选择来生成发布版本:

生成APK,并使用向导对其进行签名。

我已经解决了这个问题 第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部分:这个线程帮助我设置了源文件夹并理解了它们的风格

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

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


第六部分:未来。。。我必须尝试和解决的口味,以及如何设置它们,因为我最终想部署一个免费和付费版本的相同的代码基础。我也将开始用我自己的密钥对调试版本进行签名。

可以从命令行获取任何现有的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

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

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

设置类路径

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


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

嗨,也许你可以查看这个链接:希望它能帮助你!zipalign不是核心问题,但这个链接告诉我如何实现自动化。谢谢你。现在剩下的问题是得到一个apk,它没有调试功能,并且已经签名,这样我就可以在上面运行zipalign了。你不需要安装Gradle 1.9。大多数项目使用Gradle包装器,该包装器根据您在包装器属性中设置的分发URL自动下载正确版本的Gradle。@Scott Android studio下载了Gradle 1.9文件,但未正确配置其使用。我删除了整个安装并从头开始重新安装。我现在正在阅读用户指南“当附带的部署不起作用时,从头开始”。。。据我所知,默认情况下生成的唯一构建是使用调试密钥签名的调试构建,这完全没有意义,因为它们只能用于在您自己的设备上进行调试。使用Build->Generate signed APK可以帮助您设置不同的签名,但它会生成一个(可能)已签名的APK,其中包含大量调试信息,这也是无用的。这意味着剩余的核心问题是在不进行调试的情况下设置生成配置。您正在对调试生成进行签名,而不是对发布生成进行签名。我更新了我的答案。问题是没有发布版本选项可供选择。缺少该配置。最后,我发布了我的答案,并加入了我的整个build.gradle,以便其他新手可以看到完整的配置,而不是大多数线程中没有上下文的几个片段。