apply plugin: 'com.android.application' apply plugin: 'img-optimizer' apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'com.alibaba.arouter' apply from: "../package_config.gradle" apply plugin: 'com.google.firebase.crashlytics' android { namespace "myname.pdlive.shayu" compileSdk rootProject.ext.android.compileSdkVersion packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" //旧美颜so exclude 'lib/arm64-v8a/libxeengine.so' exclude 'lib/arm64-v8a/libmmcv_base.so' exclude 'lib/arm64-v8a/libmmcrypto.so' exclude 'lib/arm64-v8a/libMNN.so' exclude 'lib/arm64-v8a/libc++_shared.so' exclude 'lib/arm64-v8a/libmmcv_api_base.so' exclude 'lib/arm64-v8a/libmmcv_api_beauty.so' exclude 'lib/arm64-v8a/libmmcv_api_bodylandmark.so' exclude 'lib/arm64-v8a/libmmcv_api_express.so' exclude 'lib/arm64-v8a/libmmcv_api_faceattributes.so' exclude 'lib/arm64-v8a/libmmcv_api_facefeatures.so' exclude 'lib/arm64-v8a/libmmcv_api_faceprocessor.so' exclude 'lib/arm64-v8a/libmmcv_api_facerecognition.so' exclude 'lib/arm64-v8a/libmmcv_api_handgesture.so' exclude 'lib/arm64-v8a/libmmcv_api_imagequality.so' exclude 'lib/arm64-v8a/libmmcv_api_objectdetect.so' exclude 'lib/arm64-v8a/libmmcv_api_segmentation.so' exclude 'lib/arm64-v8a/libmmcv_api_videoprocessor.so' exclude 'lib/arm64-v8a/libmmlic.so' exclude 'lib/arm64-v8a/libMNN_CL.so' exclude 'lib/arm64-v8a/libMNN_Express.so' exclude 'lib/armeabi-v7a/libxeengine.so' exclude 'lib/armeabi-v7a/libmmcv_base.so' exclude 'lib/armeabi-v7a/libmmcrypto.so' exclude 'lib/armeabi-v7a/libMNN.so' exclude 'lib/armeabi-v7a/libc++_shared.so' exclude 'lib/armeabi-v7a/libmmcv_api_base.so' exclude 'lib/armeabi-v7a/libmmcv_api_beauty.so' exclude 'lib/armeabi-v7a/libmmcv_api_bodylandmark.so' exclude 'lib/armeabi-v7a/libmmcv_api_express.so' exclude 'lib/armeabi-v7a/libmmcv_api_faceattributes.so' exclude 'lib/armeabi-v7a/libmmcv_api_facefeatures.so' exclude 'lib/armeabi-v7a/libmmcv_api_faceprocessor.so' exclude 'lib/armeabi-v7a/libmmcv_api_facerecognition.so' exclude 'lib/armeabi-v7a/libmmcv_api_handgesture.so' exclude 'lib/armeabi-v7a/libmmcv_api_imagequality.so' exclude 'lib/armeabi-v7a/libmmcv_api_objectdetect.so' exclude 'lib/armeabi-v7a/libmmcv_api_segmentation.so' exclude 'lib/armeabi-v7a/libmmcv_api_videoprocessor.so' exclude 'lib/armeabi-v7a/libmmlic.so' exclude 'lib/armeabi-v7a/libMNN_CL.so' exclude 'lib/armeabi-v7a/libMNN_Express.so' /*if (rootProject.ext.manifestPlaceholders.isGooglePlay == 0) { // 链接包剔除相心美颜SO exclude 'lib/armeabi-v7a/libCNamaSDK.so' exclude 'lib/armeabi-v7a/libfuai.so' exclude 'lib/arm64-v8a/libCNamaSDK.so' exclude 'lib/arm64-v8a/libfuai.so' // 剔除声网X86架构的so exclude 'lib/x86/libagora-core.so' exclude 'lib/x86/libagora-ffmpeg.so' exclude 'lib/x86/libagora-fdkaac.so' exclude 'lib/x86/libagora-soundtouch.so' exclude 'lib/x86/libagora-rtc-sdk.so' *//* exclude 'lib/x86/libagora_ai_echo_cancellation_extension.so' exclude 'lib/x86/libagora_ai_noise_suppression_extension.so' exclude 'lib/x86/libagora_audio_beauty_extension.so' exclude 'lib/x86/libagora_clear_vision_extension.so' exclude 'lib/x86/libagora_content_inspect_extension.so' exclude 'lib/x86/libagora_face_detection_extension.so' exclude 'lib/x86/libagora_face_capture_extension.so' exclude 'lib/x86/libagora_lip_sync_extension.so' exclude 'lib/x86/libagora_screen_capture_extension.so' exclude 'lib/x86/libagora_segmentation_extension.so' exclude 'lib/x86/libagora_spatial_audio_extension.so' exclude 'lib/x86/libagora_video_av1_decoder_extension.so' exclude 'lib/x86/libagora_video_decoder_extension.so' exclude 'lib/x86/libagora_video_encoder_extension.so' exclude 'lib/x86/libagora_video_quality_analyzer_extension.so' exclude 'lib/x86/libagora_video_dec.so' exclude 'lib/x86/libagora_video_enc.so'/* exclude 'lib/x86_64/libagora-core.so' exclude 'lib/x86_64/libagora-ffmpeg.so' exclude 'lib/x86_64/libagora-fdkaac.so' exclude 'lib/x86_64/libagora-soundtouch.so' exclude 'lib/x86_64/libagora-rtc-sdk.so' /* exclude 'lib/x86_64/libagora_clear_vision_extension.so' exclude 'lib/x86_64/libagora_segmentation_extension.so' exclude 'lib/x86_64/libagora_screen_capture_extension.so' exclude 'lib/x86_64/libagora_audio_beauty_extension.so' exclude 'lib/x86_64/libagora_spatial_audio_extension.so' exclude 'lib/x86_64/libagora_video_decoder_extension.so' exclude 'lib/x86_64/libagora_video_encoder_extension.so' exclude 'lib/x86_64/libagora_video_av1_decoder_extension.so' exclude 'lib/x86_64/libagora_content_inspect_extension.so' exclude 'lib/x86_64/libagora_video_quality_analyzer_extension.so' exclude 'lib/x86_64/libagora_face_detection_extension.so' exclude 'lib/x86_64/libagora_face_capture_extension.so' exclude 'lib/x86_64/libagora_ai_noise_suppression_extension.so' exclude 'lib/x86_64/libagora_ai_echo_cancellation_extension.so' exclude 'lib/x86_64/libagora_lip_sync_extension.so' exclude 'lib/x86_64/libagora_video_dec.so' exclude 'lib/x86_64/libagora_video_enc.so' *//* }*/ } compileOptions { sourceCompatibility JavaVersion.VERSION_18 targetCompatibility JavaVersion.VERSION_18 } buildFeatures { buildConfig = true } applicationVariants.all { variant -> // 根据渠道配置删除美颜so文件 if (variant.flavorName == "link_test" || variant.flavorName == "link_online") { println "variant.flavorName:${variant.flavorName}" println "variant.name:${variant.name}" // 这里使用 mergeNativeLibs 任务,它会在文件合并后执行 def taskName = "merge${variant.name.capitalize()}NativeLibs" tasks.matching { it.name == taskName }.configureEach { task -> task.doLast { def soFiles = [ file("${buildDir}/intermediates/merged_native_libs/${variant.name}/merge${variant.name.capitalize()}NativeLibs/out/lib/armeabi-v7a/libCNamaSDK.so"), file("${buildDir}/intermediates/merged_native_libs/${variant.name}/merge${variant.name.capitalize()}NativeLibs/out/lib/armeabi-v7a/libfuai.so"), file("${buildDir}/intermediates/merged_native_libs/${variant.name}/merge${variant.name.capitalize()}NativeLibs/out/lib/arm64-v8a/libCNamaSDK.so"), file("${buildDir}/intermediates/merged_native_libs/${variant.name}/merge${variant.name.capitalize()}NativeLibs/out/lib/arm64-v8a/libfuai.so") ] soFiles.each { soFile -> if (soFile.exists()) { soFile.delete() println "Deleted ${soFile.name} for ${variant.flavorName}" } else { println "File not found: ${soFile.path}" } } } } } println "清空build文件夹"; for (final def project in rootProject.getAllprojects()) { def name = variant.name.replace('Debug', '').replace('Release', '').toLowerCase() //delete project.buildDir delete project.rootDir.absolutePath+File.separator+"app"+File.separator+name //println project.buildDir } //delete project.rootDir.absolutePath + File.separator + "outputs" String variantName = variant.name.capitalize() def processManifestTask = project.tasks.getByName("process${variantName}Manifest") processManifestTask.doLast { pm -> // String manifestPath = "build/intermediates/bundle_manifest/google_onlineRelease/bundle-manifest/AndroidManifest.xml" String manifestPath = "build/intermediates/merged_manifests/${variant.name}/process${variantName}Manifest/AndroidManifest.xml" def isGooglePlay = !variant.name.contains("link") println "variant = ${variant.name}" println "谷歌版本:" + isGooglePlay println "文件存在" + file(manifestPath).exists() println "" + (isGooglePlay) println "" + (file(manifestPath).exists() && isGooglePlay) if (file(manifestPath).exists() && isGooglePlay) { def manifestContent = file(manifestPath).getText() println "移除权限" manifestContent = manifestContent.replace('', '') manifestContent = manifestContent.replace('android.permission.REQUEST_INSTALL_PACKAGES', '') file(manifestPath).write(manifestContent) } else { print "not Exists = " + manifestPath } manifestPath = "build/intermediates/merged_manifests/google_onlineRelease/processReleaseManifest/AndroidManifest.xml" if (file(manifestPath).exists() && isGooglePlay) { def manifestContent = file(manifestPath).getText() println "移除权限2" manifestContent = manifestContent.replace('', '') manifestContent = manifestContent.replace('android.permission.REQUEST_INSTALL_PACKAGES', '') file(manifestPath).write(manifestContent) } } variant.mergeAssetsProvider.configure { doLast { delete(fileTree(dir: outputDir, includes: ['model/ai_bgseg_green.bundle', //'model/ai_face_processor.bundle', //'model/ai_face_processor_lite.bundle', 'model/ai_hairseg.bundle', 'model/ai_hand_processor.bundle', 'model/ai_human_processor.bundle', 'model/ai_human_processor_gpu.bundle', 'model/ai_human_processor_mb_fast.bundle', 'graphics/body_slim.bundle', 'graphics/controller_cpp.bundle', //'graphics/face_beautification.bundle', 'graphics/face_makeup.bundle', 'graphics/fuzzytoonfilter.bundle', 'graphics/fxaa.bundle', 'graphics/tongue.bundle', //旧美颜 'model-all.zip', 'filterData.zip', 'KSYResource/*', 'Resources/*', 'Asset/*', 'image_effect_shaders/*', 'internal/*' //美颜基础组件 ])) println "isPluginModel = " + rootProject.ext.manifestPlaceholders.isPluginModel if (rootProject.ext.manifestPlaceholders.isPluginModel) { delete(fileTree(dir: outputDir, includes: ['model/ai_face_processor.bundle', 'graphics/face_beautification.bundle'])) } else { println "不删除bundle" } } } variant.assemble.doLast { vt -> def channel = '' def server = '' if (variant.name.contains('huawei')) { channel = "华为" } else if (variant.name.contains('samsung')) { channel = "三星" } else if (variant.name.contains('google')) { channel = "谷歌" } else { channel = "链接" } if (variant.name.contains('online')) { server = '正式服' } else { server = '测试服' } def fileName = "[${new Date().format("yyyy-MM-dd HHmmss", TimeZone.getTimeZone("GMT+8"))}]PoYo-${defaultConfig.versionName}-${defaultConfig.versionCode}-${channel}-${server}-${variant.buildType.name}.apk" variant.outputs.forEach { fe -> copy { from fe.outputFile into file("${project.rootDir}\\outputs\\apk\\") rename { fn -> fileName } } } } tasks.named("sign${variant.name.capitalize()}Bundle", com.android.build.gradle.internal.tasks.FinalizeBundleTask) { File file = finalBundleFile.asFile.get() def channel = '' def server = '' if (variant.name.startsWith('huawei')) { channel = "华为" } else if (variant.name.startsWith('samsung')) { channel = "三星" } else if (variant.name.startsWith('google')) { channel = "谷歌" } else { channel = "链接" } if (variant.name.contains('online')) { server = '正式服' } else { server = '测试服' } def fileName = "[${new Date().format("yyyy-MM-dd HHmmss", TimeZone.getTimeZone("GMT+8"))}]PoYo-${defaultConfig.versionName}-${defaultConfig.versionCode}-${channel}-${server}-${variant.buildType.name}.aab" File finalFile = new File("${project.rootDir}\\outputs\\aab", fileName) finalBundleFile.set(finalFile) } } signingConfigs { release { keyAlias 'poyo' keyPassword 'poyolive' storeFile file('../py.jks') storePassword 'poyolive' } //陌陌本地配置需要 config {//TODO BEAUTYSDK 这里需要配置keystore相关信息 keyAlias 'poyo' keyPassword 'poyolive' storeFile file('../py.jks')//keystore的存放路径 storePassword 'poyolive' v2SigningEnabled true // android 5.0-8.0,必须用V2,否则会有安全问题 v1SigningEnabled true } } aaptOptions { cruncherEnabled = false useNewCruncher = false } defaultConfig { // applicationId "myname.pdlive.shayu" applicationId "com.pdlive.shayu" minSdkVersion rootProject.ext.android.minSdkVersion //版本在这里修改 targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders multiDexEnabled true ndk { Gradle gradle = getGradle() String tskReqStr = gradle.getStartParameter().getTaskRequests().args.toString() println("处理ndk 版本 = " + tskReqStr) def isLink = tskReqStr.contains("Link") if (isLink) {//移除32位so库可以有效降低包体大小,等需要时再弄 // abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" abiFilters "armeabi-v7a", "arm64-v8a" println("打包ndk 链接") } else { abiFilters "armeabi-v7a", "arm64-v8a" // abiFilters "arm64-v8a" println("打包ndk其他") } } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } buildTypes { release { minifyEnabled true shrinkResources true zipAlignEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release firebaseCrashlytics{ mappingFileUploadEnabled = true } } debug { minifyEnabled false shrinkResources false zipAlignEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release firebaseCrashlytics{ mappingFileUploadEnabled = false } } } lintOptions { checkReleaseBuilds false abortOnError false } } repositories { flatDir { dirs 'libs', '../libs' } } dependencies { implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) //implementation platform('com.google.firebase:firebase-bom:30.5.0') //implementation 'com.google.firebase:firebase-crashlytics' //直播 api project(':main') //短视频 api project(':video') annotationProcessor rootProject.ext.dependencies["arouter-compiler"] // implementation rootProject.ext.dependencies["leakcanary"] //debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' }