//---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左侧那些黄色三角黑色叹号的标志)。