build.gradle 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. import java.text.SimpleDateFormat
  2. plugins {
  3. id 'com.android.application'
  4. id 'org.jetbrains.kotlin.android'
  5. id 'com.google.gms.google-services'
  6. id 'com.google.firebase.crashlytics'
  7. id 'org.jetbrains.kotlin.kapt'
  8. id 'com.tencent.vasdolly'
  9. id 'kotlin-parcelize'
  10. id("com.dropbox.dependency-guard") version "0.5.0"
  11. id("com.google.devtools.ksp") version "1.9.10-1.0.13"//引入ksp插件
  12. }
  13. apply plugin: 'com.wenext.bundle.local.test'
  14. apply plugin: "android.aop"
  15. def isEnableTrace = project.hasProperty("ENABLE_TRACE") && project.ENABLE_TRACE.toBoolean()
  16. if (isEnableTrace) {
  17. apply plugin: "LancerTracePlugin"
  18. }
  19. println("isEnableTrace: "+ isEnableTrace)
  20. def isOfficial = project.OFFICIAL == "true"
  21. if (!isOfficial) {
  22. apply from: "proguard-log.gradle"
  23. }
  24. println("isOfficial:" + isOfficial)
  25. println("IS_RELEASE:" + project.IS_RELEASE)
  26. //apply from: "aab_res_guard.gradle"
  27. apply from: "zip-audio-to-assets.gradle"
  28. apply from: "dependencyGuard.gradle"
  29. def hookConfigByLocalProperties(String localKey, String defaultValue) {
  30. String config = readLocalProperties(localKey)
  31. if (config != null) {
  32. System.out.println("hookConfigByLocalProperties($localKey) ==> $config")
  33. return config
  34. }
  35. return defaultValue
  36. }
  37. def readLocalProperties(String key) {
  38. File file = rootProject.file('local.properties')
  39. if (file.exists()) {
  40. //加载资源
  41. InputStream inputStream = rootProject.file('local.properties').newDataInputStream();
  42. Properties properties = new Properties()
  43. properties.load(inputStream)
  44. if (properties.containsKey(key)) {
  45. return properties.getProperty(key)
  46. }
  47. }
  48. return null
  49. }
  50. android {
  51. namespace 'com.adealink.weparty'
  52. compileSdk libs.versions.compileSdk.get().toInteger()
  53. defaultConfig {
  54. applicationId "com.partyjoy.yoki"
  55. minSdk libs.versions.minSdk.get().toInteger()
  56. targetSdk libs.versions.targetSdk.get().toInteger()
  57. multiDexEnabled true
  58. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  59. // resConfigs "zh", "zh_TW", "en", "ar", "hi", "tr", "th", "bn", "vi", "ur", "id", "ms", "tl", "pt", "es", "ru", "kk", "ky", "tk", "tg", "uz"
  60. resConfigs "zh", "en", "ar"
  61. ndk {
  62. abiFilters "armeabi-v7a"
  63. abiFilters "arm64-v8a"
  64. debugSymbolLevel 'FULL'
  65. }
  66. //指定room.schemaLocation生成的文件路径 处理Room 警告 Schema export Error
  67. javaCompileOptions {
  68. annotationProcessorOptions {
  69. arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
  70. }
  71. }
  72. def jvc = project.hasProperty('JKS_VERSION_CODE') ? project.JKS_VERSION_CODE : ""
  73. def jvn = project.hasProperty('JKS_VERSION_NAME') ? project.JKS_VERSION_NAME : ""
  74. def localVC = hookConfigByLocalProperties("VERSION_CODE", VERSION_CODE)
  75. def localVN = hookConfigByLocalProperties("VERSION_NAME", VERSION_NAME)
  76. def vc = jvc != "" ? project.JKS_VERSION_CODE.toInteger() : localVC.toInteger()
  77. def vn = jvn != "" ? project.JKS_VERSION_NAME : localVN
  78. println("version_code = " + vc)
  79. println("version_name = " + vn)
  80. versionCode vc
  81. versionName vn
  82. manifestPlaceholders = [
  83. fbAppId : "623244786994791",
  84. fbClientToken : "d4f871dc66d01eb357146318d6b63a09",
  85. deepLinkScheme : "partyki",
  86. deepLinkHost : "yoki",
  87. httpDeepLinkHost: "yoki.chat"
  88. ]
  89. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', (isOfficial ? 'proguard-log-empty.pro' : 'proguard-log.pro')
  90. buildConfigField("boolean", "OFFICIAL", project.OFFICIAL)
  91. buildConfigField("boolean", "IS_RELEASE", hookConfigByLocalProperties("IS_RELEASE", IS_RELEASE))
  92. buildConfigField("String", "HTTPS_WEB_HOST", '"https://web.yoki.chat"')
  93. buildConfigField("String", "AUTH_APPLE_PATH", '"/web/yoki-auth/apple"')
  94. buildConfigField("String", "AGORA_APP_ID", '"a5233b5e42534b77bbabf2ca8ac95215"')
  95. buildConfigField("String", "QTT_APP_KEY", '"baa9f1307e2e8ee02742d960828b5c50"')
  96. buildConfigField("String", "HTTP_DEEP_LINK_HOST", '"yoki.chat"')
  97. buildConfigField("String", "DEEP_LINK_SCHEME", '"partyki"')
  98. buildConfigField("String", "DEEP_LINK_HOST", '"yoki"')
  99. buildConfigField("String", "UTM_FACEBOOK_KEY", '"c4ea5534613d8b3cdcd5b80097989f9eb2414138aa8e49ddfbc458cd5e50f1a6"')
  100. buildConfigField("String", "TIKTOK_CLIENT_KEY", '"aw8fs7e6lnjmfipk"')
  101. buildConfigField("String", "TIKTOK_REDIRECT_URL", '"https://yoki.chat/applink/login"')
  102. //trtc
  103. buildConfigField("Integer", "TRTC_APP_ID", "1721001739")
  104. buildConfigField("String", "TRTC_SECRET_KEY", '"ea5b233540129b2700b059d4fbb0c55a21d8e8bd69599b1ee9ccc9ed3b9142bb"')
  105. //trtc debug
  106. buildConfigField("Integer", "TRTC_APP_ID_DEBUG", "1600073604")
  107. buildConfigField("String", "TRTC_SECRET_KEY_DEBUG", '"f7c992cc3b8fc0273716da5ad59745cf188594c695c9191806d80532914f2aa1"')
  108. }
  109. signingConfigs {
  110. debug {
  111. keyAlias "yoki-keystore-debug"
  112. keyPassword "yoki654321"
  113. storePassword "yoki654321"
  114. storeFile file('../keystore/debug/debug.keystore')
  115. }
  116. release {
  117. keyAlias "yoki-keystore"
  118. keyPassword "yoki654321"
  119. storePassword "yoki654321"
  120. storeFile file("../keystore/release/release-sign.keystore")
  121. }
  122. }
  123. buildTypes {
  124. debug {
  125. minifyEnabled false
  126. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  127. signingConfig signingConfigs.debug
  128. firebaseCrashlytics {
  129. mappingFileUploadEnabled false
  130. }
  131. }
  132. release {
  133. debuggable false
  134. minifyEnabled true
  135. signingConfig signingConfigs.release
  136. firebaseCrashlytics {
  137. mappingFileUploadEnabled !isOfficial
  138. nativeSymbolUploadEnabled !isOfficial
  139. // strippedNativeLibsDir 'build/intermediates/stripped_native_libs/release/out/lib'
  140. // unstrippedNativeLibsDir 'build/intermediates/merged_native_libs/release/out/lib'
  141. }
  142. }
  143. }
  144. compileOptions {
  145. sourceCompatibility JavaVersion.VERSION_17
  146. targetCompatibility JavaVersion.VERSION_17
  147. coreLibraryDesugaringEnabled true
  148. }
  149. compileOptions {
  150. sourceCompatibility JavaVersion.VERSION_17
  151. targetCompatibility JavaVersion.VERSION_17
  152. }
  153. kotlinOptions {
  154. jvmTarget = JavaVersion.VERSION_17.majorVersion
  155. }
  156. bundle {
  157. language {
  158. enableSplit = false
  159. }
  160. density {
  161. enableSplit = false
  162. }
  163. abi {
  164. enableSplit = true
  165. }
  166. }
  167. sourceSets {
  168. main {
  169. jniLibs {
  170. srcDir 'libs'
  171. }
  172. }
  173. }
  174. packagingOptions {
  175. exclude '**/*.kotlin_*'
  176. pickFirst('lib/armeabi-v7a/libc++_shared.so')
  177. pickFirst('lib/arm64-v8a/libc++_shared.so')
  178. pickFirst('lib/x86/libc++_shared.so')
  179. pickFirst('lib/x86_64/libc++_shared.so')
  180. }
  181. dynamicFeatures = [':module:account',
  182. ':module:room',
  183. ':module:follow',
  184. ':module:profile',
  185. ':module:setting',
  186. ':module:gift',
  187. ':module:wallet',
  188. ':module:webview',
  189. ':module:emotion',
  190. ':module:message',
  191. ':module:rank',
  192. ':module:game',
  193. ':module:music',
  194. ':module:theme',
  195. ':module:level',
  196. ':module:operation',
  197. ':module:entereffect',
  198. ':module:store',
  199. ':module:headline',
  200. ':module:search',
  201. ':module:share',
  202. ':module:image',
  203. ':module:call',
  204. ':module:anchor',
  205. ':module:party',
  206. ':module:excel',
  207. ':module:email',
  208. ':module:superadmin',
  209. ':module:backpack',
  210. ':module:pk',
  211. ':module:skin',
  212. ':module:couple',
  213. ':module:family',
  214. ':module:attribution',
  215. ':module:userprotect',
  216. ':module:medal',
  217. ':module:micgrab',
  218. ':module:moment',
  219. ':module:youtube',
  220. ':module:visitors',
  221. ':module:youtube',
  222. ':module:gamehub:uno',
  223. ':module:gamehub:carrom',
  224. ':module:gamehub:domino',
  225. ':module:gamehub:ludo',
  226. ':module:certification',
  227. ]
  228. buildFeatures {
  229. viewBinding true
  230. buildConfig true
  231. }
  232. configurations.configureEach {
  233. exclude group: 'com.facebook.fresco', module: 'drawee'
  234. exclude group: 'com.facebook.fresco', module: 'ui-core'
  235. }
  236. android.applicationVariants.all { variant ->
  237. def variantNameCap = variant.name.capitalize()
  238. def taskName = "sign${variantNameCap}Bundle"
  239. def variantName = variant.name
  240. def flavorName = variant.flavorName
  241. def buildTypeName = variant.buildType.name
  242. tasks.named(taskName).configure { task ->
  243. def file = task.finalBundleFile.get().asFile
  244. def projectName = rootProject.name
  245. def versionCode = variant.versionCode
  246. def versionName = variant.versionName
  247. def timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
  248. // 构造文件名:projectName-flavor-buildType-versionCode-versionName-timestamp.aab
  249. def nameParts = []
  250. nameParts << "app"
  251. nameParts << projectName
  252. if (flavorName) {
  253. nameParts << flavorName
  254. }
  255. nameParts << buildTypeName
  256. nameParts << "v${versionName}"
  257. nameParts << "(${versionCode})"
  258. nameParts << timestamp
  259. def finalFileName = "${nameParts.join('-')}.aab"
  260. def finalFile = new File(file.parentFile, finalFileName)
  261. task.finalBundleFile.set(finalFile)
  262. }
  263. }
  264. }
  265. gradle.taskGraph.addTaskExecutionListener(new TaskExecutionListener() {
  266. @Override
  267. void beforeExecute(Task task) {
  268. }
  269. @Override
  270. void afterExecute(Task task, TaskState taskState) {
  271. if (task.name.equalsIgnoreCase("bundleDebug")
  272. || task.name.equalsIgnoreCase("bundleRelease")) {
  273. copy {
  274. from 'build/intermediates/intermediary_bundle/'
  275. into 'build/outputs/bundle/'
  276. duplicatesStrategy DuplicatesStrategy.FAIL
  277. }
  278. println("afterExecute " + task.name)
  279. def aabDir = project.getBuildDir().absolutePath + '/outputs/bundle'
  280. fileTree(dir: aabDir, include: '*/*.aab').each { File file ->
  281. println(file.absolutePath)
  282. def cmd = []
  283. cmd << "java"
  284. cmd << "-jar"
  285. cmd << "${project.rootDir}/tool/bundletool.jar"
  286. cmd << "build-apks"
  287. cmd << "--bundle=" + file.absolutePath
  288. cmd << "--output=" + file.parent + File.separator + file.name.replace(".aab", "-split.apks")
  289. cmd << "--overwrite"
  290. cmd << "--mode=universal"
  291. if (task.name.equalsIgnoreCase("bundleDebug")) {
  292. cmd << "--ks=" + android.signingConfigs.debug.storeFile
  293. cmd << "--ks-pass=pass:" + android.signingConfigs.debug.storePassword
  294. cmd << "--ks-key-alias=" + android.signingConfigs.debug.keyAlias
  295. cmd << "--key-pass=pass:" + android.signingConfigs.debug.keyPassword
  296. } else {
  297. def keystoreProperties = new Properties()
  298. keystoreProperties.load(new FileInputStream(rootProject.file('keystore.properties')))
  299. cmd << "--ks=" + keystoreProperties.storeFile
  300. cmd << "--ks-pass=pass:" + keystoreProperties.storePassword
  301. cmd << "--ks-key-alias=" + keystoreProperties.keyAlias
  302. cmd << "--key-pass=pass:" + keystoreProperties.keyPassword
  303. }
  304. exec {
  305. commandLine cmd
  306. }
  307. }
  308. println("after build apks")
  309. }
  310. }
  311. })
  312. dependencies {
  313. api fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
  314. //kotlin
  315. implementation libs.kotlin.stdlib
  316. coreLibraryDesugaring libs.desugar.jdk.libs
  317. //androidx
  318. api libs.androidx.core.ktx
  319. api libs.androidx.appcompat
  320. api libs.androidx.constraint.layout
  321. api libs.androidx.activity
  322. api libs.androidx.fragment.ktx
  323. api libs.androidx.viewpager2
  324. api libs.androidx.lifecycle.livedata.ktx
  325. api libs.androidx.lifecycle.viewmodel.ktx
  326. api libs.androidx.exifinterface
  327. implementation libs.androidx.multidex
  328. implementation libs.androidx.vectordrawable
  329. implementation libs.androidx.work.manager
  330. api libs.androidx.room.runtime
  331. api libs.androidx.room.ktx
  332. api libs.flexbox
  333. kapt libs.androidx.room.compiler
  334. implementation libs.androidx.camera.core
  335. implementation libs.androidx.camera.camera2
  336. implementation libs.androidx.camera.lifecycle
  337. implementation libs.androidx.camera.video
  338. implementation libs.androidx.camera.view
  339. api libs.androidx.webkit
  340. //android
  341. implementation libs.android.material
  342. implementation libs.android.install.referrer
  343. //google play core
  344. implementation libs.play.feature.delivery
  345. implementation libs.play.feature.delivery.ktx
  346. implementation libs.play.app.update
  347. implementation libs.play.app.update.ktx
  348. //facebook
  349. implementation libs.facebook.android.sdk
  350. //appsflyer
  351. implementation libs.appsflyer
  352. //java
  353. implementation libs.rxjava
  354. //channel
  355. implementation libs.tencent.vasdolly.helper
  356. //firebase
  357. implementation platform(libs.firebase.bom)
  358. implementation libs.firebase.analytics
  359. implementation libs.firebase.crashlytics
  360. implementation libs.firebase.crashlytics.ndk
  361. implementation libs.firebase.dynamic.link
  362. implementation libs.firebase.messaging
  363. //gson
  364. implementation libs.gson
  365. //other
  366. api libs.smart.refresh.layout.kernel
  367. api libs.smart.refresh.header.material
  368. api libs.smart.refresh.footer.classics
  369. api libs.media3.exoplayer
  370. api libs.media3.exoplayer.dash
  371. api libs.media3.ui
  372. // media3 v1.4.1 guava 单独设置, 待media3更新后移除
  373. implementation libs.guava
  374. api libs.video.processor
  375. api libs.payermax
  376. api libs.rxjava
  377. //image
  378. api libs.compressor
  379. //tencent rtc
  380. api libs.tencent.tui.core
  381. //frame
  382. api platform(libs.frame.bom)
  383. api libs.frame.tcturing
  384. api libs.frame.animplayer
  385. api libs.frame.drawee
  386. api libs.frame.image
  387. api libs.frame.mvvm
  388. api libs.frame.util
  389. api libs.frame.zero
  390. api libs.frame.base
  391. api libs.frame.network
  392. api libs.frame.retrofit
  393. api libs.frame.oss
  394. api libs.frame.download
  395. api libs.frame.sound
  396. api libs.frame.game
  397. api libs.frame.autosize
  398. api libs.frame.spi
  399. api libs.frame.data
  400. api libs.frame.aab
  401. api libs.frame.coroutine
  402. api libs.frame.storage
  403. api libs.frame.log
  404. api libs.frame.statistics
  405. api libs.frame.googleservice
  406. api libs.frame.deviceid
  407. api libs.frame.security
  408. api libs.frame.guide
  409. api libs.frame.effect
  410. api libs.frame.svga
  411. api libs.frame.debug
  412. api project(":frame:room")
  413. api project(":frame:imkit")
  414. api libs.frame.startup
  415. api libs.frame.locale
  416. api libs.frame.push
  417. api libs.frame.media
  418. implementation libs.frame.agorartc
  419. implementation libs.frame.trtc.pro
  420. api libs.frame.share
  421. api libs.frame.dot
  422. api libs.frame.crash
  423. api libs.frame.apm
  424. api libs.frame.audio
  425. api libs.frame.tceffect
  426. api libs.frame.router.annotation
  427. api libs.frame.router.api
  428. kapt libs.frame.router.compiler
  429. implementation libs.toolargetool
  430. implementation(libs.rangeseekbar)
  431. // debugApi "com.tuzhenlei:crashhandler:1.0.1"
  432. // debugApi 'cat.ereza:customactivityoncrash:2.3.0'
  433. // debugImplementation "io.github.yvescheung:Uinspector:2.0.20"
  434. // debugImplementation "io.github.yvescheung:Uinspector-optional-viewmodel:2.0.20"
  435. // debugImplementation "io.github.yvescheung:Uinspector-optional-fresco:2.0.20"
  436. // debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
  437. //test
  438. testImplementation libs.junit
  439. androidTestImplementation libs.androidx.junit
  440. androidTestImplementation libs.androidx.espresso.core
  441. if (isEnableTrace){
  442. implementation (libs.frame.trace.api)
  443. }
  444. api libs.flexbox
  445. implementation 'io.github.flyjingfish:androidaop-core:2.7.0'
  446. ksp 'io.github.flyjingfish:androidaop-apt:2.7.0'
  447. }
  448. dependencyGuard {
  449. configuration("releaseRuntimeClasspath")
  450. }