获取应用包名引出的问题



一般我会采用这种方式来获取应用包名:

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();


其实也是建议一般不要使用这种方式了,理由如上。

 

 

 

 

 

 

 

 

Guess you like

Origin blog.csdn.net/hanhan1016/article/details/80494993