Android 5.1设备编译WebRTC项目遇多类错误求解决方案
Hey there, let's work through your compilation issues step by step—these are common pitfalls when mixing Java 8, older Android APIs, and WebRTC in AS 2.3.3. Here's how to fix them:
1. Fix Support Library Version Mismatch
First, you've got a critical mismatch: your compileSdkVersion is 25, but you're using 26.+ versions of the support libraries. Support library versions must not exceed your compileSdkVersion—this causes hidden compatibility conflicts. Update your dependencies to match compileSdk 25:
dependencies { // ... other dependencies compile 'com.android.support:appcompat-v7:25.4.0' compile 'com.android.support:design:25.4.0' // ... }
2. Replace Jack Compiler with Retrolambda (Stable Java 8 Support)
The Jack compiler in Android Studio 2.3.x has known bugs with Java 8 features like Lambdas when targeting APIs below 24. Plus, your WebRTC dependency is compiled with Java 8 bytecode (version 52), which is why switching back to Java 1.7 throws dex errors. Retrolambda lets you use Java 8 features while generating Java 7-compatible bytecode, avoiding both issues:
Step 2.1: Add Retrolambda to Project Root build.gradle
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'me.tatarka:gradle-retrolambda:3.7.0' // Add this line } }
Step 2.2: Configure App Module build.gradle
Update your app's build.gradle to use Retrolambda, disable Jack, and keep Java 8 compatibility:
apply plugin: 'com.android.application' apply plugin: 'me.tatarka.retrolambda' // Apply Retrolambda plugin android { compileSdkVersion 25 buildToolsVersion "25.0.0" defaultConfig { applicationId "com.example.bmeccoffice.remotehelp" minSdkVersion 22 targetSdkVersion 22 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // Remove jackOptions entirely } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // Configure Retrolambda to output Java 7-compatible bytecode retrolambda { javaVersion JavaVersion.VERSION_1_7 } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.4.0' compile 'com.android.support:design:25.4.0' compile 'org.webrtc:google-webrtc:1.0.21217' testCompile 'junit:junit:4.12' }
3. Fix WebRTC EglBase Compatibility with API 22
The EglBase static methods you're using require API 24+. To support API 22, use the overloaded create() method that works on older versions:
// Replace direct EglBase.create() with this conditional or overload EglBase eglBase; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { eglBase = EglBase.create(); } else { // Use the compatibility overload for pre-Nougat devices eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN); }
Alternatively, if you still run into issues, downgrade your WebRTC dependency to a version explicitly compatible with API 22, like org.webrtc:google-webrtc:1.0.19000.
4. Final Compilation Steps
After making these changes:
- Sync your Gradle project (click "Sync Now" in the toolbar)
- Clean your project (
Build > Clean Project) - Rebuild the Debug variant (
Build > Rebuild Project)
This should resolve all 26 compilation errors, including the Jack exception and Lambda/bytecode issues.
内容的提问来源于stack exchange,提问作者theman whosoldtheworld

