1. Dos modos y configuración de firma de Android Studio
modo de depuración
El modo de depuración utiliza un debug.keystore predeterminado para firmar.
Esta firma predeterminada (almacén de claves) no requiere contraseña. Su ubicación predeterminada es C: \ Users \ <nombre de usuario> \. Android \ debug.keystore, si no existe, Android Studio la creará automáticamente.
Por ejemplo, mi debug.keystore está en C: \ Users \ Administrator \ .android \ debug.keystore.
modo de liberación
No puede usar debug.keystore cuando lanzamos oficialmente el proyecto. Durante el proceso de desarrollo, también podemos usar el modo de lanzamiento para ejecutar. Se puede configurar de la siguiente manera:
BuildVariants-Build Variant-debug / release
Si el proyecto necesita subdividir las versiones de desarrollo y producción profesional, cada versión contiene modos de depuración y lanzamiento, puede configurarlo así:
Se subdivide en cuatro modos:
El modo de lanzamiento debe configurarse con una firma para ejecutarse, luego se necesita un almacén de claves
De lo contrario, debe crearlo. Si ya ha creado un almacén de claves, omita este paso.
1. Cree un almacén de claves y genere nuestro apk (empaquetado)
El primer paso: compilar --- >> Generar APK firmado
Paso 2: Crear nuevo ··· ( Elija Elegir existente ··· para el almacén de claves que se ha creado )
Paso 3: Complete la información relevante
Establezca la ruta del almacén de claves, la contraseña, la clave establecida: alias, contraseña, período de validez, certificado, etc.
Ruta del almacén de claves: ruta de almacenamiento
Llave
Alias: alias
Validez (años): período de validez (generalmente por defecto 25 años)
Certificado: Certificado
Nombre y apellido: 姓名
Unidad organizativa: Unidad organizativa
Organización: Organización
Ciudad o localidad: Ciudad o región
Estado o provincia: Estado o provincia
Código de país (XX): Código de país (XX), China: 86
Paso 4: Ingrese la clave, contraseña del almacén de claves
Paso 5: seleccione la ruta para lanzar la aplicación, el método de lanzamiento se puede seleccionar de forma predeterminada
OK, el lanzamiento es exitoso, puede encontrar el apk publicado en la carpeta de destino que acaba de configurar
Para algunas personas, esto es demasiado engorroso. Tienes que ingresar información relevante cada vez y tomar decisiones. ¿Existe una manera más simple y rápida? La respuesta es sí.
Podemos configurar la firma en build.gradle en el directorio de aplicaciones del proyecto.
2. Configurar el almacén de claves en modo de liberación
Firma de la estructura del proyecto, ingrese la información del almacén de claves creado
Los tipos de compilación deben configurarse para que la firma surta efecto
Haga clic en Aceptar y luego verifique que el archivo de configuración correspondiente a build.gradle debería verse así. Por supuesto, también puede escribir el siguiente párrafo directamente en build.gradle.
1 signingConfigs { 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 { // Si confundir 14 minifyEnabled false // Si eliminar recursos inútiles 15 zipAlignEnabled true // Archivo de configuración confuso 16 proguardFiles getDefaultProguardFile ('proguard-android.txt'), ' proguard-rules.pro ' 17 signingConfig signingConfigs.release 18} 19}
Aunque la configuración anterior es simple, es insegura. Si su proyecto es de código abierto y escribe información como la contraseña de configuración del archivo de firma en build.gradle en texto plano, ¿es muy inseguro?
Puede escribir información como la contraseña de configuración del archivo de firma directamente en local.properties, porque en el proyecto de control de versiones de Git , podemos ver que hay un archivo .gitignore en el directorio raíz de nuestro modo de proyecto. La configuración interna es aproximadamente como sigue
Podemos ver /local.properties, lo que significa que local.properties no se agrega al control de versiones de forma predeterminada, porque local.properties almacena información relevante sobre los recursos de nuestro entorno, como la ruta del SDK. Por lo tanto, podemos configurar la información de la firma en local.properties sin preocuparnos por la fuga de claves. Para proyectos de código abierto, es muy bueno.
Agregue información relevante directamente debajo de local.properties
En build.gradle, para que no se muestre en texto plano, primero debemos obtener la configuración relevante de la clave, para que podamos en la aplicación build.gradle
Agregar código en Android {}
1 def keystoreFilepath = '' 2 def keystorePSW = '' 3 def keystoreAlias = '' 4 def keystoreAliasPSW = '' 5 // archivo de almacén de claves predeterminado, ruta del archivo de configuración PLZ en local.properties 6 def keyfile = file ('s.keystore. temp ') 7 8 Propiedades properties = new Properties () 9 // Archivo local.properties en el director raíz 10 properties.load (project.rootProject.file (' local.properties '). newDataInputStream ()) 11 keystoreFilepath = propiedades. getProperty ("keystore.path") 12 13 if (keystoreFilepath) { 14 keystorePSW = properties.getProperty ("keystore.password") 15 keystoreAlias = properties.getProperty ("keystore.otro ") 16 keystoreAliasPSW = properties.getProperty ("keystore.alias_password") 17 keyfile = file (keystoreFilepath) 18}
Ver código
El signingConfigs en app / build.gradle se puede cambiar a:
1 2 3 4 5 6 7 8 |
|
No es necesario preocuparse por el valor del almacén de claves en la firma después de la configuración
En consecuencia, buildTypes también se puede configurar así
1 buildTypes { 2 release { 3 minifyEnabled false 4 proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' 5 // signingConfig signingConfigs.release 6 // 签名 文件 存在 , 则 签名 7 if (keyfile. existe ()) { 8 println ("CON -> buildTypes -> lanzamiento: usando la clave jks") 9 signingConfig signingConfigs.release 10} else { 11 println ("CON -> buildTypes -> lanzamiento: usando la clave predeterminada") 12} 13 23} 24}
En este punto, la configuración anterior está completa.
Adjunto: consulte la información relevante del almacén de claves, como ver el valor de sha1; puede ubicar la ruta donde se encuentra el almacén de claves en la ventana de ejecución y ejecutar cd C: \ Users \ ssc \ .android
Después de ejecutar esta declaración, se puede mostrar toda la información de la clave (tome el almacén de claves predeterminado de Android como ejemplo)
keytool -list -v -keystore xxx.jks
Si desea configurar los modos de liberación y depuración de manera uniforme, use el almacén de claves lanzado oficialmente
android { signingConfigs { config { keyAlias 'myalias' keyPassword 'mypswd' storeFile file ("./ keystore / ***. jks") storePassword '******' } } buildTypes { release { debuggable false minifyEnabled true //启用 Proguard shrinkResources true // 是否 清理 无用 资源, 依赖 于 minifyEnabled useProguard true signingConfig signingConfigs.config proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true minifyEnabled true // Habilita Proguard shrinkResources true // Ya sea para limpiar recursos inútiles, depende de minify Habilitado useProguard true signingConfig signingConfigs.config proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } }
2. Embalaje multicanal
El papel del empaque multicanal: apk - publicar en el mercado (el canal es donde puede descargar el apk)
1.0: apk publicado en diferentes canales, marcando diferentes canales, el propósito es contar el volumen de descarga, tasa de retención y otros datos del canal
2.0: comprender las descargas
3.0: publicidad dirigida
Si no empaqueta en varios canales y un paquete apk se coloca en docenas de mercados, ¿cómo puede saber qué mercado tiene el mayor volumen de descarga? El multicanal es principalmente para operaciones.
Hablemos de varios métodos de empaquetado multicanal.
El primer tipo: embalaje multicanal de Youmeng
Como líder de la plataforma tripartita, Youmeng tiene muchas ruedas excelentes. Youmeng Statistics puede detectar los canales de descarga de APK, hacer estadísticas e invertir en sus próximos pasos basados en excelentes canales.
No hay mucho que decir, solo ve al código:
1. Primero, agregue AndroidManifest:
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"
2. A continuación, agréguelo en build.gradle, baidu {} es la abreviatura del nombre del canal especificado:
productFlavors {
baidu {}
xiaomi {}
qihu360 {}
yingyongbao {}
huawei {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
3. Agregue el número de versión detrás del APK:
Versión de 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)
}
}
}
Versión de 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. A continuación, agregaré un método para obtener el número de canal en la interfaz de introducción de la APLICACIÓN por primera vez y lo cargaré a los 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. Empaque y conéctese en línea:
imagen
Desventajas: obviamente, las desventajas son engorrosas y repugnantes.
El segundo tipo: embalaje multicanal Meituan Walle
Después de que Android 7.0 lanzara el nuevo esquema de firmas de aplicaciones APK Signature Scheme v2, el método anterior de generar rápidamente paquetes de canales dejó de funcionar. Así que lanzó la última herramienta de paquete de canales Walle ( dirección del artículo )
La herramienta de generación de paquetes de canales de nueva generación se basa completamente en el formato de archivo ZIP y el formato de almacenamiento APK Signing Block. Se procesa en base al flujo binario del archivo. Tiene buena velocidad de procesamiento y compatibilidad y puede cumplir con los requisitos de diferentes idiomas. La herramienta principalmente Hay cuatro partes:
1. Biblioteca de clases Java para escribir información de valor de ID
2. El complemento de compilación de Gradle se utiliza para integrarse con el proceso de empaquetado de Android
3. Biblioteca de clases Java para leer información de valor de ID
4. AAR utilizado para leer la información del canal para com.android.application
De esta manera, solo necesita copiar un APK para cada paquete de canal y luego agregar un valor de ID al APK. Este método de empaquetado es muy rápido y solo toma más de 100 milisegundos para un paquete APK de 30M (incluido el archivo tiempo de copia) Puede generar un paquete de canales, y solo se necesitan unos pocos milisegundos para obtener información del canal en tiempo de ejecución.
Operación básica:
1、配置根build.gradle:
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.6'
}
}
2. Configure la aplicación build.gradle:
applyplugin:'walle'
dependencies {
compile'com.meituan.android.walle:library:1.1.6'
}
3. Configure el complemento
walle {
//指定渠道包的输出路径
apkOutputFolder=newFile("${project.buildDir}/outputs/channels");
//定制渠道包的APK的文件名称
apkFileNameFormat='${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
//渠道配置文件
channelFile=newFile("${project.getProjectDir()}/channel")}
Explicación específica de los elementos de configuración:
apkOutputFolder: especifique la ruta de salida del paquete del canal, el valor predeterminado es nuevo Archivo ("$ {project.buildDir} / outputs / apk")
apkFileNameFormat: el nombre de archivo del APK del paquete de canal personalizado, el valor predeterminado es '$ {appName} - $ {buildType} - $ {channel} .apk'
Se pueden utilizar las siguientes variables:
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. Obtén información del canal:
Stringchannel=WalleChannelReader.getChannel(this.getApplicationContext());
5. Generar paquete de canales:
Ingrese en la línea de comando de Terminal:
./gradlew clean ensamblarReleaseChannels
Algunas cuentas en ejecución están escritas, la mejor publicación de blog es el documento oficial.
Consulte el documento oficial para obtener más detalles.
El tercer tipo: VasDolly multicanal de código abierto Tencent
Para obtener más información, consulte el blog de Hongyang Great God Boutique
Cuarto: herramienta de empaquetado tripartita (recomendada)
Enlace: https://pan.baidu.com/s/1dTsq7cZq8kqFbql-KhutuQ Contraseña: 3zu7
Instrucciones:
1. Copie el APK que se empaquetará en el directorio raíz.
2. Agregue o modifique la lista de canales en el archivo de canales.
3. Ejecute el archivo publish.exe
Configuración 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(); (额外信息)
Muy rápido, simple y conveniente, me enamoré del empaque
Hay muchos métodos de empaquetado, pero todos son iguales. Es importante comprender los principios. Vale la pena aprender y reflexionar sobre una comprensión profunda de la firma de Android y el formato de archivo ZIP.
Tres, configuración unificada de Gradle
Aquí vemos la diferencia entre
build.gradle en el directorio de la aplicación: build.gradle en el directorio de la aplicación es: apply plugin: com.android.application
El build.gradle bajo la biblioteca de módulos es: apply plugin: com.android.library
La otra es que la versión es diferente y los elementos son los mismos. Esto es lo que vamos a presentar hoy. Aquí vemos que la versión compilada del SDK, la versión compilada de Herramientas y la versión mínima que soporta el SDK tienen una versión diferente. Igual, aquí necesitamos unificar, y no siempre podemos configurar manualmente cada vez, es fácil cometer errores cuando el Módulo aumenta
Solución:
Método 1: realice la configuración unificada en build.gradle en el directorio raíz del proyecto de la siguiente manera
-
/*在根目录中配置公用供子模块调用*/
-
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}",
-
]
-
}
El build.gradle del directorio raíz del proyecto después de la configuración:
-
//构建脚本
-
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}",
-
]
-
}
A continuación, invocamos build.gradle de la aplicación de la siguiente manera:
-
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
-
}
La llamada se realiza en el build.gradle del Módulo de la siguiente manera:
-
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
-
}
De esta forma, hemos completado el uso de Gradle para resolver la configuración unificada del build.gradle bajo la aplicación en el proyecto y la dependencia build.gradle en el Módulo en el proyecto. Por analogía, se configuran más Módulos en el mismo manera. Solo necesitamos cambiar la versión en el futuro. Vaya al directorio raíz build.gradle y modifíquelo
Método dos
Debido a que todos tienen sus propios hábitos de configuración, aquí proporcionamos otra configuración para su referencia. Aquí creamos config.gradle en el directorio raíz del proyecto principal para configurar la información de configuración requerida de la siguiente manera:
Información de configuración en 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}"
-
]
-
}
Luego, necesitamos importar config.gradle en build.gradle del directorio raíz y prestar especial atención aquí a la introducción de build.gradle en el directorio raíz.
apply from: "config.gradle"
El directorio raíz importado build.gradle es el siguiente:
A continuación, podemos introducirlo y usarlo en Module, de la siguiente manera:
-
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
-
}
En este punto, nos hemos introducido con éxito en el build.gradle del Módulo. La introducción de cada Módulo será así. Realiza la misma función que el Método 1. Personalmente, creo que el segundo método es mejor. Puede elegirlo usted mismo Después de todo, cada uno tiene sus propios méritos, está bien, aquí compartiré con ustedes el uso de las dependencias de configuración unificada de Gradle en el proyecto, espero que sea de utilidad para todos
Cuatro, herramienta de complemento de Android Studio
Complementos recomendados para mejorar la eficiencia del desarrollo
1 、 GsonFormat
2 、 Butterknife / Generador de código Android
3 、 Generar selectores de Android
Nota: Al mismo tiempo, no es adecuado instalar demasiados complementos para evitar un consumo excesivo de memoria y provocar retrasos.
Cinco, herramientas de análisis de rendimiento e inspección de código
1. Herramienta de inspección de código: Android Lint
2. Herramienta de análisis del rendimiento: monitor