Android applicationId与package的区别 install failed conflicting provider bug

应用ID与包名区别

每个Android应用都有一个唯一的应用ID.在Android设备和市场上,这个ID是你应用的唯一标识.若想在市场上更新应用,新应用的ID必须和原来apk的应用ID一致.所以一旦发布了应用,就不能再改变应用ID.


在Eclipse中没有applicationId这个概念,Eclipse中applicationId即等同于包名。但是到了Android Studio中,这两个概念做个区分。包名的定义在清单文件中:

[html]  view plain  copy
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="com.example.myapplicationtest" >  
应用ID是在moudle层的build.gradle中定义,applicationId值即为应用ID,如下所示:

[java]  view plain  copy
  1. android {  
  2.     defaultConfig {  
  3.         applicationId "com.example.myapplicationtest"  
  4.         minSdkVersion 15  
  5.         targetSdkVersion 24  
  6.         versionCode 1  
  7.         versionName "1.0"  
  8.     }  
  9.     ...  
  10. }  

但是,在Android Studio中创建一个新项目时,applicationId默认是和项目的包名一致的。所以常常有开发者会将两者混淆,以为它们是一个概念。实际上,应用ID和包名是相互独立的。改变包名不会影响应用ID,反之亦然。

通常Android的应用ID与包名是绑定的,所以在Android API中,一些方法和参数从名称上看似乎它们返回的是包名,事实上它们返回的是应用ID值.例如,Context.getPackageName()方法返回的是应用ID,而不是包名。不信我们来看:


图中,包名是:com.example.myapplicationtest   应用ID:com.example.myapplicationtest.id

在MainActivity中调用如下代码:

[java]  view plain  copy
  1. String applicationId = this.getPackageName();  
  2. Log.i("TESTKIM","applicationId:" + applicationId);  
打印日志文件,如下:



应用ID的命名并不是随意的,它至少需要需遵循以下限制:

  • 应用ID至少包含两部分(也就是说至少有一个点,如com.example);

  • 每部分必须以字母开头;

  • 所有字符必须是字母数字或者下划线[a-zA-Z0-9_]

注意:

如果你使用了webview,请使用包名作为应用ID的前缀,否则,有可能会报错.


应用ID用处

应用ID除了唯一标识了应用,那么它在开发过程中可以有哪些用处呢?

试想一下,当我们开发应用的时候,要在一台测试机上同时装上开发版和发布版,如何才能做到呢?其实很简单,只要让开发版的应用ID与发布版不一致即可。所以,只需要在buildTypes中修改开发版的应用ID就行。如下:

[java]  view plain  copy
  1. android {  
  2.     ...  
  3.     buildTypes {  
  4.         debug {  
  5.             applicationIdSuffix ".debug"   //等同于“com.example.myapplicationtest.debug”  
  6.         }  
  7.     }  
  8. }  

上面代码中,将debug版的应用ID在原来应用ID后追加“.debug”。applicationIdSuffix代表了默认的应用ID,即为defaultConfig中applicationId的值。所以,debug版的应用ID为:"com.example.myapplicationtest.debug".


另外,有时我们发布到市场的应用希望有不同的版本,比如:免费版和收费版。这就需要我们来构建不同的应用变体。那么我们可以在productFlavors中进行相应的配置,来生成不同的应用。如:

android {
    defaultConfig {
        applicationId "com.example.myapplicationtest"
    }
    productFlavors {
        free {
            applicationIdSuffix ".free"
        }
        paid {
            applicationIdSuffix ".paid"
        }
    }
}
在上面的代码中,我们用"free"表示免费版,用"paid"表示付费版。在productFlavors中,通过配置不同应用ID,最终生成不同的应用。最终这两种应用apk可同时存在于市场中。


修改包名

默认情况下,包名与应用ID是相同的。当然,开发者也可以对包名进行修改.如果开发者想要修改包名的话,注意项目目录结构必须与AndroidManifest.xml中package属性的包名一致.

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.myapplicationtest"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  

package值有两个作用:

  • 它为R.java文件提供了命名空间,例如R class的包名为com.example.myappcationtest.R

  • 决定manifest中声明的class的相对名称。如:manifest中声明的<activity android:name=".MainActivity"> 的真实路径为:com.example.myapplicationtest.ManiActivity

如果开发者想修改包名,必须确保manifest中package值也做了同步修改.



如果出现 INSTALL FAILED CONFLICTING PROVIDER错误,请检查下面红色部分是否相同

 
 
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值