1. Dois modos e configuração de assinatura do Android Studio
modo de depuração
O modo de depuração usa um debug.keystore padrão para assinatura.
Esta assinatura padrão (keystore) não requer uma senha. Seu local padrão é C: \ Users \ <username> \. Android \ debug.keystore, se não existir, o Android Studio irá criá-la automaticamente.
Por exemplo, meu debug.keystore está em C: \ Users \ Administrator \ .android \ debug.keystore.
modo de liberação
Você não pode usar debug.keystore quando lançarmos oficialmente o projeto. Durante o processo de desenvolvimento, também podemos usar o modo de liberação para executar. Pode ser definido da seguinte forma:
BuildVariants-Build Variant-debug / release
Se o projeto precisar subdividir as versões de desenvolvimento dev e produção pro, cada versão contém modos de depuração e liberação, você pode defini-la assim:
É subdividido em quatro modos:
O modo de liberação precisa ser configurado com uma assinatura para ser executado, então um keystore é necessário
Caso contrário, você precisa criá-lo. Se você já criou um armazenamento de chaves, pule esta etapa
1. Crie um keystore e gere nosso apk (empacotado)
A primeira etapa: Construir --- >> Gerar APK assinado
Etapa 2: Criar Novo ··· ( Escolha Escolher existente ··· para o keystore que foi criado )
Etapa 3: preencha as informações relevantes
Definir caminho de armazenamento de chaves, senha, definir chave: alias, senha, período de validade, certificado, etc.
Caminho de armazenamento de chaves: caminho de armazenamento
Chave
Alias: alias
Validade (anos): período de validade (geralmente padrão 25 anos)
Certificado: Certificado
Nome e Sobrenome : 姓名
Unidade Organizacional: Unidade Organizacional
Organização: Organização
Cidade ou localidade: cidade ou região
Estado ou Província: Estado ou Província
Código do país (XX): Código do país (XX), China: 86
Etapa 4: insira a chave e a senha do keystore
Etapa 5: selecione o caminho para lançar o aplicativo, o método de lançamento pode ser selecionado por padrão
OK, o lançamento foi bem sucedido, você pode encontrar o apk lançado na pasta de destino que acabou de definir
Para algumas pessoas, isso é muito complicado. Você deve inserir informações relevantes sempre e fazer escolhas. Existe uma maneira mais simples e rápida? A resposta é sim.
Podemos configurar a assinatura em build.gradle no diretório do aplicativo do projeto.
2. Configure o armazenamento de chaves no modo de liberação
Assinatura da estrutura do projeto, insira as informações do keystore criado
Os tipos de construção precisam ser configurados para que a assinatura tenha efeito
Clique em OK e verifique se o arquivo de configuração correspondente a build.gradle deve ter esta aparência. Claro, você também pode escrever o parágrafo a seguir diretamente no build.gradle.
1 SignatureConfigs { 2 release { 3 keyAlias'androiddebugkey ' 4 keyPassword'android' 5 storeFile file ('C: /Users/ssc/.android/debug.keystore') 6 storePassword'android ' 7} 8} 9 10 ··· ······ 11 12 buildTypes { 13 release { // Se deve ser confundido 14 minifyEnabled false // Se deve remover recursos inúteis 15 zipAlignEnabled true // Arquivo de configuração confuso 16 proguardFiles getDefaultProguardFile ('proguard-android.txt'), ' proguard-rules.pro ' 17 assinaturaConfig assinaturaConfigs.release 18} 19}
Embora a configuração acima seja simples, ela é insegura. Se o seu projeto for de código aberto e você escrever informações como a senha de configuração do arquivo de assinatura no build.gradle em texto simples, é muito inseguro?
Você pode escrever informações como a senha de configuração do arquivo de assinatura diretamente em local.properties, porque no projeto de controle de versão Git , podemos ver que existe um arquivo .gitignore no diretório raiz do nosso modo de projeto. A configuração dentro é mais ou menos como segue
Podemos ver /local.properties, o que significa que local.properties não é adicionado ao controle de versão por padrão, porque local.properties armazena algumas informações relevantes sobre os recursos de nosso ambiente, como o caminho do SDK. Portanto, podemos configurar as informações de assinatura em local.properties sem nos preocupar com vazamento de chave. Para projetos de código aberto, é muito bom.
Adicione informações relevantes diretamente em local.properties
No build.gradle, para não exibir em texto simples, devemos primeiro obter a configuração relevante da chave, para que possamos no build.gradle do aplicativo
Adicionar código no Android {}
1 def keystoreFilepath = '' 2 def keystorePSW = '' 3 def keystoreAlias = '' 4 def keystoreAliasPSW = '' 5 // arquivo keystore padrão, caminho do arquivo de configuração PLZ em local.properties 6 def keyfile = file ('s.keystore. temp ') 7 8 Propriedades properties = new Properties () 9 // arquivo local.properties no diretório raiz 10 properties.load (project.rootProject.file (' local.properties '). newDataInputStream ()) 11 keystoreFilepath = properties. getProperty ("keystore.path") 12 13 if (keystoreFilepath) { 14 keystorePSW = properties.getProperty ("keystore.password") 15 keystoreAlias = properties.getProperty ("keystore.de outros ") 16 keystoreAliasPSW = properties.getProperty ("keystore.alias_password") 17 keyfile = arquivo (keystoreFilepath) 18}
Ver código
A assinaturaConfigs em app / build.gradle pode ser alterada para:
1 2 3 4 5 6 7 8 |
|
Não há necessidade de se preocupar com o valor do keystore na assinatura após a configuração
Da mesma forma, buildTypes também podem ser configurados assim
1 buildTypes { 2 release { 3 minifyEnabled false 4 proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' 5 // subscriptionConfig eatingConfigs.release 6 // 签名 文件 存在 , 则 签名 7 if (keyfile. existe ()) { 8 println ("WITH -> buildTypes -> release: using jks key") 9 signatureConfig eatingConfigs.release 10} else { 11 println ("WITH -> buildTypes -> release: using default key") 12} 13 23} 24}
Neste ponto, a configuração anterior está concluída.
Anexo: consulte as informações relevantes do armazenamento de chaves, como visualizar o valor de sha1; você pode localizar o caminho onde o armazenamento de chaves está localizado na janela de execução e executar cd C: \ Usuários \ ssc \ .android
Depois de executar essa instrução, todas as informações da chave podem ser exibidas (pegue o armazenamento de chaves padrão do Android como exemplo)
keytool -list -v -keystore xxx.jks
Se você quiser configurar os modos de liberação e depuração de maneira uniforme, use o keystore lançado oficialmente
android { SignConfigs { config { keyAlias 'myalias' keyPassword 'mypswd' storeFile file ("./ keystore / ***. jks") storePassword '******' } } buildTypes { release { debuggable false minifyEnabled true //启用 Proguard shrinkResources true // 是否 清理 无用 资源, 依赖 于 minifyEnabled useProguard true subscriptionConfig eatingConfigs.config proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable verdadeira minifyEnabled true // Ativar Proguard shrinkResources true // Se deve limpar os recursos inúteis, depende minifyEnabled useProguard verdadeira signingConfig signingConfigs.config proguardFiles getDefaultProguardFile ( 'proguard-android.txt'), 'proguard-rules.pro' } }
2. Embalagem multicanal
O papel da embalagem multicanal: apk - publique no mercado (o canal é onde você pode baixar o apk)
1.0: apk publicado em diferentes canais, marcando diferentes canais, o objetivo é contar o volume de download, taxa de retenção e outros dados do canal
2.0: Compreenda os downloads
3.0: Publicidade direcionada
Se você não empacota em vários canais, e um pacote apk é colocado em dezenas de mercados, como você sabe qual mercado tem o maior volume de download - multicanal é principalmente para operação
Vamos falar sobre vários métodos de empacotamento multicanal.
O primeiro tipo: embalagem multicanal Youmeng
Como líder da plataforma de três partidos, Youmeng tem muitas rodas excelentes. O Youmeng Statistics pode detectar os canais de download de APK, fazer estatísticas e investir em seus próximos passos com base em excelentes canais.
Não há muito a dizer, basta ir ao código:
1. Primeiro, adicione AndroidManifest:
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"
2. Em seguida, adicione-o em build.gradle, baidu {} é a abreviatura do nome do canal especificado:
productFlavors {
baidu {}
xiaomi {}
qihu360 {}
yingyongbao {}
huawei {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
3. Adicione o número da versão por trás do APK:
Versão do Android Studio 2.3:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "driver_${variant.productFlavors[0].name}_v${defaultConfig.versionName}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
Versão do Android Studio 3.0:
flavorDimensions 'api' productFlavors {
... }
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "driver_${variant.productFlavors[0].name}_v${variant.versionName}.apk"
}
}
4. Em seguida, adicionarei um método para obter o número do canal na interface de introdução do APP pela primeira vez e carregá-lo nos parâmetros.
private String getChannel() {
try {
PackageManager pm = getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("UMENG_CHANNEL");
} catch (PackageManager.NameNotFoundException ignored) {
}
return "";
}
5. Faça as malas e fique online:
imagem
Desvantagens: Obviamente, as desvantagens são incômodas e nojentas.
O segundo tipo: embalagem multicanal Meituan Walle
Depois que o Android 7.0 lançou o novo esquema de assinatura do aplicativo APK Signature Scheme v2, o método anterior de geração rápida de pacotes de canais não funcionava mais. Então, lançou a ferramenta de pacote de canal mais recente Walle ( endereço do artigo )
A ferramenta de geração de pacotes de canais de nova geração é totalmente baseada no formato de arquivo ZIP e formato de armazenamento APK Signing Block. É processado com base no fluxo binário do arquivo. Tem boa velocidade de processamento e compatibilidade e pode atender aos requisitos de diferentes idiomas A ferramenta consiste principalmente em quatro partes:
1. Biblioteca de classe Java para escrever informações de valor de ID
2. O plugin de compilação do Gradle é usado para integração com o processo de empacotamento do Android
3. Biblioteca de classe Java para ler informações de valor de ID
4. AAR usado para ler as informações do canal para com.android.application
Dessa forma, você só precisa copiar um APK para cada pacote de canal e, em seguida, adicionar um valor de ID ao APK. Este método de empacotamento é muito rápido e leva apenas mais de 100 milissegundos para um pacote APK de 30M (incluindo o arquivo tempo de cópia) Pode gerar um pacote de canal e leva apenas alguns milissegundos para obter informações do canal em tempo de execução.
Operação basica:
1、配置根build.gradle:
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.6'
}
}
2. Configure o App build.gradle:
applyplugin:'walle'
dependencies {
compile'com.meituan.android.walle:library:1.1.6'
}
3. Configure o plug-in
walle {
//指定渠道包的输出路径
apkOutputFolder=newFile("${project.buildDir}/outputs/channels");
//定制渠道包的APK的文件名称
apkFileNameFormat='${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
//渠道配置文件
channelFile=newFile("${project.getProjectDir()}/channel")}
Explicação específica dos itens de configuração:
apkOutputFolder: especifique o caminho de saída do pacote do canal, o valor padrão é new File ("$ {project.buildDir} / outputs / apk")
apkFileNameFormat: O nome do arquivo do APK do pacote de canal personalizado, o valor padrão é '$ {appName} - $ {buildType} - $ {channel} .apk'
As seguintes variáveis podem ser usadas:
projectName - 项目名字
appName - App模块名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名称 (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
flavorName - 编译构建 productFlavors 名
channelFile:包含渠道配置信息的文件路径。 具体内容格式详见:[渠道配置文件示例](https://github.com/Meituan-Dianping/walle/blob/master/app/channel),支持使用#号添加注释。
4. Obtenha informações do canal:
Stringchannel=WalleChannelReader.getChannel(this.getApplicationContext());
5. Gerar pacote de canal:
Digite na linha de comando do Terminal:
./gradlew clean assembleReleaseChannels
Algumas contas em execução são escritas, a melhor postagem do blog é o documento oficial
Por favor, veja o documento oficial para detalhes
O terceiro tipo: VasDolly multicanal de código aberto Tencent
Para obter detalhes, consulte o Blog da Boutique Hongyang Great God
Quarto: ferramenta de embalagem de três partes (recomendado)
Link: https://pan.baidu.com/s/1dTsq7cZq8kqFbql-KhutuQ Senha: 3zu7
Instruções:
1. Copie o APK a ser empacotado no diretório raiz
2. Adicione ou modifique a lista de canais no arquivo de canais
3. Execute o arquivo publish.exe
Configurações de código:
compile 'com.meituan.android.walle:library:1.0.5'
ChannelInfo channelInfo = WalleChannelReader.getChannelInfo(getApplicationContext());
String channelName = channelInfo.getChannel(); (渠道名称)
Map<String, String> extraInfo = channelInfo.getExtraInfo(); (额外信息)
Muito rápido, simples e conveniente, me apaixonei por embalagens
Existem muitos métodos de empacotamento, mas são todos iguais. É importante compreender os princípios. Vale a pena aprender e refletir sobre um entendimento profundo da assinatura do Android e do formato de arquivo ZIP.
Três, configuração unificada do Gradle
Aqui, observamos a diferença entre
build.gradle no diretório do aplicativo: build.gradle no diretório do aplicativo é: apply plugin: com.android.application
O build.gradle na biblioteca de módulos é: apply plugin: com.android.library
A outra é que a versão é diferente e os elementos são os mesmos. Aqui está o que vamos apresentar hoje. Aqui, vemos que a versão compilada do SDK, a versão compilada das ferramentas e a versão mínima que suporta o SDK têm versões diferentes números. Mesmo, aqui precisamos unificar, e nem sempre podemos configurar manualmente todas as vezes, é fácil cometer erros quando o Módulo aumenta
Solução:
Método 1: Execute a configuração unificada em build.gradle no diretório raiz do projeto da seguinte maneira
-
/*在根目录中配置公用供子模块调用*/
-
ext {
-
//Android
-
compileSdkVersion = 25
-
buildToolsVersion = "25.0.2"
-
minSdkVersion = 15
-
targetSdkVersion = 25
-
//Version
-
supportLibrary = "25.1.0"
-
//supportLibraries dependencies
-
supportDependencies = [
-
supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
-
]
-
}
O build.gradle do diretório raiz do projeto após a configuração:
-
//构建脚本
-
buildscript {
-
repositories {
-
//依赖的仓库
-
jcenter()
-
}
-
dependencies {
-
//项目依赖的Gradle版本
-
classpath 'com.android.tools.build:gradle:2.2.3'
-
// NOTE: Do not place your application dependencies here; they belong
-
// in the individual module build.gradle files
-
}
-
}
-
allprojects {
-
repositories {
-
jcenter()
-
}
-
}
-
task clean(type: Delete) {
-
delete rootProject.buildDir
-
}
-
/*在根目录中配置公用供子模块调用*/
-
ext {
-
//Android
-
compileSdkVersion = 25
-
buildToolsVersion = "25.0.2"
-
minSdkVersion = 15
-
targetSdkVersion = 25
-
//Version
-
supportLibrary = "25.1.0"
-
//supportLibraries dependencies
-
supportDependencies = [
-
supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
-
]
-
}
Em seguida, chamamos o build.gradle do aplicativo da seguinte maneira:
-
apply plugin: 'com.android.application'
-
android {
-
compileSdkVersion rootProject.ext.compileSdkVersion
-
buildToolsVersion rootProject.ext.buildToolsVersion
-
defaultConfig {
-
applicationId "com.example.qiudengjiao.activitytest"
-
minSdkVersion rootProject.ext.minSdkVersion
-
targetSdkVersion rootProject.ext.targetSdkVersion
-
versionCode 1
-
versionName "1.0"
-
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
}
-
buildTypes {
-
release {
-
minifyEnabled false
-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-
}
-
}
-
}
-
dependencies {
-
compile fileTree(include: ['*.jar'], dir: 'libs')
-
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
-
exclude group: 'com.android.support', module: 'support-annotations'
-
})
-
compile 'junit:junit:4.12'
-
compile rootProject.ext.supportDependencies.supportAppcompat
-
}
A chamada é feita no build.gradle do Module da seguinte maneira:
-
apply plugin: 'com.android.library'
-
android {
-
compileSdkVersion rootProject.ext.compileSdkVersion
-
buildToolsVersion rootProject.ext.buildToolsVersion
-
defaultConfig {
-
minSdkVersion rootProject.ext.minSdkVersion
-
targetSdkVersion rootProject.ext.targetSdkVersion
-
versionCode 1
-
versionName "1.0"
-
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
}
-
buildTypes {
-
release {
-
minifyEnabled false
-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-
}
-
}
-
}
-
dependencies {
-
compile fileTree(dir: 'libs', include: ['*.jar'])
-
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
-
exclude group: 'com.android.support', module: 'support-annotations'
-
})
-
testCompile 'junit:junit:4.12'
-
compile rootProject.ext.supportDependencies.supportAppcompat
-
}
Desta forma, concluímos o uso do Gradle para resolver a configuração unificada do build.gradle no aplicativo no projeto e a dependência build.gradle no Módulo do projeto. Por analogia, mais Módulos são configurados no mesmo forma. Só precisamos mudar a versão no futuro. Vá para o diretório raiz build.gradle e modifique-o
Método Dois
Como todos têm seus próprios hábitos de configuração, aqui fornecemos outra configuração para sua referência. Aqui, criamos config.gradle no diretório raiz do projeto principal para configurar as informações de configuração necessárias da seguinte maneira:
Informações de configuração em config.gradle:
-
/**
-
* 在主项目的根目录下创建config.gradle文件
-
* 在这里单独处理统一依赖问题
-
* 注意需要在根目录的build.gradle中进行引入
-
*/
-
ext {
-
android = [
-
compileSdkVersion: 25,
-
buildToolsVersion: "25.0.2",
-
minSdkVersion : 15,
-
targetSdkVersion : 25
-
]
-
//Version
-
supportLibrary = "25.1.0"
-
//supportLibraries dependencies
-
supportDependencies = [
-
supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
-
supportV4 : "com.android.support:support-v4:${supportLibrary}",
-
suppoutDesign : "com.android.support:design:${supportLibrary}"
-
]
-
}
Em seguida, precisamos importar config.gradle no build.gradle do diretório raiz e prestar atenção especial aqui à introdução de build.gradle no diretório raiz
apply from: "config.gradle"
O diretório raiz importado build.gradle é o seguinte:
A seguir, podemos apresentá-lo e usá-lo no Módulo, da seguinte maneira:
-
apply plugin: 'com.android.library'
-
//android配置
-
def config = rootProject.ext.android
-
//相关库依赖
-
def librarys = rootProject.ext.supportDependencies
-
android {
-
compileSdkVersion config.compileSdkVersion
-
buildToolsVersion config.buildToolsVersion
-
defaultConfig {
-
minSdkVersion config.minSdkVersion
-
targetSdkVersion config.targetSdkVersion
-
versionCode 1
-
versionName "1.0"
-
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
}
-
buildTypes {
-
release {
-
minifyEnabled false
-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-
}
-
}
-
}
-
dependencies {
-
compile fileTree(dir: 'libs', include: ['*.jar'])
-
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
-
exclude group: 'com.android.support', module: 'support-annotations'
-
})
-
testCompile 'junit:junit:4.12'
-
//在这里使用库的依赖
-
compile librarys.supportAppcompat
-
compile librarys.supportV4
-
compile librarys.suppoutDesign
-
}
Neste ponto, apresentamos com sucesso o build.gradle do Módulo. A introdução de cada Módulo será assim. Ele desempenha a mesma função do Método 1. Pessoalmente, acho que o segundo método é melhor. Você pode escolhê-lo sozinho Afinal, cada um tem seus próprios méritos, ok, aqui vou compartilhar com vocês o uso de dependências de configuração unificada do Gradle no projeto, espero que seja útil para todos
Quatro, ferramenta de plug-in do Android Studio
Plug-ins recomendados para melhorar a eficiência do desenvolvimento
1 、 GsonFormat
2 、 Butterknife / Gerador de código Android
3 、 Gerar seletores Android
Nota: Ao mesmo tempo, não é adequado instalar muitos plug-ins para evitar o consumo excessivo de memória e causar atraso.
Cinco, ferramentas de inspeção de código e análise de desempenho
1. Ferramenta de inspeção de código - Android Lint
2. Ferramenta de análise de desempenho - Monitor