Gradle7.0版本及之後 AS2021.1.1 版本 的鏡像配置和打包APK問題彙總

来源:https://www.cnblogs.com/source/archive/2022/03/27/15979738.html
-Advertisement-
Play Games

為什麼需要配置gradle? 本機環境:win10 + AS2021.1.1版本 另外說明:搞android,jdk如果是8的,AS會根據你使用的AGP版本,提醒你升級到java11版本,會半自動往sdk文件夾下載11版本的jre。所以在這不說明jdk版本。 名詞解釋: AGP - Android ...


為什麼需要配置gradle?

本機環境:win10 + AS2021.1.1版本 

另外說明:搞android,jdk如果是8的,AS會根據你使用的AGP版本,提醒你升級到java11版本,會半自動往sdk文件夾下載11版本的jre。所以在這不說明jdk版本。

名詞解釋: AGP - Android Gradle 插件

最重要的環境就是AGP版本,官網版本說明中提到了版本變化,由早先1.0-4.~  ,直接跨越到了7.0

 

 

 

AS官網鏈接: https://developer.android.google.cn/studio/releases/gradle-plugin 

經過我千辛萬苦的試錯,終於透過了現象和語言障礙看到了本質(載入過程)

首先你的AS,創建新項目時,會根據你的AS版本找到對應的預設AGP版本,比如我的AS是2021.1.1,對應就是AGP7.1.1版本,而這個AGP版本就對應了Gradle7.2+的版本

 

 

 

 

 

 

而AS在構建項目時,會根據AS的settings,也就是IDE的設置進行查找:這裡現放出預設配置。

 

 

 再來看項目里的properties文件是怎樣進行預設配置的:

現放出AGP版本圖:

 

對應文件

 

 

 

 

可以看到這幾個載入項,順序可變,一共五個,第一個找不到去第二個載入,以此類推,但一般情況下:如果你使用預設配置(沒有配置自定義Gradle,和Gradle環境變數),那麼我們自然就會跳轉到url,也就是圖中第二個載入項去下載整個gradle。

所以會很慢,但最慢的並不是下載gradle,而是載入常用的jar包依賴,比如junit,fastjson等等,會變得奇慢無比。 因為要去外網下載。

這時候也就是我們要配置gradle的原因了。

相信大家看到這裡,也搜過類似的國內配置,但你能看到我這篇文章,說明你看的未能解決你的問題,或者令你一知半解。我教你,怎麼在AS中正確配置自定義Gradle讓其載入。

另外說一句,你想從Github上拉取Android項目,也需要修改各種Gradle配置,往下看,以後你不用在修改任何配置也能直接載入別人的項目

首先,去下載不低於你當前項目使用的AGP版本對應版本的Gradle,(這裡直接百度Gradle即可,有官網,官網有版本可選擇)。

為什麼說不低於,是因為Gradle向下相容,所以不必每次都對應上,直接下個最高的不好麽、、、

下載完畢去配置一下國內鏡像,這裡我用的我貼一下。

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
 buildscript{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}
}

創建一個init.gradle文件,內容為上述。放置到下載好的Gradle根目錄下即可。

這裡說明:你用你搜到的哪種寫法的配置,哪個鏡像都行,目的是讓AS識別到鏡像(AS構建項目時,會使用指定Gradle,去載入,如果你配置了鏡像,它會識別到)

刷新同步時,可以看看

 

如圖,有這個就可。

 下麵重點來了

配置AS的Gradle目標目錄:

 

2必須勾選,1隨意,1用於別人可以用你Gradle,在混合開發中。一般沒啥用。

2 為使用你配置里的配置項去下載依賴jar包。

3 則是最重要,使用你指定的位置的Gradle。

4則為 Gradle根目錄,別忘了配置init.gradle

然後配置完ok,再次同步即可,你可以看到飛快的速度。

 

打包問題:

打包成apk時,可以試試.一個hello world的empty基本只需要不到20s

如果持續卡在某一步,好幾十秒一分鐘左右不變化.那麼就可以試一下此解決方案:

打開app下的子模塊的build.gradle配置文件

 

 

 

 

在此文件的

android {

}

配置

//    解決打包問題
lintOptions {
//不檢查版本發佈
checkReleaseBuilds false
//出現錯誤不終止
abortOnError false
}

重新打包APK即可 。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 SECS-II 概述 SECS-II 標准定義了使用如SECS-I、HSMS等傳輸協議在設備和主機之間交換的消息的形式和含義。 定義了以消息的形式在設備和主機之間傳遞信息,消息按其行為分類,稱為Stream。有很多不同的行為Stream,每個Stream又包括具體的消息,稱為Function。 ...
  • CSV(Comma Separated Values)文件是一種純文本文件,包含用逗號分隔的數據,常用於將數據從一個應用程式導入或導出到另一個應用程式。通過將CSV文件轉為EXCEL,可執行更多關於數據編輯、格式設置等操作。下麵,將通過C#及VB.NET代碼展示如何來實現轉換。 一、程式環境 可通過 ...
  • 不管我們開發是基於Asp.net core 還是.net core,或者還是.net framework的相關應用,如果有一個比較全面的公用類庫以及相關的擴展函數來支撐,我們開發項目上會節省很多相關的處理方法查詢和封裝。本篇隨筆主要針對性的介紹基於一些對象進行擴展函數的封裝帶來的便利性進行說明,畢竟... ...
  • 為了保證用戶輸入系統的數據是有效的,同時也是為了避免程式出現不可預期的問題,保證應用程式能夠安全的運行,所以對輸入的數據進行驗證是非常有必要的。 剛開始學代碼的時候,我是這樣進行數據校驗的 看上去是不是很醜陋...,表單數據多的時候往往能寫上幾百上千行的if判斷語句。並且每個需要保存更新數據的地方都 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是IAR環境下無法直接下載調試i.MXRT分散鏈接工程的解決方案。 分散鏈接與載入一直是嵌入式領域比較勸退新手的難題,在恩智浦 i.MXRT 系列為代表的多存儲器架構的 MCU 上,分散鏈接問題體現得尤為明顯,畢竟你在鏈接應用程式各種段( ...
  • 安裝SSH ubuntu 啟動 查看ssh運行狀態 關閉防火牆 開機自動啟動ssh命令 關閉ssh開機自動啟動命令 單次開啟ssh 單次關閉ssh 設置好後重啟系統 查看ssh是否啟動,看到Active: active (running)即表示成功 設置允許使用root用戶登錄 1、切換到 root ...
  • 通常大型 Hadoop 集群是以機架的形式來組織的,同一個機架上的不同節點間的網路狀況比不同機架之間的更為理想,NameNode 設法將數據塊副本保存在不同的機架上以提高容錯性。 ...
  • HDFS 上的文件對應的 Block 保存多個副本,且提供容錯機制,副本丟失或者宕機自動恢復,預設是存 3 個副本。 2.8.x之前的副本策略 官方文檔說明: https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...