Android - Gradle8.0.0+糙置?從Gradle-DSL到Kotlin-DSL

升級總是伴隨著痛苦云茸,總是因為一些類的變動,查無此類谤饭、此方法标捺、此屬性,讓人真是頭大揉抵。不經(jīng)一番徹骨寒亡容,哪有梅花撲鼻香?下面是我升級中遇到的一些問題冤今,我在這里做個簡單的記錄闺兢。如果不巧你也正在因為此事犯疑惑,那請看看以下內(nèi)容是否能夠幫到你?

升級中的變更說明如下:

  • settings.gradle.kts

      @file:Suppress("DEPRECATION", "UnstableApiUsage")
      pluginManagement {
          repositories {
              google()
              mavenLocal()
              mavenCentral()
              gradlePluginPortal()
              maven("https://jitpack.io")
          }
      }
      dependencyResolutionManagement {
          repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
          repositories {
              google()
              //noinspection JcenterRepositoryObsolete
              jcenter()
              mavenLocal()
              mavenCentral()
              maven("https://jitpack.io")
          }
      }
      rootProject.name = "KtsDemo"
      include(":app")
    
  • 根目錄 build.gradle.kts

      import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
      buildscript {
          val objectboxVersion by extra("3.6.0") //ext { ... } 的替代內(nèi)容
          dependencies {
              classpath("io.objectbox:objectbox-gradle-plugin:$objectboxVersion")
          }
      }
    
      // 增加一下配置屋谭,防止出現(xiàn)錯誤:task (current target is 1.8) and 'kaptGenerateStubsUatDebugKotlin' task (current target is 17)
      allprojects {
          tasks.withType(KotlinCompile::class.java) {
              kotlinOptions {
                  jvmTarget = "1.8"
              }
          }
      }
    
      // 新式插件引入樣式脚囊,注意ksp的引入需要與kotlin版本匹配,不然會報錯
      plugins {
          id("com.android.application") version "8.0.0" apply false
          id("com.android.library") version "8.0.0" apply false
          id("org.jetbrains.kotlin.android") version "1.8.20" apply false
          id("com.google.devtools.ksp") version "1.8.20-1.0.11" apply false
      }
    
      apply(from = "本地的gradle.kts") //如果是導入第三方桐磁,使用apply(plugin="plugin名稱")
    
    • 附言:
      如果項目中引入了外部的 Gradle.kts 文件悔耘,那么 Gradle.kts 中聲明配置可如下:
          val appRootConfig by extra(mutableMapOf(
              "namespace" to "com.kts.demo",
              "appName" to "Demo",
              "applicationId" to "com.kts.demo"
          ))
      
  • 子模塊 build.gradle.kts

      // 引入Plugin
      plugins {
          id("com.android.application")
          id("org.jetbrains.kotlin.android")
          id("kotlin-kapt") //kapt可與ksp并存,因為有些第三方的還未切換到ksp
          id("kotlin-parcelize")
          id("com.google.devtools.ksp") //引入ksp
      }
    
      // 引入根目錄引入的外部gradle.kts的相關(guān)配置
      val appRootConfig by extra(rootProject.extra["appRootConfig"] as Map<String, *>)
    
      android {
    
          // 簽名的導入
          signingConfigs {
              // 因為dev不存在我擂,因此使用create方法
              create("dev") {
                  keyAlias = "Test"
                  keyPassword = "123456"
                  storePassword = "123456"
                  storeFile = file("./docs/sign-test.jks") //定位jsk簽名文件位置
              }
          }
    
          namespace = appRootConfig["namespace"] as String //使用全局的配置屬性
          compileSdk = 33
          buildToolsVersion = "33.0.0"
    
          defaultConfig {
              applicationId = appRootConfig["applicationId"] as String
              minSdk = 21
              targetSdk = 33
              versionCode = 1
              versionName = "1.0.0"
    
              testInstrumentationRunner = "..." //此處省略
    
              // 聲明BuildConfig變量衬以,需配置buildFeatures { buildConfig = true }
              buildConfigField("String", "APP_ENV_MODE", "\"DEBUG\"")
    
              // 如果有cpp相關(guān)的編譯
              externalNativeBuild {
                  cmake {
                      cppFlags("")
                      abiFilters.add("armeabi-v7a") //add或者addAll
                  }
              }
    
              // 如果配置有NDK
              ndk { abiFilters.addAll(listOf("armeabi-v7a", "x86")) }
    
              // 如果有默認簽名
              signingConfig = signingConfigs.getByName("dev")
          }
    
          buildFeatures {
              viewBinding = true
              buildConfig = true // 增加該屬性,項目才能生成BuildConfig類
          }
    
          sourceSets {
              // 又創(chuàng)建了一個渠道:google校摩,并引入它的清單文件
              create("google") {
                  manifest.srcFile("src/google/AndroidManifest.xml")
              }
          }
    
          kotlinOptions { jvmTarget = "1.8" } //指定使用Java8編譯
          compileOptions {
              encoding = "UTF-8"
              sourceCompatibility = JavaVersion.VERSION_1_8
              targetCompatibility = JavaVersion.VERSION_1_8
          }
          packaging {
              resources {
                  merges.addAll(listOf("**/LICENSE.txt", "**/NOTICE.txt"))
                  excludes.addAll(listOf("/META-INF/{AL2.0,LGPL2.1}", "DebugProbesKt.bin"))
              }
          }
          flavorDimensions.addAll(listOf("prod")) //原來寫法是:flavorDimensions = ["a", "b"]
              productFlavors {
                  // 創(chuàng)建一個“風味”名稱
                  create("google") {
                      dimension = "prod"
                      versionCode = 1
                      versionName = "1.0.0"
                      applicationId = "com.demo.kts"
                      buildConfigField("String", "APP_CHANNEL_NAME", "\"Google\"")
                  }
              }
          }
    
          buildTypes {
              // debug { signingConfig signingConfigs.dev }
              release {
                  isDebuggable = true
                  isJniDebuggable = true
                  isMinifyEnabled = true
                  isShrinkResources = true
                  signingConfig = signingConfigs.getByName("dev")
                  //noinspection ChromeOsAbiSupport
                  ndk { abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86_64")) }
                  proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
              }
          }
    
          dependencies {
              implementation("androidx.core:core-ktx:1.10.1")
              implementation("androidx.activity:activity-ktx:1.7.2")
              implementation("androidx.fragment:fragment-ktx:1.6.0")
              implementation("androidx.appcompat:appcompat:1.6.1")
              implementation("com.google.android.material:material:1.9.0")
              implementation("androidx.constraintlayout:constraintlayout:2.1.4")
              //... 省略許多看峻,許多
              api(project(":common")) //引入其他模塊
              implementation(project(":test")) //引入其他模塊
          }
      }
    
    • 其他需要注意的事項
      因為項目使用的Gradle8.0.0+,所以R8模式是默認全開的衙吩,會導致一些類在經(jīng)過混淆后出現(xiàn)問題互妓,特別典型的是:Gson庫,請看:ISSUE分井。通過嘗試车猬,需要設(shè)置如下規(guī)則:

      Gson混淆規(guī)則:

          ##---------------Begin: proguard configuration for Gson ----------
          # Gson uses generic type information stored in a class file when working with fields. Proguard
          # removes such information by default, so configure it to keep all of it.
          # Gson specific classes
          # -keep class sun.misc.Unsafe { *; }
          # Gson uses generic type information stored in a class file when working with
          # fields. Proguard removes such information by default, keep it.
          # -keepattributes Signature
          # This is also needed for R8 in compat mode since multiple
          # optimizations will remove the generic signature such as class
          # merging and argument removal. See:
          # https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson
          -keep class com.google.gson.reflect.TypeToken { *; }
          -keep class * extends com.google.gson.reflect.TypeToken
          # Optional. For using GSON @Expose annotation
          -keepattributes AnnotationDefault,RuntimeVisibleAnnotations
          -keepclassmembers class * {
          !transient <fields>;
          }
          -if class *
          -keepclasseswithmembers class <1> {
              <init>(...);
              @com.google.gson.annotations.SerializedName <fields>;
          }
          ##---------------End: proguard configuration for Gson ----------
      

      Retrofit也需要做如下混淆:

          -if interface * { @retrofit2.http.* public *** *(...); }
          -keep,allowoptimization,allowshrinking,allowobfuscation class <3>
      
          # Platform calls Class.forName on types which do not exist on Android to determine platform.
          -dontnote retrofit2.Platform
      

      針對協(xié)程相關(guān)的混淆:

          # -keepattributes Signature
          -keep class kotlin.coroutines.Continuation
      

      ** 如果在升級kotlin-dsl出現(xiàn)Parcelable報錯等問題霉猛,試試讀取使用方法BundleCompat.getParcelable*(args) **

  • 一步一個腳印尺锚,總算是解決了升級的問題。如果覺得有幫助惜浅,麻煩動動您發(fā)財?shù)男∈纸o點個贊瘫辩!原創(chuàng)內(nèi)容,轉(zhuǎn)載請注明作者和出處坛悉,謝謝伐厌!

對了,這里在增加一個WARING! 雖然上面的內(nèi)容都正常運轉(zhuǎn)了裸影,我還是遇到了一個新問題挣轨,就是打包時,如何用kts給APK重命名轩猩,使其打包出來就是我們想要的名字卷扮,因為原來的 output.setOutputFileName 已經(jīng)無法使用,暫未找到解決方案均践,正在探索中晤锹。。彤委。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞭铆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子焦影,更是在濱河造成了極大的恐慌车遂,老刑警劉巖封断,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舶担,居然都是意外死亡澄港,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門柄沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來回梧,“玉大人,你說我怎么就攤上這事祖搓∮猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵拯欧,是天一觀的道長详囤。 經(jīng)常有香客問我,道長镐作,這世上最難降的妖魔是什么藏姐? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮该贾,結(jié)果婚禮上羔杨,老公的妹妹穿的比我還像新娘。我一直安慰自己杨蛋,他們只是感情好兜材,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逞力,像睡著了一般曙寡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寇荧,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天举庶,我揣著相機與錄音,去河邊找鬼揩抡。 笑死户侥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的捅膘。 我是一名探鬼主播添祸,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寻仗!你這毒婦竟也來了刃泌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耙替,沒想到半個月后亚侠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俗扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年硝烂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜幽。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡滞谢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出除抛,到底是詐尸還是另有隱情狮杨,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布到忽,位于F島的核電站橄教,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喘漏。R本人自食惡果不足惜护蝶,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翩迈。 院中可真熱鬧持灰,春花似錦、人聲如沸帽馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绽族。三九已至,卻和暖如春衩藤,著一層夾襖步出監(jiān)牢的瞬間吧慢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工赏表, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留检诗,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓瓢剿,卻偏偏與公主長得像逢慌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子间狂,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容