编译SDK版本21的项目添加Google Play Services及OneSignal遇报错求助
解决CompileSdkVersion 21下添加Google Play Services/OneSignal的资源错误问题
问题分析
你的核心矛盾是必须固定compileSdkVersion 21,但面临两个关键冲突:
- 完整的
play-services:10.0.1依赖包含了仅在API 23+才引入的Material风格资源(比如android:TextAppearance.Material.Widget.Button.Inverse),导致aapt编译时找不到这些资源。 - Google Services插件3.0.0要求Play Services最低版本为9.0.0,无法降级到更低版本来规避资源问题。
解决方案
我们可以通过拆分Play Services依赖+选择兼容的OneSignal版本来解决,完全不需要修改compileSdkVersion:
1. 先修复Gradle语法错误
你的应用级Gradle文件存在语法漏洞:defaultConfig块缺少闭合的},这会导致Gradle解析失败,先补上这个关键的闭合符号。
2. 替换完整Play Services依赖为拆分模块
不要引入整个play-services大包,只添加你实际需要的功能模块(比如OneSignal推送依赖的GCM模块),选择满足Google Services插件要求的最低版本9.0.0——这个版本的拆分模块不会依赖API 23+的资源。
3. 指定兼容的OneSignal版本
选择与Play Services 9.0.0兼容的OneSignal版本,比如3.6.5,这个版本明确支持较低的compileSdk版本。
修改后的应用级Gradle文件
apply plugin: 'com.android.application' repositories { mavenCentral() maven { url 'https://maven.google.com' } } android { compileSdkVersion 21 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.example.myapp" minSdkVersion 15 targetSdkVersion 21 versionCode 11 versionName "1.1" } // 补上缺失的闭合大括号 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') // 仅引入推送所需的GCM模块,而非完整的play-services包 compile 'com.google.android.gms:play-services-gcm:9.0.0' // 使用兼容compileSdk 21的OneSignal版本 compile 'com.onesignal:OneSignal:3.6.5' } } apply plugin: 'com.google.gms.google-services'
方案可行性说明
- 拆分的Play Services模块(如
play-services-gcm)只包含对应功能的代码,不会引入高版本SDK专属的UI资源,从根源避免了找不到资源的编译错误。 - OneSignal 3.6.5版本与Play Services 9.0.0完全兼容,同时适配
compileSdkVersion 21,能满足你的推送功能需求。 - Google Services插件3.0.0与Play Services 9.0.0版本匹配,不会触发版本过低的报错。
如果你的项目还需要Play Services的其他功能(比如位置、地图),只需添加对应的拆分模块即可,例如:
// 示例:添加位置服务模块 compile 'com.google.android.gms:play-services-location:9.0.0'
内容的提问来源于stack exchange,提问作者saraX
相关产品推荐
相关产品推荐

