kts之自定義輸出apks目錄的幾種方法和bug解決

自定義文件名雖然很ok,但是這個(gè)目錄因?yàn)榍蓝嗔司惋@得亂七八糟的阔籽,我認(rèn)為所有渠道應(yīng)該度放到一個(gè)單獨(dú)的文件夾,方便git忽略仿耽。
實(shí)現(xiàn)方法1:

 applicationVariants.all {
        val artifactSuffix = buildString {
            productFlavors.getOrNull(0)?.name?.let { billingFlavorName ->
                if (billingFlavorName != Flavors.OSS) {
                    append(".$billingFlavorName")
                }
            }

            productFlavors.getOrNull(1)?.name?.let { infrastructureFlavorName ->
                if (infrastructureFlavorName != Flavors.PROD) {
                    append(".$infrastructureFlavorName")
                }
            }

            if (buildType.name != BuildTypes.RELEASE) {
                append(".${buildType.name}")
            }
        }

        val variantName = name
        val capitalizedVariantName = variantName.capitalized()
        val artifactName = "MullvadVPN-${versionName}${artifactSuffix}"

        tasks.register<Copy>("create${capitalizedVariantName}DistApk") {
            from(packageApplicationProvider)
            into("${rootDir.parent}/dist")
            include { it.name.endsWith(".apk") }
            rename { "$artifactName.apk" }
        }

        val createDistBundle =
            tasks.register<Copy>("create${capitalizedVariantName}DistBundle") {
                from("$buildDir/outputs/bundle/$variantName")
                into("${rootDir.parent}/dist")
                include { it.name.endsWith(".aab") }
                rename { "$artifactName.aab" }
            }

        createDistBundle.dependsOn("bundle$capitalizedVariantName")
    }

    project.tasks.preBuild.dependsOn("ensureJniDirectoryExist")
    project.tasks.preBuild.dependsOn("ensureValidVersionCode")
}

實(shí)現(xiàn)方法2:

fun copyWithAppFilename(dest: String, appName: String?) {
    delete("$dest/$coronaAppFileName.apk")
    delete("$dest/$coronaAppFileName.aab")
    var hasODR = false
    parsedBuildProperties.lookup<JsonArray<JsonObject>>("buildSettings.android.onDemandResources").firstOrNull()?.forEach {
        it["resource"].let { res ->
            hasODR = true
        }
    }

    copy {
        into(dest)
        val copyTask = this
        android.applicationVariants.matching {
            it.name.equals("release", true)
        }.all {
            if(!isExpansionFileRequired && !hasODR) {
                copyTask.from(packageApplicationProvider!!.get().outputDirectory) {
                    include("*.apk")
                    exclude("*unsigned*")
                }
            }
            copyTask.from("$buildDir/outputs/bundle/$name") {
                include("*.aab")
            }
        }
        rename {
            "$appName.${file(it).extension}"
        }
    }
}



tasks.create("buildCoronaApp") {
    description = "Used when Simulator invokes a build. It all project variables must be passed"
    dependsOn("assembleRelease")
    dependsOn("bundleRelease")
    dependsOn("createExpansionFile")

    coronaDstDir?.let {
        doLast {
            try {
                copyWithAppFilename(it, coronaAppFileName)
            } catch (ignore: Throwable) {
                try {
                    val defaultName = "App"
                    copyWithAppFilename(it, defaultName)
                    logger.error("WARNING: Used default filename '$defaultName' because original contains non-ASCII symbols.")
                } catch (ex: Throwable) {
                    logger.error("ERROR: Unable to finalize build. Make sure path to destination doesn't contain non-ASCII symbols")
                    throw ex
                }
            }
            delete("$it/$coronaExpansionFileName")
        }
    }
}

方法3

   if (variant.buildType.name != "debug") {
            variant.packageApplicationProvider.get().outputDirectory = rootProject.file("apk/${variant.flavorName}")
        }

kt

      if (this.buildType.name != "debug") {
                            this.packageApplicationProvider.configure{
                                this.outputDirectory.set( rootProject.file("apk/${floavorName}")) 
                            }
                        }

應(yīng)該是需要忽略debug的各薇,
我以前寫(xiě)的,不過(guò)沒(méi)完全成功峭判,
似乎不能直接改變目錄會(huì)導(dǎo)致崩潰,而wan那個(gè)項(xiàng)目是忽略了debug

 this.packageApplicationProvider.configure {
    //                            outputDirectory.set(File(project.rootDir.absolutePath + "/apks/${buildTypeName}/${floavorName}"))
                                doLast {
                                    val tasks = project.tasks.withType(AbstractArchiveTask::class.java)
                                    tasks.forEach { task ->
                                        if (task.name.contains(varinatNmae.capitalize())) {
                                            var outputFilePath =
                                                File(project.rootDir.absolutePath + "/apks/${buildTypeName}/${floavorName}")
                                            task.outputs.files.singleFile.copyTo(outputFilePath, true)
                                        } else {

                                        }
                                    }
                                }
                            }

2024-1-22 14:44:53 我想起來(lái)了疗认,會(huì)導(dǎo)致output-metadata.json' which doesn't exist.
解決辦法如下
TestPine/app/build.gradle at 1377aba92e0d1f56bc7176febb4e47b6141579f7 · huaerxiela/TestPine (github.com)

很多人都選擇了這種不靠譜的辦法


image.png

然后我發(fā)現(xiàn)全是我們國(guó)人提交的代碼
最后還有這種方法解決
https://github.com/PhilGlass/android-cache-fix-gradle-plugin?tab=readme-ov-file

最后這個(gè)方法解決錯(cuò)誤

tasks.configureEach { Task task ->
    if (!isModifyBuildOutputDirectory) return

    // 注意:如果是有多個(gè) flavor扎拣,則為 merge“Flavor”DebugNativeLibs 的形式
    String taskName = task.name

    if (taskName.matches('^assemble.*[(Debug)|(Release)]$')) {

        def taskNameSplit = taskName.split('assemble')
        String variantName = taskNameSplit.size() > 0 ? taskNameSplit.last() : ''

        def variantNameSplit = variantName.split("(Debug)|(Release)")
        String flavorName = variantNameSplit.size() > 0 ? variantNameSplit.first() : ''

        String buildType = variantName - flavorName

        def apkListingFileRedirectTask = tasks.findByName("create${variantName}ApkListingFileRedirect")

        if (buildType.isBlank() || apkListingFileRedirectTask == null) {
            println "$task 非編譯任務(wù),無(wú)需修改打包輸出目錄"
            return
        }

        if (apkListingFileRedirectTask != null) {
            // 修改 apkListingFileRedirect 任務(wù)與 assembleVariantTask 任務(wù)的順序
            apkListingFileRedirectTask.mustRunAfter(task)
        }

        task.doLast {
            println "------------------- ${taskName} end -------------------"

            // 修改生成 apk 的位置
            def outputDirectory = new File(rootProject.projectDir, "apk/")

            File listingFile = apkListingFileRedirectTask.property("listingFile").asFile.get()
            // apk 原始輸出位置
            def buildApkOutputDirectory = listingFile.parentFile

            println "------------ 開(kāi)始拷貝 ${outputDirectory} 到 ${buildApkOutputDirectory} 下  ----------"

            // 將打包生成的 apk 復(fù)制到 原有的構(gòu)建目錄
            copy {
                from outputDirectory
                into buildApkOutputDirectory
            }
        }
    }
}

BaseProject/commonGradle/apk_build.gradle at 580e913071577b2f9e56e5b5ea3cdb886f36c434 · Heart-Beats/BaseProject (github.com)

其它
參考源碼
UICore/_gradle/metadata.gradle at ad2806e09b057f3bdecd2c2fe6f52d06913df139 · angcyo/UICore (github.com)

mullvadvpn-app/android/app/build.gradle.kts at e0d794cd11d76e3d716b93cc84ec0bef9a7fe63d · mullvad/mullvadvpn-app (github.com)

corona/platform/android/app/build.gradle.kts at c2edbda89671314a0c6e06a07ea84125e1ba8018 · coronalabs/corona (github.com)
wanandroid/app/build.gradle at 7b827f82fd0543bb3074f618a11f1076875bd2ae · lulululbj/wanandroid (github.com)

上面的方法都不靠譜,實(shí)際上自定義task是最靠譜的

image.png

我的解決辦法

還有 60% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
支付 ¥1.00 繼續(xù)閱讀
  • 序言:七十年代末二蓝,一起剝皮案震驚了整個(gè)濱河市誉券,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刊愚,老刑警劉巖踊跟,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異百拓,居然都是意外死亡琴锭,警方通過(guò)查閱死者的電腦和手機(jī)晰甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)厕九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扁远,“玉大人,你說(shuō)我怎么就攤上這事畅买〉刍穑” “怎么了犀填?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵九巡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撒汉,道長(zhǎng)神凑,這世上最難降的妖魔是什么溉委? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任坡慌,我火速辦了婚禮洪橘,結(jié)果婚禮上熄求,老公的妹妹穿的比我還像新娘弟晚。我一直安慰自己,他們只是感情好瑟押,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著便斥,像睡著了一般枢纠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上木西,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天吗讶,我揣著相機(jī)與錄音,去河邊找鬼膜毁。 笑死瘟滨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胧沫。 我是一名探鬼主播纯赎,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峰伙!你這毒婦竟也來(lái)了瞳氓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栓袖,失蹤者是張志新(化名)和其女友劉穎裹刮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赠叼,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泌类,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朱沃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苞轿。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翎卓,靈堂內(nèi)的尸體忽然破棺而出契邀,到底是詐尸還是另有隱情,我是刑警寧澤失暴,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布坯门,位于F島的核電站,受9級(jí)特大地震影響逗扒,放射性物質(zhì)發(fā)生泄漏古戴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一矩肩、第九天 我趴在偏房一處隱蔽的房頂上張望现恼。 院中可真熱鬧,春花似錦蛮拔、人聲如沸述暂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畦韭。三九已至,卻和暖如春肛跌,著一層夾襖步出監(jiān)牢的瞬間艺配,已是汗流浹背察郁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留转唉,地道東北人皮钠。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓退个,卻偏偏與公主長(zhǎng)得像州袒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馏鹤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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