Android package属性、package name和Application ID三者的联系及区别

Android package属性、package name和Application ID三者的联系及区别

  1. package属性:在AndroidManifest.xml文件中。
  2. package name:应用程序的包名。
  3. Application ID:模块defaultConfig块下的applicationId属性。

设置Application ID

每个Android应用程序都有唯一一个类似Java包名的Application ID,比如com.example.myapp。在Android设备和Google应用商店上,Application ID是您应用的唯一标识。如果您想上传应用程序的新版本,那么Application ID必须和原来相同。如果您改变了新版本应用程序的Application ID,那么Goolge应用商店会认为这是个完全不同的应用程序。所以,从您第一次上传应用程序开始,绝对不要更改Application ID。

Application ID定义在模块build.gradle的applicationId属性中,如下所示:

android {
  defaultConfig {
    applicationId "com.example.myapp"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
  }
  ...
}

当您在Android Studio中创建新项目的时候,您可以设置applicationId属性,这时,Application ID和package name是精确匹配的。除此之外,两者是完全独立的。当然,您可以更改package name,但是这不会影响到Application ID。反之亦然(再次提醒:在您上传应用程序之后,不要修改Application ID,不要修改Application ID,不要修改Application ID)。然而,您应该意识到,修改package name 还有另一个后果。这部分详见修改包名(下文有讲)。

尽管Application ID看起来和传统的Java包名很类似,但是Application ID的命名规则有更多的限制:

  • 最少有两段(至少一个.隔开)
  • 每段开头必须是字母
  • 所有的字符只能是字母、数字和下划线

注意:在以前,Application ID 直接绑定package name。所以,有些Android APIs在方法名或者参数名中使用“package name”,但是实际上指的是Application ID。举个栗子, Context.getPackageName()方法返回Application ID。所以没必要在您应用程序代码之外分享真正的package name。

警告:如果你使用WebView,考虑使用您的package name作为您Application ID的前缀,否则,您可能遇见

issue 211768。

修改构建版本的Application ID

当为您的应用程序构建APK时,构建工具使用build.gradle文件中的defaultConfig块中定义的Application ID标识APK(如下所示)。但是,如果你想创建不同版本的应用程序并且在Google应用商店中显示不同的信息,例如“免费版”和“专业版”。您需要构建拥有不相同Application ID的不同版本。

在这种情况下,每个构建版本应该定义不同的product flavor,且每个flavor都在productFlavors{}块内部。对于每个flavor,您可以重新定义applicationId属性,或者给默认的applicationId増加前后缀,如下所示:

android {
  defaultConfig {
    applicationId "com.example.myapp"
  }
  productFlavors {
    free {
      applicationIdSuffix ".free"
    }
    pro {
      applicationIdSuffix ".pro"
    }
  }
}

这样定义之后,“free”的Application ID是”com.example.myapp.free“。

在构建类型上,你也可以使用后缀,如下所示:

android {
  ...
  buildTypes {
    debug {
      applicationIdSuffix ".debug"
    }
  }
}

由于Gradle首先应用product flavor之后才应用build type,所以”free debug”版本现在的Application ID是”com.example.myapp.free.debug”。如果你想在同一部手机上同时安装debug和release两个版本,这将非常有用,因为没有两个应用程序可以拥有相同的Application ID。

记住一点,同一应用程序拥有不同的Application ID,Google应用市场将会认为这是两个应用程序。所以,如果您为了适配不同的设备配置(例如不同的API等级),并且想用相同信息去分发多个应用程序。那么对于每个版本,您必须使用相同的Application ID和不同的versionCode。

警告:为了兼容先前的SDK工具,如果你没有在build.gradle中定义applicationId属性,那么构建工具将使用AndroidManifest.xml中的package name作为Application ID。在这种情况下,重命名package name意味着同时重命名了Application ID。

提示:如果您需要在manifest文件中引用Application ID,可以在manifest的属性中使用${applicationId}占位符。Gradle在构建时会自定替换这个标识为真正的Application ID。更多详见 Inject Build Variables into the Manifest.

测试专用Application ID

默认情况下,构建工具会使用指定构建版本的Application ID(附加.test)将Application ID应用到您的instrumentation测试APK。例如,构建版本为”com.example.myapp.free”的测试应用程序真正的Application ID是“com.example.myapp.free.test“。

通常这不是必要的,你可以在defaultConfig或者productFlavor块中定义testApplicationId属性来修改Application ID。

注意:为了避免与测试应用程序命名冲突,构建工具为测试应用程序使用基于测试Application ID生成R.class的命名空间。

修改package name

虽然package name默认完全匹配Application ID,但是您仍然可以修改它。如果您想修改package name,请留意package name(项目目录结构)和AndroidManifest.xml中的package属性是完全对应的。如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp"
  android:versionCode="1"
  android:versionName="1.0" >

对于Android构建工具来说,package属性用于两件事情:

应用于您应用程序生成R.Java类的命名空间。

例如:在上面的manifest文件中。R类是“com.example.myapp.R”

用于解析AndroidManifest.xml文件中任何类的相对路径。

例如:在上面的manifest文件中。一个activity定义为\,将会被解析为com.example.myapp.MainActivity。

因此,package属性的值应该总是和工程的package name相同。当然,你可以给工程设置子包名。这些文件必须从package属性的命名空间导入R类,并且任何定义在manifest中的组件必须增加子包名(或者写全路径)。

如果您需要完全重命名package name,请确保您已经更新package属性。直到您用Android studio的工具重命名包,之后这些自动保持同步。(如果没有保持同步,您的代码将不能正确解析R类,因为它不再是相同包下,并且manifest也将不能正确识别您的activities和其它组件)。

您必须在AndroidManifest.xml文件中置顶package属性,如果您另外添加了manifest文件,请注意,由最高优先级manifest文件提供的package name始终用于合并最终的manifest。更多:[Merge Multiple Manifest Files。

望周知:尽管您的项目可以设置package属性不等于applicationId,然并卵。构建工具在最后构建的时候将会复制Application ID并设置为您应用程序唯一的package属性的值。所以,如果您在构建成功之后检查AndroidManifest.xml文件,请不要惊讶package属性发生变化。在Android平台和Google应用商店,package属性才是真正作为您应用程序唯身份凭证。所以,一旦使用原始值构建(使用命名空间的R类解析manifest中的组件),构建工具将会丢弃package属性的值,并且使用Application ID替换。

原文链接:https://developer.android.com/studio/build/application-id.html#change_the_package_name

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android开发中避免应用无响应的方法(Application Not Responding、ANR)

    App里发生的最糟糕的事是弹出应用无响应"Application Not Responding" (ANR) 对话框.本课讲的是如何保持应用响应,避免ANR. 什么触发ANR 通常,系统会在应用无法对用户输入响应时显示ANR.比如,如果一个应用在I/O操作上阻塞了(频繁请求网络)UI线程,系统无法处理用户输入事件.或者,在UI线程中,app花了大量时间在构建复杂的类,或在游戏中计算下一个动作.保证这些操作高效是很重要的,但最高效的代码也需要花费时间. 在任何情况下,都不要在UI线程执行

  • Android获取应用程序名称(ApplicationName)示例

    MainActivity如下: 复制代码 代码如下: package cn.testapplicationname; import android.os.Bundle; import android.widget.TextView; import android.app.Activity; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; /** * Demo描述: * 获取应

  • Android Framework Application Framework层简单介绍

    引言 Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我们业务上的需求.写APP的人都知道,学习Android开发的第一步就是去学习各种各样的API,什么Activity,Service,Notification等.这些都是framework提供

  • Android Application存取公共数据的实例详解

    Android Application存取公共数据的实例详解 Android系统在运行每一个程序应用的时候,都会创建一个Application对象,用于存储与整个应用相关的公共变量. 一个Android应用只会生成一个Application对象,在不同的Activity中获取的Application对象是一样的,所以Application对象是一个单例(SingleTon). Application对象非常适合用于存储一些与整个应用相关数据,例如应用版本,应用登录账户,数据缓存等. 利用Appl

  • Android 退出多Activity的application的方式方法

    在开发过程中,我们常常需要一个退出功能,来退出该应用的所有Activity.下面,我们列举一些退出应用的几种方式. 1.利用ActivityContainer来管理所有的Activity的引用 2.使用广播通知BaseActivity结束 3.直接杀死进程 4.采用SingleTask的特点,结束应用 5.第四种方式的更优雅实现 6.双击返回键退出 方式一:利用ActivityContainer管理所有的Activity引用 该方式是建立一个通用的Activity的父类 BaseActivity

  • 详解Android中Application设置全局变量以及传值

    Application设置全局变量以及传值 /** * 重写Application,主要重写里面的onCreate方法,就是创建的时候, * 我们让它初始化一些值,前段时间在javaeye里面看到过一个例子,与此相似, * 我做了些改进.听说外国开发者习惯用此初始化一些全局变量,好像在Activity * 一些类里面初始化全局变量的化,会遇到一些空指针的异常,当然,我没有遇到过. * 如果用此方法初始化的话,那么就可以避免那些有可能出现的错误. * * 启动Application,他就会创建一个

  • Android application捕获崩溃异常怎么办

    Android application捕获崩溃异常怎么办? 通用 application 1.收集所有 avtivity 用于彻底退出应用 2.捕获崩溃异常,保存错误日志,并重启应用 public class HKBaseApplication extends Application { // activity对象列表,用于activity统一管理 private List<Activity> activityList; // 异常捕获 protected boolean isNeedCaug

  • Android编程之Application设置全局变量及传值用法实例分析

    本文实例讲述了Android编程之Application设置全局变量及传值用法.分享给大家供大家参考,具体如下: /** * 重写Application,主要重写里面的onCreate方法,就是创建的时候, * 我们让它初始化一些值,前段时间在javaeye里面看到过一个例子,与此相似, * 我做了些改进.听说外国开发者习惯用此初始化一些全局变量,好像在Activity * 一些类里面初始化全局变量的化,会遇到一些空指针的异常,当然,我没有遇到过. * 如果用此方法初始化的话,那么就可以避免那些

  • Android package属性、package name和Application ID三者的联系及区别

    Android package属性.package name和Application ID三者的联系及区别 package属性:在AndroidManifest.xml文件中. package name:应用程序的包名. Application ID:模块defaultConfig块下的applicationId属性. 设置Application ID 每个Android应用程序都有唯一一个类似Java包名的Application ID,比如com.example.myapp.在Android设

  • Android利用属性动画实现优酷菜单

    利用属性动画实现优酷菜单,供大家参考,具体内容如下 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_p

  • 基于Android FileProvider 属性配置详解及FileProvider多节点问题

    众所周知在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.0+的机型需要这样写: 1:代码适配 if (Build.VERSION.SDK_INT > 23) {// intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(context, SysInfo.packageN

  • Android编程实现通过反射获取资源Id的方法

    本文实例讲述了Android编程实现通过反射获取资源Id的方法.分享给大家供大家参考,具体如下: 在将自己写的工具打成.jar包的时候,有时候会需要引用到res中的资源,这时候不能将资源一起打包,只能通过反射机制动态的获取资源. 特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取 1.封装成一个工具类 package com.cp.utils; import android.content.Context; public class CPResourceUtil { public

  • 详解Android自定义控件属性TypedArray以及attrs

    最近在研究android自定义控件属性,学到了TypedArray以及attrs.大家也可以结合<理解Android中的自定义属性>这篇文章进行学习,后续一篇还有应用. 1.attrs文件编写 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="titleText" format="string" /> &

  • Android自定义控件属性详细介绍

     Android自定义控件属性详细介绍 1. reference:参考某一资源ID.  (1)属性定义: <declare-styleable name = "名称"> <attr name = "background" format = "reference" /> </declare-styleable> (2)属性使用: <ImageView android:layout_width = "

  • android布局属性详解分享

    RelativeLayout 第一类:属性值为true或false android:layout_centerHrizontal  水平居中 android:layout_centerVertical   垂直居中 android:layout_centerInparent相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft   贴紧父元素的左边缘 android:layout_a

  • android 布局属性详解

    android:id 为控件指定相应的ID android:text 指定控件的文本,置尽量使用strings.xml android:grivity 指定控件的基本位置 ,比如举重,居右, android:padding 指定控件的内边距,控件当中的内容 android:singleLine 如果设置为真的话,则将控件的内容在同一行当中显示 android:layout_above 将该空间的底部至于给定ID的空间之上 android:layout_below: 将该控件的顶部至于给定ID的控

  • Android ImgView属性图文详解

    ImageView是用于界面上显示图片的控件. 属性 1.为ImageView设置图片 ①android:src="@drawable/img1": src设置图片,默认图片等比例放缩,以最适应的大小显示. ②android:background="@drawable/img1" background是组件通用属性,不仅可以设置组件的背景颜色,也可以用图片做背景. [提示] ①以图片做背景,那么图片将适应组件的大小. ②但如果控件是宽高为wrap_content,则

  • 详解Android TextView属性ellipsize多行失效的解决思路

    本文介绍了Android TextView属性ellipsize多行失效的解决思路,分享给大家,具体如下: 多余文字显示省略号的常规做法 android:ellipsize="end" //省略号显示在末尾 android:ellipsize="middle" //省略号显示在中间 但是设置android:maxLines="2" 以后,ellipsize的值end有效,middle无效,本方法解决middle无效的问题 /** * 字符串显示到

随机推荐