<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
年初了,我們打算升級下apg,這樣之後就擁抱下jetpack compose了!!
想用comopse有兩個必選項agp7.0和kotlin版本1.5.31.
因為apg7.0需要把所有的module編譯環境切換到java11版本上,然而這個地方很容易出錯。
首先是命令列的設定,對於mac使用者來說,可能會寫死預設的java環境到1.8. 這個時候我們需要做的就是刪除bashprofile內的java設定。
同時最好用命令列java --version嘗試下輸出的版本是不是java11。
as的設定則相對來說比較簡單了。
按照這兩個設定完成之後重新同步下工程應該就行了。
之前在現在準備好告別Transform了嗎?的文章就簡單展開了下AndroidComponentsExtension,新版本更換了extensions。這次給專案升級適配之前寫的哪些外掛,想了想用新不用久嗎,嘗試下新東西了。
以前在寫android外掛的時候很多時候都需要在gralde的afterEvaluate方法執行之後才能獲取到很多安卓對應的屬性。
這次在v2的api中,則提供了非常多不同的節點,讓我們在不同的階段做一些不同的事情。
比如說onVariants,beforeVariants,finalizeDsl這三個不同的階段,正常情況下我們選擇onVariants就足夠了。
Gralde 內的一部分核心是Task,但是要想寫好一個Task其實並沒有想象中的那麼容易。特別是一個CacheableTask,他更多的關注與他們的輸入和輸出。
構建快取(build cache)的工作原理是:在快取中儲存已編譯的類、測試輸出和其他構建構件,同時考慮所有的任務輸入,包括輸入檔案內容、相關類路徑和任務設定。
所以在AGP 7.0中,提供了這部分新的api讓我們簡化對於task,輸入輸出這些引數的優化,讓我們可以更專注到我們想要變更的東西上。
比如說APk,MANIFEST,MAPPING_FILE,BUNDLE,AAR或者其他的一些編譯產物,當前agp給我們提供的也是相對來說比較少的一部分功能。
另外一點就是,我們如果想要知道一個task的輸入其實如果不去閱讀原始碼,之後獲取對應的路徑或者原始碼,其實是一個非常繁瑣的過程。之後還要通過變更dependon或者finalizedBy等等手段將任務插入到編譯流程內。
所以就有了我們這次的其中一個主角Artifacts,他主要負責幫助我們將我們的task,插入到編譯流程內,讓我們儘量少的關注到輸入和輸出。
// 生成TaskProvider val taskProvider = project.tasks.register( "manifestCopy${variant.name}Task", ManifestSampleTask::class.java ) // 獲取variant的artifacts之後將Task轉化成我們所想要的 variant.artifacts.use(taskProvider).wiredWithFiles( ManifestSampleTask::mergedManifest, ManifestSampleTask::outputManifest ).toTransform(SingleArtifact.MERGED_MANIFEST)
這個就是官方的一個Artifacts的簡單的使用了,通過變化我們可以輕鬆的完成一個有獲取合併後的Manifest作為輸入,之後以另外一個Manifest檔案作為輸出的一個task。而且會被直接新增編譯流程內,就不需要我們關心他們的前置和後置任務是啥了。
原先在v1的api上吧,有registerJavaGenerateTask這個方法,能加一些簡單的程式碼生成的操作,比如j神以前生成的R2就是通過掛載這個方法。
這次v2版本我在AndroidComponentsExtension中沒找到的對應的api,所以只能無中生友,自己搞一個出來咯。
@Override public void registerJavaGeneratingTask(@NonNull Task task, @NonNull File... sourceFolders) { getVariantData().registerJavaGeneratingTask(task, sourceFolders); } open fun registerJavaGeneratingTask( task: Task, generatedSourceFolders: Collection<File> ) { @Suppress("DEPRECATION") taskContainer.sourceGenTask.dependsOn(task) val fileTrees = extraGeneratedSourceFileTrees ?: mutableListOf<ConfigurableFileTree>().also { extraGeneratedSourceFileTrees = it } for (f in generatedSourceFolders) { val fileTree = services.fileTree(f).builtBy(task) fileTrees.add(fileTree) } addJavaSourceFoldersToModel(generatedSourceFolders) }
我仔細觀察了下registerJavaGenerateTask的原始碼,發現其中只做了兩件比較簡單的事情。將Task掛載到generateVariantResources任務之後,然後將生成java類的資料夾加入到sourcetSet上去,這樣就行了。
sourcetSet就是javac的將java轉化成class的編譯路徑。
所以相對來說就比較簡單,我們用新的api模擬出原來的效果就差不多可以了,我們只要找到掛載的任務之後,順便把程式碼新增到java和kotlin的sourceset中就行了
fun Project.registerJavaGenerateTask( variant: String?, task: TaskProvider<out Task>, generatedSourceFolders: Collection<File> ) { if (variant.isNullOrEmpty().not()) { variant?.apply { // 因為task生成在設定階段完成之後 afterEvaluate { findJavaGenerateTask(variant)?.dependsOn(task) } // 獲取最新版本sourceSet val application = extensions.findByType(ApplicationExtension::class.java) application?.sourceSets { findByName(variant)?.apply { generatedSourceFolders.forEach { java.srcDir(it) kotlin.srcDir(it) } } } } } }
這次升級適配主要的程式碼就是這個了,其實程式碼量上來說不多。但是把有個坑點,之前因為偷懶就直接用了setSrcDirs這個api,所以檔案就被覆蓋了。導致了一部分程式碼沒有被編譯成class,導致了classnotfound異常。
獲取applicationId,我們的外掛內有對於應用id的判斷,之後進行不同的manifest pleaceholder的調整。邏輯比較簡單,只是切換了新版本的api而已。
if (variant is ApplicationVariant) { val applicationId = variant.applicationId.get() variant.manifestPlaceholders.put("xxxxx", applicationId) }
對resValue插入新的string或者values。也是原來就有的能力,但是要對新版本進行一次小小的適配和更換。
private fun addAPGClassFile(config: Variant, key: String, value: String) { val resValue = ResValue(value) val reskey = config.makeResValueKey("string", key) config.resValues.put(reskey, resValue) }
啟用設定快取的操作,本質上是在專案的 gradle.properties 檔案中設定了環境變數 org.gradle.unsafe.configuration-cache=true。
AGP對我們這個算是每年一更新了,會碰到一些新的有趣的api以及新的寫法。另外每次新版本的AGP對於編譯上都有變更和優化,更多關於AGP7.0升級適配的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45