使用Android Studio如何获得已签名,非调试和zip对齐的APK?
到目前为止,我可以获得一个已签名的,但它会被拒绝,因为它已在其中进行调试。
我可以获得一个非调试版本的apk但它会被拒绝,因为它不是拉链对齐的。
我可以拉链对齐但是我无法上传它,因为那个没有签名。
编辑:我应该提到我在Windows上。我所看到的大部分内容都是基于Linux的,很难将linux路径与配置路径分开。
Edit2:目前情况暂停。我更新了Android Studio并杀死了所有内容,因为它带有gradle 1.9 dependancies,但没有正确安装gradle 1.9。所以我想我会用gradle 1.9下载完整的安装程序,但是下载链接给了我开始的版本。我知道。我应该知道比更新更好,但考虑到我认为它可能实际上包含修复的问题。
Edit3:问题解决了。我有一个完整的答案打印好准备发布但是我不会让我发布到明天。
答案 0 :(得分:16)
所有构建都是签名的,甚至是调试版(使用调试密钥签名)。只需将其设置为使用正确的密钥签署发布版本即可。您可以通过“项目结构”对话框设置签名配置,也可以按照Gradle Plugin User Guide
中的说明手动编辑build.gradle
文件
设置构建文件后,您可以使用命令
从命令行生成发布APK./gradlew assembleRelease
在Linux或Mac上,或在Windows上:
gradlew.bat assembleRelease
或在GUI中,您可以通过从Build Variants视图中选择它来生成发布版本:
构建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.1.2'