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