Android开发经验谈Android技术知识Android开发

Android应用唯一性

2019-08-28  本文已影响0人  Android架构师丨小熊

说到应用唯一性,下面三个关键词,有何区别和联系呢?

包名

定义简介

包名指的是软件包名称(代码命名空间)。就是我们平常写代码import的package。

配置示例

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapp">

更改包名

Android 构建工具使用 package 属性来发挥两种作用:

因此package 属性中的名称应始终与项目的基础软件包名称匹配,基础软件包中保存着您的 Activity 及其他应用代码。(如果它们未保持同步,您的应用代码将无法解析 R 类,因为它不再位于同一软件包中,并且清单无法识别您的 Activity 或其他组件)

注意: 如果未在 build.gradle 文件中定义 applicationId 属性,构建工具会将 AndroidManifest.xml 文件中的软件包名称用作applicationId。在这种情况下,重构软件包名称也会更改applicationId。

applicationId

定义简介

applicationId是每个应用的唯一应用Id,看起来就和软件包名称一样。此 ID 可以在设备上和 Google Play 商店中对应用进行唯一标识(实际上,Google Play 商店和 Android 平台会查看包名 package 属性来识别您的应用,构建工具会在编译结束时将applicationId 复制替换到 APK 的最终清单文件中)。也就是说,上传新版本的应用,applicationId必须与原始APK相同,否则会被认为是两个完全不同的应用。因此发布应用后, 绝不应该更改applicationId

配置示例

android {
    defaultConfig {
        applicationId "com.example.myapp.XXX"
    }
}

PS: 如果需要在清单文件中引用applicationId,可以在任何清单属性中使用 ${applicationId} 占位符,在编译期间,Gradle 会将此标记替换为实际的applicationId。

命名规则限制

签名

定义简介

Android 要求所有 APK 必须先使用证书进行数字签署,然后才能安装。这个签署的过程就是我们说的签名。

配置示例

android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            // You need to specify either an absolute path or include the
            // keystore file in the same directory as the build.gradle file.
            storeFile file("my-release-key.jks")
            storePassword "password"
            keyAlias "my-alias"
            keyPassword "password"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

debug模式下,Android Studio会在$HOME/.android/debug.keystore 中自动创建调试密钥库和证书,并设置密钥库和密钥密码。

在Android Studio 生成密钥:

密钥库:

密钥:

keytool 命令行签名工具

keytool 位于 JDK 的 bin/ 目录中。

总结

  1. applicationId是应用的唯一标识。发布应用后 绝不应该更改applicationId
  2. 尽管applicationId和包名在设置时完全一样,但 applicationId和包名彼此无关,两者更改互不影响
  3. applicationId过去直接关联到代码的软件包名称;所以,有些 Android API 会在其方法名称和参数名称中使用“package name”一词,但这实际上是指applicationId,如 Context.getPackageName() 方法返回的是applicationId
  4. 无论何时都不需要在应用代码以外分享代码的真实软件包名称。对外暴露的只有applicationId。
  5. 构建工具会在 编译结束时将applicationId 复制替换到 APK 的最终清单文件中 ,编译系统利用原始值包名(设置 R 类的命名空间并解析清单类名称)后,它会舍弃该值(包名)并将其替换为applicationId。
  6. 个人推荐applicationId和包名一致或者以包名为前缀。
  7. Android 要求所有 APK 必须先使用证书进行数字签署,然后才能安装。
  8. Android Studio默认会自动生成debug签名,签名在$HOME/.android/debug.keystore。

综上所述,不同的APP,applicationId一定不相同,包名和签名可以相同也可以不相同。

最后

漫漫开发之路,我们只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,资料免费领取方式:加群:797404811,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

重要的事说三遍,转发+转发+转发,让更多需要的朋友们都可以看到并且领到!

image
上一篇 下一篇

猜你喜欢

热点阅读