一般我会采用这种方式来获取应用包名:
String packageName = context.getPackageName();
但是最近接手了一个应用的源码,在运行过程中发现会出现异常,查看代码才发现在获取包名的时候采用的是:
String packageName = R.class.getPackage().getName();
Log.d("mengqin.zhang","packageName = "+packageName);
int id_data = res.getIdentifier(name, "array", packageName);
Log.d("mengqin.zhang","id_data = "+id_data);
if (id_data == 0) {
throw new IllegalArgumentException("No resources found for " + name);
}
在我没有修改包名前,运行是OK的,可是我采用以下方式修改了包名,导致获取的包名没有找到才出现问题:
defaultConfig {
applicationId "com.xxx.xxx.xxx"
minSdkVersion 19
targetSdkVersion 26
versionCode Integer.valueOf("0218052302")
versionName "v6.3.1.33"
}
gradle提供了一种编译时快速修改packageName、minSdkVersion、targetSdkVersion、targetSdkVersion、versionCode、versionName的方式。如果没有在build.gradle中指定defaultConfig的属性,就会按androidManifest文件中的来;如果指定了该配置项,那么优先按照defaultConfig的配置生成apk。
可以使用如下命令来验证apk是否修改成功:
aapt dump badging <file_path.apk> //查看apk的manifest文件是否被修改成功
adb shell pm list packages | grep <packageName> //确认安装后包名是否正确
如果是在build.gradle中通过指定applicationId来修改的packageName,那么在获取这个包名的时候就不要再使用
String packageName = R.class.getPackage().getName();
其实也是建议一般不要使用这种方式了,理由如上。