Android应用如何通过代码获取已引入三方库的版本名与版本号
报错原因
PackageManager#getPackageInfo() 仅用于查询系统已安装的独立APK应用的包信息,UnityAds是作为依赖项打包进你的应用APK内的,并非独立安装的应用,因此无法匹配到对应的包名,触发NameNotFoundException异常。
最佳实现方案
按优先级从高到低推荐以下三种实现:
方案1:调用UnityAds官方提供的版本接口(首选)
UnityAds官方已经内置了版本获取API,兼容性最高,不会受库内部结构变更影响:
// 直接调用即可获取版本名字符串,如你引入的3.7.1版本会返回"3.7.1" String unityAdsVersion = UnityAds.getVersion(); Log.d("Version", "UnityAds版本名:" + unityAdsVersion);
方案2:直接读取库自动生成的BuildConfig常量
所有Android AAR类型的三方库构建时都会自动生成BuildConfig类,内置版本名、版本号常量,直接导入对应库的BuildConfig读取即可:
import com.unity3d.ads.BuildConfig; // 读取版本信息 String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE; Log.d("Version", "versionName:" + versionName + ",versionCode:" + versionCode);
如果开启了代码混淆,需要在混淆规则中添加如下配置,避免BuildConfig被移除:
-keep class com.unity3d.ads.BuildConfig { *; }
方案3:反射动态获取(通用场景)
如果需要动态适配多个库、或是不想硬编码导入BuildConfig类,可以用反射方式读取:
try { Class<?> buildConfigClz = Class.forName("com.unity3d.ads.BuildConfig"); String versionName = (String) buildConfigClz.getField("VERSION_NAME").get(null); int versionCode = buildConfigClz.getField("VERSION_CODE").getInt(null); Log.d("Version", "versionName:" + versionName + ",versionCode:" + versionCode); } catch (Exception e) { Log.e("error", "获取UnityAds版本失败", e); }
内容的提问来源于stack exchange,提问作者Behrooz Fard
相关产品推荐
相关产品推荐

