Estou tentando configurar o processo de assinatura para que a senha do keystore e a senha da chave não sejam armazenadas no build.gradle
arquivo do projeto .
Atualmente, tenho o seguinte no build.gradle
:
android {
...
signingConfigs {
release {
storeFile file("my.keystore")
storePassword "store_password"
keyAlias "my_key_alias"
keyPassword "key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Funciona perfeitamente, mas não devo colocar os valores para storePassword
e keyPassword
no meu repositório. Eu preferiria não colocar storeFile
e keyAlias
lá também.
Existe uma maneira de alterar o build.gradle
arquivo para que ele obtenha senhas de alguma fonte externa (como um arquivo que reside apenas no meu computador)?
E, é claro, o alterado build.gradle
deve ser utilizável em qualquer outro computador (mesmo que o computador não tenha acesso a senhas).
Estou usando o Android Studio e no Mac OS X Maverics, se isso importa.
android
gradle
android-studio
code-signing
Bobrovsky
fonte
fonte
build.gradle
, você terá que ter algo diferentebuild.gradle
, seja isso é um ajuste para variáveis de ambiente (por uma resposta), um arquivo de propriedades (por outra resposta) ou algum outro meio. Se você não deseja ter coisas forabuild.gradle
, então, por definição, todas as informações de assinatura devem estar dentrobuid.gradle
.Respostas:
O bom do Groovy é que você pode misturar livremente o código Java, e é muito fácil ler em um arquivo de chave / valor usando
java.util.Properties
. Talvez exista uma maneira ainda mais fácil de usar o Groovy idiomático, mas o Java ainda é bastante simples.Crie um
keystore.properties
arquivo (neste exemplo, no diretório raiz do seu projeto ao lado desettings.gradle
, embora você possa colocá-lo onde quiser:Adicione isto ao seu
build.gradle
:fonte
storeFile file('AndroidManifest.xml')
) e depois substituí-lo faz com que o processo de assinatura ocorra.Error:(24, 0) Could not find property 'android' on root project 'RootProjectName'
que a linha 24 é a que contém o bloco if. A adiçãoapply plugin: 'com.android.application'
à raiz build.gradle também permite que a construção falhe. O que estou fazendo de errado?Could not get unknown property 'android' for root project
Como alternativa, se você deseja aplicar a resposta de Scott Barta de maneira mais semelhante ao código de classificação gerado automaticamente, você pode criar um
keystore.properties
arquivo na pasta raiz do projeto:e modifique seu código de classificação para:
Você pode armazenar esse arquivo de propriedades na raiz do seu módulo, nesse caso, apenas omitir
rootProject
e também pode modificar esse código para ter vários conjuntos de propriedades para diferentes keystores e aliases de chave.fonte
if ( keystorePropertiesFile.exists() )
garantir que o arquivo estivesse presente antes de tentar obter os atributos e tentar assinar..txt
extensão no final dokeystore.properties
arquivo..txt
extensão nokeystore.properties
arquivo.A maneira mais fácil é criar um
~/.gradle/gradle.properties
arquivo.Então seu
build.gradle
arquivo pode ficar assim:fonte
Depois de ler alguns links:
http://blog.macromates.com/2006/keychain-access-from-shell/ http://www.thoughtworks.com/es/insights/blog/signing-open-source-android-apps-without-disclosing- senhas
Como você está usando o Mac OSX, pode usar o Keychain Access para armazenar suas senhas.
Em seguida, em seus scripts de classificação:
Use assim:
fonte
É assim que eu faço. Usar variáveis de ambiente
fonte
Neither path nor baseDir may be null or empty string. path='null'
É possível pegar qualquer projeto de classificação existente do Android Studio e compilar / assinar a partir da linha de comando sem editar nenhum arquivo. Isso torna muito bom armazenar seu projeto no controle de versão, mantendo suas chaves e senhas separadas e não no seu arquivo build.gradle:
fonte
A resposta aceita usa um arquivo para controlar qual keystore usar para assinar o APK que reside na mesma pasta raiz do projeto. Quando usamos vcs como Git , pode ser uma coisa ruim quando esquecemos de adicionar o arquivo de propriedades à lista de ignorados. Porque divulgaremos nossa senha para o mundo. Os problemas ainda persistem.
Em vez de criar o arquivo de propriedades no mesmo diretório do nosso projeto, devemos fazê-lo fora. Nós saímos usando o arquivo gradle.properties.
Aqui estão os passos:
1. Edite ou crie gradle.properties em seu projeto raiz e adicione o seguinte código, lembre-se de editar o caminho com seu próprio:
2.Crie androidproject.properties em / your / path / e adicione o seguinte código a ele, não esqueça de alterar /your/path/to/android.keystore no caminho do keystore:
3. No módulo de aplicativo build.gradle (não na raiz do projeto build.gradle), adicione o seguinte código, se não existir, ou ajuste-o:
4. Adicione o seguinte código abaixo do código na etapa 3:
Este código procurará a propriedade AndroidProject.signing em gradle.properties na etapa 1 . Se a propriedade for encontrada, ela converterá o valor da propriedade como caminho do arquivo, apontando para androidproject.properties que criamos na etapa 2 . Então, todo o valor da propriedade será usado como configuração de assinatura para o nosso build.gradle.
Agora não precisamos nos preocupar novamente com o risco de expor nossa senha do keystore.
Leia mais em Signing Android apk sem colocar informações do keystore no build.gradle
fonte
Para aqueles que procuram colocar suas credenciais em um arquivo JSON externo e ler que da graduação foi o que eu fiz:
my_project / credentials.json:
my_project / android / app / build.gradle
A razão pela qual escolhi um
.json
tipo de arquivo, e não um.properties
tipo de arquivo (como na resposta aceita), é porque eu também queria armazenar outros dados (outras propriedades personalizadas necessárias) no mesmo arquivo (my_project/credentials.json
) e ainda ter o gradle analise o assinando informações de dentro desse arquivo também.fonte
Esta pergunta recebeu muitas respostas válidas, mas eu queria compartilhar meu código, que pode ser útil para mantenedores de bibliotecas , porque deixa o original
build.gradle
bastante limpo .Eu adiciono uma pasta ao diretório do módulo que eu
gitignore
. Se parece com isso:keystore.jks
esigning.properties
deve ser auto-explicativo. Esigning.gradle
fica assim:E o original
build.gradle
Como você pode ver, você não precisa especificar os buildTypes, se o usuário tiver acesso a um
signing
diretório válido , ele apenas o coloca no módulo e ele pode criar um aplicativo de versão assinado válido, caso contrário, ele funciona para ele como normalmente faria.fonte
apply from
deve vir após oandroid
bloqueioVocê pode solicitar senhas na linha de comando:
Esta resposta apareceu anteriormente: https://stackoverflow.com/a/33765572/3664487
fonte
Minha senha continha um caractere especial cujo cifrão $ e eu tive que escapar disso no arquivo gradle.properties. Depois disso, a assinatura funcionou para mim.
fonte