build.gradle 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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. }
  148. compileOptions {
  149. sourceCompatibility JavaVersion.VERSION_17
  150. targetCompatibility JavaVersion.VERSION_17
  151. }
  152. kotlinOptions {
  153. jvmTarget = JavaVersion.VERSION_17.majorVersion
  154. }
  155. bundle {
  156. language {
  157. enableSplit = false
  158. }
  159. density {
  160. enableSplit = false
  161. }
  162. abi {
  163. enableSplit = true
  164. }
  165. }
  166. sourceSets {
  167. main {
  168. jniLibs {
  169. srcDir 'libs'
  170. }
  171. }
  172. }
  173. packagingOptions {
  174. exclude '**/*.kotlin_*'
  175. pickFirst('lib/armeabi-v7a/libc++_shared.so')
  176. pickFirst('lib/arm64-v8a/libc++_shared.so')
  177. pickFirst('lib/x86/libc++_shared.so')
  178. pickFirst('lib/x86_64/libc++_shared.so')
  179. }
  180. dynamicFeatures = [':module:account',
  181. ':module:room',
  182. ':module:follow',
  183. ':module:profile',
  184. ':module:setting',
  185. ':module:gift',
  186. ':module:wallet',
  187. ':module:webview',
  188. ':module:emotion',
  189. ':module:message',
  190. ':module:rank',
  191. ':module:game',
  192. ':module:music',
  193. ':module:theme',
  194. ':module:level',
  195. ':module:operation',
  196. ':module:entereffect',
  197. ':module:store',
  198. ':module:headline',
  199. ':module:search',
  200. ':module:share',
  201. ':module:image',
  202. ':module:call',
  203. ':module:anchor',
  204. ':module:party',
  205. ':module:excel',
  206. ':module:email',
  207. ':module:superadmin',
  208. ':module:backpack',
  209. ':module:pk',
  210. ':module:skin',
  211. ':module:couple',
  212. ':module:family',
  213. ':module:attribution',
  214. ':module:userprotect',
  215. ':module:medal',
  216. ':module:micgrab',
  217. ':module:moment',
  218. ':module:youtube',
  219. ':module:visitors',
  220. ':module:youtube',
  221. ':module:gamehub:uno',
  222. ':module:gamehub:carrom',
  223. ':module:gamehub:domino',
  224. ':module:gamehub:ludo',
  225. ':module:certification',
  226. ]
  227. buildFeatures {
  228. viewBinding true
  229. buildConfig true
  230. }
  231. configurations.configureEach {
  232. exclude group: 'com.facebook.fresco', module: 'drawee'
  233. exclude group: 'com.facebook.fresco', module: 'ui-core'
  234. }
  235. android.applicationVariants.all { variant ->
  236. def variantNameCap = variant.name.capitalize()
  237. def taskName = "sign${variantNameCap}Bundle"
  238. def variantName = variant.name
  239. def flavorName = variant.flavorName
  240. def buildTypeName = variant.buildType.name
  241. tasks.named(taskName).configure { task ->
  242. def file = task.finalBundleFile.get().asFile
  243. def projectName = rootProject.name
  244. def versionCode = variant.versionCode
  245. def versionName = variant.versionName
  246. def timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
  247. // 构造文件名:projectName-flavor-buildType-versionCode-versionName-timestamp.aab
  248. def nameParts = []
  249. nameParts << "app"
  250. nameParts << projectName
  251. if (flavorName) {
  252. nameParts << flavorName
  253. }
  254. nameParts << buildTypeName
  255. nameParts << "v${versionName}"
  256. nameParts << "(${versionCode})"
  257. nameParts << timestamp
  258. def finalFileName = "${nameParts.join('-')}.aab"
  259. def finalFile = new File(file.parentFile, finalFileName)
  260. task.finalBundleFile.set(finalFile)
  261. }
  262. }
  263. }
  264. gradle.taskGraph.addTaskExecutionListener(new TaskExecutionListener() {
  265. @Override
  266. void beforeExecute(Task task) {
  267. }
  268. @Override
  269. void afterExecute(Task task, TaskState taskState) {
  270. if (task.name.equalsIgnoreCase("bundleDebug")
  271. || task.name.equalsIgnoreCase("bundleRelease")) {
  272. copy {
  273. from 'build/intermediates/intermediary_bundle/'
  274. into 'build/outputs/bundle/'
  275. duplicatesStrategy DuplicatesStrategy.FAIL
  276. }
  277. println("afterExecute " + task.name)
  278. def aabDir = project.getBuildDir().absolutePath + '/outputs/bundle'
  279. fileTree(dir: aabDir, include: '*/*.aab').each { File file ->
  280. println(file.absolutePath)
  281. def cmd = []
  282. cmd << "java"
  283. cmd << "-jar"
  284. cmd << "${project.rootDir}/tool/bundletool.jar"
  285. cmd << "build-apks"
  286. cmd << "--bundle=" + file.absolutePath
  287. cmd << "--output=" + file.parent + File.separator + file.name.replace(".aab", "-split.apks")
  288. cmd << "--overwrite"
  289. cmd << "--mode=universal"
  290. if (task.name.equalsIgnoreCase("bundleDebug")) {
  291. cmd << "--ks=" + android.signingConfigs.debug.storeFile
  292. cmd << "--ks-pass=pass:" + android.signingConfigs.debug.storePassword
  293. cmd << "--ks-key-alias=" + android.signingConfigs.debug.keyAlias
  294. cmd << "--key-pass=pass:" + android.signingConfigs.debug.keyPassword
  295. } else {
  296. def keystoreProperties = new Properties()
  297. keystoreProperties.load(new FileInputStream(rootProject.file('keystore.properties')))
  298. cmd << "--ks=" + keystoreProperties.storeFile
  299. cmd << "--ks-pass=pass:" + keystoreProperties.storePassword
  300. cmd << "--ks-key-alias=" + keystoreProperties.keyAlias
  301. cmd << "--key-pass=pass:" + keystoreProperties.keyPassword
  302. }
  303. exec {
  304. commandLine cmd
  305. }
  306. }
  307. println("after build apks")
  308. }
  309. }
  310. })
  311. dependencies {
  312. api fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
  313. //kotlin
  314. implementation libs.kotlin.stdlib
  315. //androidx
  316. api libs.androidx.core.ktx
  317. api libs.androidx.appcompat
  318. api libs.androidx.constraint.layout
  319. api libs.androidx.activity
  320. api libs.androidx.fragment.ktx
  321. api libs.androidx.viewpager2
  322. api libs.androidx.lifecycle.livedata.ktx
  323. api libs.androidx.lifecycle.viewmodel.ktx
  324. api libs.androidx.exifinterface
  325. implementation libs.androidx.multidex
  326. implementation libs.androidx.vectordrawable
  327. implementation libs.androidx.work.manager
  328. api libs.androidx.room.runtime
  329. api libs.androidx.room.ktx
  330. api libs.flexbox
  331. kapt libs.androidx.room.compiler
  332. implementation libs.androidx.camera.core
  333. implementation libs.androidx.camera.camera2
  334. implementation libs.androidx.camera.lifecycle
  335. implementation libs.androidx.camera.video
  336. implementation libs.androidx.camera.view
  337. api libs.androidx.webkit
  338. //android
  339. implementation libs.android.material
  340. implementation libs.android.install.referrer
  341. //google play core
  342. implementation libs.play.feature.delivery
  343. implementation libs.play.feature.delivery.ktx
  344. implementation libs.play.app.update
  345. implementation libs.play.app.update.ktx
  346. //facebook
  347. implementation libs.facebook.android.sdk
  348. //appsflyer
  349. implementation libs.appsflyer
  350. //java
  351. implementation libs.rxjava
  352. //channel
  353. implementation libs.tencent.vasdolly.helper
  354. //firebase
  355. implementation platform(libs.firebase.bom)
  356. implementation libs.firebase.analytics
  357. implementation libs.firebase.crashlytics
  358. implementation libs.firebase.crashlytics.ndk
  359. implementation libs.firebase.dynamic.link
  360. implementation libs.firebase.messaging
  361. //gson
  362. implementation libs.gson
  363. //other
  364. api libs.smart.refresh.layout.kernel
  365. api libs.smart.refresh.header.material
  366. api libs.smart.refresh.footer.classics
  367. api libs.media3.exoplayer
  368. api libs.media3.exoplayer.dash
  369. api libs.media3.ui
  370. // media3 v1.4.1 guava 单独设置, 待media3更新后移除
  371. implementation libs.guava
  372. api libs.video.processor
  373. api libs.payermax
  374. api libs.rxjava
  375. //image
  376. api libs.compressor
  377. //tencent rtc
  378. api libs.tencent.tui.core
  379. //frame
  380. api platform(libs.frame.bom)
  381. api libs.frame.tcturing
  382. api libs.frame.animplayer
  383. api libs.frame.drawee
  384. api libs.frame.image
  385. api libs.frame.mvvm
  386. api libs.frame.util
  387. api libs.frame.zero
  388. api libs.frame.base
  389. api libs.frame.network
  390. api libs.frame.retrofit
  391. api libs.frame.oss
  392. api libs.frame.download
  393. api libs.frame.sound
  394. api libs.frame.game
  395. api libs.frame.autosize
  396. api libs.frame.spi
  397. api libs.frame.data
  398. api libs.frame.aab
  399. api libs.frame.coroutine
  400. api libs.frame.storage
  401. api libs.frame.log
  402. api libs.frame.statistics
  403. api libs.frame.googleservice
  404. api libs.frame.deviceid
  405. api libs.frame.security
  406. api libs.frame.guide
  407. api libs.frame.effect
  408. api libs.frame.svga
  409. api libs.frame.debug
  410. api project(":frame:room")
  411. api project(":frame:imkit")
  412. api libs.frame.startup
  413. api libs.frame.locale
  414. api libs.frame.push
  415. api libs.frame.media
  416. api libs.frame.share
  417. api libs.frame.dot
  418. api libs.frame.crash
  419. api libs.frame.apm
  420. api libs.frame.audio
  421. api libs.frame.tceffect
  422. api libs.frame.router.annotation
  423. api libs.frame.router.api
  424. kapt libs.frame.router.compiler
  425. implementation libs.toolargetool
  426. implementation(libs.rangeseekbar)
  427. // debugApi "com.tuzhenlei:crashhandler:1.0.1"
  428. // debugApi 'cat.ereza:customactivityoncrash:2.3.0'
  429. // debugImplementation "io.github.yvescheung:Uinspector:2.0.20"
  430. // debugImplementation "io.github.yvescheung:Uinspector-optional-viewmodel:2.0.20"
  431. // debugImplementation "io.github.yvescheung:Uinspector-optional-fresco:2.0.20"
  432. // debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
  433. //test
  434. testImplementation libs.junit
  435. androidTestImplementation libs.androidx.junit
  436. androidTestImplementation libs.androidx.espresso.core
  437. if (isEnableTrace){
  438. implementation (libs.frame.trace.api)
  439. }
  440. api libs.flexbox
  441. implementation 'io.github.flyjingfish:androidaop-core:2.7.0'
  442. ksp 'io.github.flyjingfish:androidaop-apt:2.7.0'
  443. }
  444. dependencyGuard {
  445. configuration("releaseRuntimeClasspath")
  446. }