From 7847159a619b852d611c26e66451b66af0f31503 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Wed, 14 Jan 2026 10:44:13 +0800 Subject: [PATCH] =?UTF-8?q?youtube=20player=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=9C=AC=E5=9C=B0lib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +- notification/build.gradle.kts | 3 +- settings.gradle | 2 +- youtube/core/build.gradle | 2 +- youtube/core/consumer-rules.pro | 0 youtube/core/proguard-rules.pro | 136 ++++++++++++++++++ .../src/main/res/raw/ayp_youtube_player.html | 13 ++ youtube/custom-ui/build.gradle | 2 +- youtube/custom-ui/proguard-rules.pro | 115 ++++++++++++++- 9 files changed, 271 insertions(+), 8 deletions(-) create mode 100644 youtube/core/consumer-rules.pro create mode 100644 youtube/core/proguard-rules.pro diff --git a/app/build.gradle b/app/build.gradle index fbf84e1..a9745da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -101,7 +101,9 @@ dependencies { implementation(libs.okhttp.logging) implementation(libs.retrofit) implementation(libs.retrofit.kotlin.serialization) - implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:13.0.0' - implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:custom-ui:13.0.0' +// implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:13.0.0' +// implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:custom-ui:13.0.0' + implementation(project(":youtube:core")) + implementation(project(":youtube:custom-ui")) } \ No newline at end of file diff --git a/notification/build.gradle.kts b/notification/build.gradle.kts index e6dfdd3..c686b14 100644 --- a/notification/build.gradle.kts +++ b/notification/build.gradle.kts @@ -22,8 +22,7 @@ android { release { isMinifyEnabled = false proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } diff --git a/settings.gradle b/settings.gradle index b289317..bb1298e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -32,7 +32,7 @@ rootProject.name = "VidiDin-android" apply from: "./core/core.includes.gradle" -//apply from: "./youtube/youtube.includes.gradle" +apply from: "./youtube/youtube.includes.gradle" include ':app' diff --git a/youtube/core/build.gradle b/youtube/core/build.gradle index a0c48e2..18d442b 100644 --- a/youtube/core/build.gradle +++ b/youtube/core/build.gradle @@ -28,7 +28,7 @@ android { buildTypes { release { - minifyEnabled true + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } diff --git a/youtube/core/consumer-rules.pro b/youtube/core/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/youtube/core/proguard-rules.pro b/youtube/core/proguard-rules.pro new file mode 100644 index 0000000..a66b021 --- /dev/null +++ b/youtube/core/proguard-rules.pro @@ -0,0 +1,136 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + +-dontwarn com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerListener + +# 代码优化迭代次数,默认5次,一般无需修改 +-optimizationpasses 5 +# 混淆时不使用大小写混合的类名 +-dontusemixedcaseclassnames +# 不忽略非公共库的类及其成员 +-dontskipnonpubliclibraryclasses +-dontskipnonpubliclibraryclassmembers +# 不进行预校验(Android不需要,可加快速度) +-dontpreverify +# 打印详细的处理信息,便于调试 +-verbose + +# 混淆时采用的算法(谷歌推荐过滤器) +-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* +# 优化时允许访问并修改有修饰符的类和类的成员 +-allowaccessmodification + +# 保留重要属性:注解(对JSON解析、依赖注入框架关键)、泛型签名、异常信息、源码文件名和行号(便于崩溃追踪) +-keepattributes *Annotation*, Signature, Exceptions, InnerClasses, SourceFile, LineNumberTable + + + + + + +# 保留四大组件、Application等核心类,因其在AndroidManifest.xml中注册,类名不能被混淆[1,2](@ref) +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference + +# 保留自定义View的构造函数,防止在XML布局中被调用时因混淆而出错[2,5](@ref) +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留View的setter和getter方法,以保证属性动画正常工作[2,6](@ref) +-keepclassmembers class * extends android.view.View { + void set*(***); + *** get*(); +} + +# 保留R文件中的静态字段,避免通过反射获取资源ID时失败[2,7](@ref) +-keepclassmembers class **.R$* { + public static ; +} + + + + +# 保留所有Native方法名,确保JNI调用能正确链接[2,3](@ref) +-keepclasseswithmembernames class * { + native ; +} + +# 保留枚举类的方法,枚举类型默认依赖固定的values()和valueOf方法[2,6](@ref) +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# 保留Parcelable序列化接口的Creator字段[2,5](@ref) +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +# 保留Serializable序列化类的特定成员[2,4](@ref) +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# 保留在布局XML中使用的onClick方法[2,3](@ref) +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# 保留通过JavascriptInterface注解暴露给WebView的方法[2,8](@ref) +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + + + + + + +# Gson +-keep class com.google.gson.** { *; } +-keep class sun.misc.Unsafe { *; } +-keep class com.yourpackage.model.** { *; } # 保留你的实体类 + +# OkHttp & Okio +-dontwarn okhttp3.** +-keep class okhttp3.** { *; } +-dontwarn okio.** +-keep class okio.** { *; } + +# Retrofit +-dontwarn retrofit2.** +-keep class retrofit2.** { *; } +-keepattributes Signature, Exceptions + +# 忽略第三方库的警告(如果确定某些警告无害) +-dontwarn android.support.** +-dontwarn androidx.** \ No newline at end of file diff --git a/youtube/core/src/main/res/raw/ayp_youtube_player.html b/youtube/core/src/main/res/raw/ayp_youtube_player.html index 1acf2ea..33d518a 100644 --- a/youtube/core/src/main/res/raw/ayp_youtube_player.html +++ b/youtube/core/src/main/res/raw/ayp_youtube_player.html @@ -190,5 +190,18 @@ YouTubePlayerCallbacks.sendBooleanValue(requestId, isMuted); } + function captureFrame() { + const video = document.getElementById('myVideo'); + const canvas = document.createElement('canvas'); + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + const ctx = canvas.getContext('2d'); + ctx.drawImage(video, 0, 0, canvas.width, canvas.height); + const dataUrl = canvas.toDataURL('image/png'); + if (window.AndroidBridge) { + window.AndroidBridge.onCaptureResult(dataUrl); + } + } + diff --git a/youtube/custom-ui/build.gradle b/youtube/custom-ui/build.gradle index 7cc3a98..7431d67 100644 --- a/youtube/custom-ui/build.gradle +++ b/youtube/custom-ui/build.gradle @@ -29,7 +29,7 @@ android { buildTypes { release { - minifyEnabled true + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } diff --git a/youtube/custom-ui/proguard-rules.pro b/youtube/custom-ui/proguard-rules.pro index e26b63e..a66b021 100644 --- a/youtube/custom-ui/proguard-rules.pro +++ b/youtube/custom-ui/proguard-rules.pro @@ -20,4 +20,117 @@ # hide the original source file name. #-renamesourcefileattribute SourceFile --dontwarn com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerListener \ No newline at end of file +-dontwarn com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerListener + +# 代码优化迭代次数,默认5次,一般无需修改 +-optimizationpasses 5 +# 混淆时不使用大小写混合的类名 +-dontusemixedcaseclassnames +# 不忽略非公共库的类及其成员 +-dontskipnonpubliclibraryclasses +-dontskipnonpubliclibraryclassmembers +# 不进行预校验(Android不需要,可加快速度) +-dontpreverify +# 打印详细的处理信息,便于调试 +-verbose + +# 混淆时采用的算法(谷歌推荐过滤器) +-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* +# 优化时允许访问并修改有修饰符的类和类的成员 +-allowaccessmodification + +# 保留重要属性:注解(对JSON解析、依赖注入框架关键)、泛型签名、异常信息、源码文件名和行号(便于崩溃追踪) +-keepattributes *Annotation*, Signature, Exceptions, InnerClasses, SourceFile, LineNumberTable + + + + + + +# 保留四大组件、Application等核心类,因其在AndroidManifest.xml中注册,类名不能被混淆[1,2](@ref) +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference + +# 保留自定义View的构造函数,防止在XML布局中被调用时因混淆而出错[2,5](@ref) +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留View的setter和getter方法,以保证属性动画正常工作[2,6](@ref) +-keepclassmembers class * extends android.view.View { + void set*(***); + *** get*(); +} + +# 保留R文件中的静态字段,避免通过反射获取资源ID时失败[2,7](@ref) +-keepclassmembers class **.R$* { + public static ; +} + + + + +# 保留所有Native方法名,确保JNI调用能正确链接[2,3](@ref) +-keepclasseswithmembernames class * { + native ; +} + +# 保留枚举类的方法,枚举类型默认依赖固定的values()和valueOf方法[2,6](@ref) +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# 保留Parcelable序列化接口的Creator字段[2,5](@ref) +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +# 保留Serializable序列化类的特定成员[2,4](@ref) +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# 保留在布局XML中使用的onClick方法[2,3](@ref) +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# 保留通过JavascriptInterface注解暴露给WebView的方法[2,8](@ref) +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + + + + + + +# Gson +-keep class com.google.gson.** { *; } +-keep class sun.misc.Unsafe { *; } +-keep class com.yourpackage.model.** { *; } # 保留你的实体类 + +# OkHttp & Okio +-dontwarn okhttp3.** +-keep class okhttp3.** { *; } +-dontwarn okio.** +-keep class okio.** { *; } + +# Retrofit +-dontwarn retrofit2.** +-keep class retrofit2.** { *; } +-keepattributes Signature, Exceptions + +# 忽略第三方库的警告(如果确定某些警告无害) +-dontwarn android.support.** +-dontwarn androidx.** \ No newline at end of file