Android Studio中的package name和application ID

本文深入解析Android应用在Eclipse与AndroidStudio中包名与应用ID的区别,阐述如何在AndroidStudio中利用applicationId与applicationIdSuffix进行多版本构建,确保应用在设备及市场中的唯一性。

Eclipse中只有package name的概念,没有application ID。而在Android Studio 中把package name 拆分为了两部分package nameapplication ID

Android Studio 中的application IDEclipse中的package name在手机设备中和市场中代表了应用的唯一性,如果在设备中和市场中已安装过应用,下次升级安装时application ID必须保持一致,如果更换了application ID,设备和市场会认为该应用为一个新的应用。
在Module的build.gradle文件中可以看到application ID,也可以在这修改。如下:

defaultConfig { applicationId "com.android.app" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" }

只要修改了这里的applicationId,就代表这是一个新的应用了。
在开发项目中可能需要在一个手机上同时安装测试版和正式版,这时就可以通过简单修改applicationId来实现。

默认情况下android studio中的package nameapplicationId是一样的,在AndroidManifest.xml 文件中可以看到,如下:

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

这里package必须和项目中的包名一致,应用生成的R.java类的命名空间与此对应,比如上面的AndroidManifest.xml的R类名称是com.android.app.R,另外manifest文件中声明的类名也与此对应,android:name=".MainActivity" 表示android:name="com.android.app.MainActivity"
如果要修改package name(一般不会遇到这种情况),最好的方法是在AndroidManifest.xml 文件用快捷键shift+f6来修改package

总的来说,在Android Studio中修改applicationId更简单,使用起来也更方便。


BuildType 中所设置的『applicationIdSuffix』属性,按照这个属性的字面翻译为:『applicationId 的后缀』

Android 应用都有自己的包名。包名是设备上每个应用程序的唯一标识,同样也是 Google Play 商店里的唯一标识。就是说,假如你已经使用某个包名来发布应用,就不能再去改变应用的包名,因为这样做会导致你的应用被视为一个全新的应用,你现有的用户也不会收到应用的更新通知。

旧版(不推荐)

旧版的 Android Gralde 构建系统中,应用的包名由 manifest 中根节点的 package 属性决定:

AndroidManifest.xml:

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

然而,这里所定义的 package 还有另一个作用:用来命名资源类 R(以及用于解析相关的 Activity)。在上面的示例中,最终生成的 R 类为 com.example.my.app.R,所以如果你在其他包中的代码需要引用资源,对应的 .java 文件需要导入 com.example.my.app.R

新版(推荐)

新的 Android Gradle 构建系统中,你可以轻松地构建多个不同版本的应用。例如,你可以同时构建免费版和专业版的应用(使用 productFlavors),并且它们在 Google Play 上也应该要有不同的包名,这样它们就能够在同一设备上安装并且能够单独购买使用等等。同样的,你也可以构建 “debug”、“alpha”、“beta” 版的应用(使用 build type),它们也同样可以有唯一的包名。

同时,代码中引用的 R 类要保持不变;在构建不同版本的应用时,对应的(引用了 R 的) .java 源文件也不能改动。

因此,我们将包名的两种作用解耦:

application id” 对应 apkmanifest 定义的应用包名,同时用于设备以及 Google Play 的应用唯一标识。
package” 用于在源码中引用 R 类以及解析注册相关的 activity/service,对应 Java 的包名概念。
你可以在 Gradle 文件中指定 application id,如下所示:

app/build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1"

    defaultConfig {
        applicationId "com.example.my.app"
        minSdkVersion 15
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }

像以前一样,你需要像前面的 AndroidManifest.xml 示例在 Manifest 中指定给代码用的 “package”。

关键部分:参照上面的做法,即能解耦 applicationIdpackage。意思是你能够完全自由地重构你的代码,改变用于 ActivityService 的内部包,改变 Manifestpackage,重构导入语句。这都不会影响到 app 的最终 idappid 对应 Gradle 文件中 applicationId 的值。

你可以通过以下的 Gradle DSL 方法来为不同的 flavorbuild type 定义不同的 applicationId
app/build.gradle:

   productFlavors {
        pro {
            applicationId = "com.example.my.pkg.pro"
        }
        free {
            applicationId = "com.example.my.pkg.free"
        }
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }

(在 Android Studio 中,你可以通过 Project Structure 图形化界面来进行这些配置。)

注意:出于兼容性考虑,如果没有在 build.gradle 文件中定义 applicationId,那么 applicationId 将默认为 AndroidManifest.xml 中所指定的 package 的值。在这种情况下,applicationIdpackage 显然未解耦,此时重构代码也将会更改应用的 id !在 Android Studio 中,新建的项目会指定这两个值。

注意:package 始终必须在默认 AndroidManifest.xml 文件中指定。如果存在多个 manifest(例如一个 flavor 有特定的 manifest 或一个 buildType 有特定的 manifest),package 可不指定,但如果被指定,必须和主 manifest 中指定的 package 完全相同。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值