can t find dynamically referenced class android os systemproperties

//---2017年更新解决方案:

该问题是引用了系统隐藏API,导致编译的时候找不到该类。SDK路径下有隐藏类的jar包,引入到项目中就可以了,不要用compile的依赖类型,因为手机的运行时环境(FrameWork)有该类,所以只要在编译加入,打包不用就可以了

在AndroidStuido的build.gradle中为:
dependencies {
	    provided files("C:\Users\Administrator\AppData\Local\Android\sdk\platforms\android-23\data\layoutlib.jar")
}
解释:
C:\Users\Administrator\AppData\Local\Android\sdk 是我自己的SDK路径,你需要替换
provided files就是编译时引用,打包不用。这样apk包内就不会含有这个类,手机运行就会自动加载 手机FrameWork上的这个隐藏类。
最好把SDK路径抽成变量,System.getenv是读取电脑的环境环境变量,所以记得建立一个
String SDK_DIR = System.getenv("ANDROID_HOME")
String PLATFORMS_VER = "android-23"

dependencies {
	    provided files("${SDK_DIR}/platforms/${PLATFORMS_VER}/data/layoutlib.jar")
}

关于Proguard的问题:

1.BUG背景:

引入第三方项目到我的项目中,第三方项目引用了android.os.systemporperties。

报的错是:can t find dynamically referenced class android os systemproperties

2.解决方案:

当你确定无需引用这个类时(实际是你很难确定,所以你应该试试),你可以在proguard-project.txt中加入:

-dontwarn com.youju.statistics.**

其中com.youju.statistics就是我引用的第三方库。

3.解释:

android.os.systemproperties是系统的类,不在SDK中所以导出会报错

编译时期(点击run as)OK,而打包有问题是因为:Proguard只在打包的时候运行,编译是不运行的。一种检测机制了,但有时候可能太严格了,第三方可能是手机厂商,他们调用底层类,SDK是没有的,可是运行时时会有着这个类的。

Overflow上称这种错误是Progurard hell,O(∩_∩)O~呵呵很形象。又时候Lint也会这样(就是Eclispse左侧那些黄色三角黑色叹号的标志)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值