英文:
Issue with video playback and interstitial ad in release mode
问题
MAX插件版本
2.5.0
Flutter版本
3.10.2
设备/平台信息
Poco X3 Pro Android 13和其他设备。
当前行为
我遇到了一个问题,当尝试在使用video_player
包播放视频时加载广告时,我的应用程序会崩溃。广告在其他屏幕上成功加载,但只有在尝试播放视频并显示插页广告时才会出现此问题。
有趣的是,我只在发行模式下遇到这个问题,而在调试模式下却没有。
我的应用程序中使用的包:
- video_player:^2.6.1
- applovin_max:^2.5.0
- flutter_local_notifications:^14.1.0
- onesignal_flutter:^3.5.1
错误日志:
E/AndroidRuntime(30065): FATAL EXCEPTION: pool-16-thread-1
...
...
E/AndroidRuntime(30065): Caused by: java.lang.IllegalStateException: Failed to create VMBridge instance
...
...
对于解决此问题的任何帮助,将不胜感激。
期望的行为
没有回应
如何重现
要重现此问题:
-
确保在Flutter应用程序中安装了
video_player
和applovin_max
包的最新版本。- video_player: ^2.6.1
- applovin_max: ^2.5.0
-
在应用程序中创建一个屏幕,其中包含视频播放器和广告。
-
使用
video_player
包播放视频。 -
尝试在视频开始播放后使用AppLovin SDK加载广告。
-
观察到应用程序崩溃,并显示以下错误:
E/AndroidRuntime(30065): FATAL EXCEPTION: pool-16-thread-1
...
...
E/AndroidRuntime(30065): java.lang.NoClassDefFoundError: k9.w3
...
请注意,此问题特定发生在Android上,而且只在发行模式下,而不是调试模式下。
重要的是要提到,这个问题发生在尝试在使用video_player
包播放视频后加载广告时。在其他屏幕上广告成功加载,这表明问题特定于视频播放和广告加载的组合。
通过按照上述步骤,开发人员应能够理解和重现此问题,以便有效地进行调查和解决。
其他信息
没有回应
英文:
MAX Plugin Version
2.5.0
Flutter Version
3.10.2
Device/Platform Info
Poco X3 Pro Android 13 and Also other devices.
Current Behavior
I encountered an issue where my app crashes when trying to load an ad while playing a video using the video_player
package. The ads load successfully on other screens, but this issue occurs specifically when attempting to play a video and show the interstitial ad.
Interestingly, I don't encounter this issue in debug mode, only in release mode.
Packages used in my app:
- video_player: ^2.6.1
- applovin_max: ^2.5.0
- flutter_local_notifications: ^14.1.0
- onesignal_flutter: ^3.5.1
Error Logs:
E/AndroidRuntime(30065): FATAL EXCEPTION: pool-16-thread-1
E/AndroidRuntime(30065): Process: com.videodownloader.udownload, PID: 30065
E/AndroidRuntime(30065): java.lang.NoClassDefFoundError: k9.w3
E/AndroidRuntime(30065): at k9.n.o(Unknown Source:0)
E/AndroidRuntime(30065): at ua.a.b(Unknown Source:40)
E/AndroidRuntime(30065): at pa.y.c(Unknown Source:21)
E/AndroidRuntime(30065): at pa.y.a(Unknown Source:35)
E/AndroidRuntime(30065): at qa.e1.T0(Unknown Source:0)
E/AndroidRuntime(30065): at qa.e1.c0(Unknown Source:106)
E/AndroidRuntime(30065): at qa.e1.M0(Unknown Source:18)
E/AndroidRuntime(30065): at qa.e1.Q(Unknown Source:0)
E/AndroidRuntime(30065): at qa.u0.apply(Unknown Source:10)
E/AndroidRuntime(30065): at j$.util.stream.d2.accept(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.d2.accept(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.d2.accept(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.a.forEachRemaining(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.c.f0(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.c.I0(Unknown Source:10)
E/AndroidRuntime(30065): at j$.util.stream.U.y(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.c.L0(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.k2.forEach(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.g2.accept(Unknown Source:24)
E/AndroidRuntime(30065): at j$.util.Y.forEachRemaining(Unknown Source:20)
E/AndroidRuntime(30065): at j$.util.stream.c.f0(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.c.I0(Unknown Source:10)
E/AndroidRuntime(30065): at j$.util.stream.U.y(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.c.L0(SourceFile:0)
E/AndroidRuntime(30065): at j$.util.stream.k2.forEachOrdered(SourceFile:0)
E/AndroidRuntime(30065): at qa.e1.m0(Unknown Source:70)
E/AndroidRuntime(30065): at qa.e1.r(Unknown Source:13)
E/AndroidRuntime(30065): at k1.a.g(Unknown Source:26)
E/AndroidRuntime(30065): at i1.b$a.run(Unknown Source:210)
E/AndroidRuntime(30065): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
E/AndroidRuntime(30065): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
E/AndroidRuntime(30065): at java.lang.Thread.run(Thread.java:1012)
E/AndroidRuntime(30065): Caused by: java.lang.ExceptionInInitializerError
E/AndroidRuntime(30065): at k9.n.m(Unknown Source:0)
E/AndroidRuntime(30065): at k9.n.l(Unknown Source:5)
E/AndroidRuntime(30065): at ua.a.b(Unknown Source:0)
E/AndroidRuntime(30065): ... 30 more
E/AndroidRuntime(30065): Caused by: java.lang.IllegalStateException: Failed to create VMBridge instance
E/AndroidRuntime(30065): at k9.w3.d(Unknown Source:36)
E/AndroidRuntime(30065): at k9.w3.<clinit>(Unknown Source:0)
E/AndroidRuntime(30065): ... 33 more
Any help in resolving this issue would be greatly appreciated.
Expected Behavior
No response
How to Reproduce
To reproduce the issue:
-
Ensure you have the latest versions of the
video_player
andapplovin_max
packages in your Flutter app.- video_player: ^2.6.1
- applovin_max: ^2.5.0
-
Create a screen in your app where you have both the video player and the ad.
-
Play a video using the
video_player
package. -
Attempt to load an ad using the AppLovin SDK after the video starts playing.
-
Observe that the app crashes with the following error:
E/AndroidRuntime(30065): FATAL EXCEPTION: pool-16-thread-1
E/AndroidRuntime(30065): Process: com.videodownloader.udownload, PID: 30065
E/AndroidRuntime(30065): java.lang.NoClassDefFoundError: k9.w3
...
Please note that this issue occurs specifically on Android and is not reproducible in debug mode but only in release mode.
It's important to mention that this issue is observed when trying to load the ad after playing a video using the video_player
package. Ads load successfully on other screens, indicating that the issue is specific to the combination of video playback and ad loading.
By following the steps above, developers should be able to understand and reproduce the issue in order to investigate and resolve it effectively.
Additional Info
No response
答案1
得分: 0
解决方案
经过广泛的研究和故障排除,我成功解决了该问题,方法是添加ProGuard规则并修改构建配置。以下是我遵循的步骤:
1. 创建ProGuard规则文件
在android/app
目录下创建一个名为proguard-rules.pro
的文件。此文件将包含必要的ProGuard规则,以保留特定类并防止混淆。
2. 添加ProGuard规则
在proguard-rules.pro
文件中,添加以下ProGuard规则:
-keep class org.schabi.newpipe.extractor.** { *; }
-keep class org.ocpsoft.prettytime.i18n.** { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
-keep class com.google.android.exoplayer2.** { *; }
-dontwarn org.mozilla.javascript.tools.**
-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource
-keep class com.artxdev.** { *; }
-keep class androidx.lifecycle.** { *; }
-keep class org.jaudiotagger.** { *; }
-keep class com.example.audio_tagger.** { *; }
-dontobfuscate
## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
# -keep class com.google.firebase.** { *; } // 如果在项目中使用firebase,请取消注释此行
-keep class com.arthenica.mobileffmpeg.Config {
native <methods>;
void log(long, int, byte[]);
void statistics(long, int, float, float, long , int, double, double);
}
-keep class com.arthenica.mobileffmpeg.AbiDetect {
native <methods>;
}
# OkHttp的规则。从https://github.com/square/okhttp复制粘贴
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
}
这些规则将保留必要的类并防止与混淆相关的任何问题。
3. 修改构建配置
在android/app/build.gradle
文件中,找到buildTypes
部分,并在release
构建类型下添加proguardFiles
指令。将配置更新如下:
buildTypes {
release {
// TODO: 为发布版本构建添加自己的签名配置。
// 现在使用调试密钥进行签名,以便“flutter run --release”正常工作。
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
此修改确保在构建应用的发布版本时应用ProGuard规则。
4. 添加所需的仓库
如果您在播放在线视频时使用newpipeextractor
库,请确保在android/app/build.gradle
文件的顶部添加以下仓库:
repositories {
maven { url "https://jitpack.io" }
mavenCentral()
}
这些仓库是获取newpipeextractor
库所需依赖项的必要部分。
通过按照这些步骤,我成功解决了问题,并防止了应用在视频播放期间加载广告时崩溃。这些更改确保了必需的类得以保留,并防止与混淆相关的任何冲突。
希望这个解决方案对其他遇到类似问题的人有所帮助。
英文:
Solution
After extensive research and troubleshooting, I was able to resolve the issue by adding ProGuard rules and modifying the build configuration. Here are the steps I followed:
1. Create a ProGuard Rule File
Under the android/app
directory, create a file named proguard-rules.pro
. This file will contain the necessary ProGuard rules to retain specific classes and prevent obfuscation.
2. Add ProGuard Rules
Inside the proguard-rules.pro
file, add the following ProGuard rules:
-keep class org.schabi.newpipe.extractor.** { *; }
-keep class org.ocpsoft.prettytime.i18n.** { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
-keep class com.google.android.exoplayer2.** { *; }
-dontwarn org.mozilla.javascript.tools.**
-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource
-keep class com.artxdev.** { *; }
-keep class androidx.lifecycle.** { *; }
-keep class org.jaudiotagger.** { *; }
-keep class com.example.audio_tagger.** { *; }
-dontobfuscate
## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
# -keep class com.google.firebase.** { *; } // uncomment this if you are using firebase in the project
-keep class com.arthenica.mobileffmpeg.Config {
native <methods>;
void log(long, int, byte[]);
void statistics(long, int, float, float, long , int, double, double);
}
-keep class com.arthenica.mobileffmpeg.AbiDetect {
native <methods>;
}
# Rules for OkHttp. Copy-paste from https://github.com/square/okhttp
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
}
These rules will preserve the necessary classes and prevent any issues related to obfuscation.
3. Modify the Build Configuration
Inside the android/app/build.gradle
file, locate the buildTypes
section and add the proguardFiles
directive under the release
build type. Update the configuration as follows:
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
This modification ensures that the ProGuard rules are applied when building the release version of the app.
4. Add Required Repositories
If you're using the newpipeextractor
library for playing online videos, make sure to add the following repositories at the top of the android/app/build.gradle
file:
repositories {
maven { url "https://jitpack.io" }
mavenCentral()
}
These repositories are required to fetch the necessary dependencies for the newpipeextractor
library.
By following these steps, I was able to resolve the issue and prevent the app from crashing when loading ads during video playback. These changes ensure that the required classes are retained and prevent any conflicts related to obfuscation.
I hope this solution helps others facing a similar issue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论