1. 程式人生 > 其它 >flutter 打包 apk(mac)

flutter 打包 apk(mac)

技術標籤:flutterflutterapk

flutter 打包 apk

生成簽名檔案

Android在打包之前需要一個簽名檔案,.jks為字尾的檔案。

//生成sign.jks 
//keystore 後為檔案路徑 
//keysize 檔案大小
//validity 檔案有效時間
//alias 生成金鑰的別名

keytool -genkey -v -keystore ~/sign.jks -keyalg RSA -keysize 2048 -validity 10000 -alias sign

//檢視證書SHA1
keytool -list -v -keystore sign.jks 

檔案配置

1、匯入sign.jks

在Flutter工程中/android/app/key/sign.jks建立該目錄。要在app目錄下建立key資料夾,然後把sign.jks拖進來。

2、建立key.properties

在Flutter工程中/android/key.properties建立該檔案。內容如下:

storePassword=123456
keyPassword=123456
keyAlias=sign
storeFile=key/sign.jks 

配置/android/app/build.gradle檔案

def keystorePropertiesFile = rootProject.file('key.properties')
def keystoreProperties = new Properties()
keystoreProperties.load(new
FileInputStream(keystorePropertiesFile)) android { signingConfigs{ release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } buildTypes { release { signingConfig signingConfigs.release } } }

目錄結構-w10

打包apk

在flutter工程目錄下,執行命令,生成apk

flutter build apk
// flutter run -release 命令打出來的包,只針對當前插入手機來執行的包,體積要小很多

編譯中的錯誤

1、自己專案的minSdkVersion比三方SDK的的minSdkVersion低

報錯資訊:

Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 24 declared in library [:qr_code_scanner] ***********qr_code_scanner/intermediates/library_manifest/release/AndroidManifest.xml as the library might be using APIs not available in 16
        Suggestion: use a compatible library with a minSdk of at most 16,
                or increase this project's minSdk version to at least 24,
                or use tools:overrideLibrary="net.touchcapture.qr.flutterqr" to force usage (may lead to runtime failures)

解決辦法
日誌中給出了三種解決方案:

  • Suggestion: use a compatible library with a minSdk of at most 16:將三方庫的minSdkVersion
    降低,不可行,自己無法修改對方的SDK的minSdkVersion。
  • increase this project’s minSdk version to at least 24:提高自己專案的minSdkVersion大於等於三方的即可。
  • use tools:overrideLibrary=“net.touchcapture.qr.flutterqr” to force usage :
    在AndroidMainifest.xml中加入下面加上:
<uses-sdk tools:overrideLibrary="三方庫的包名"/>

如果有多個三方庫,可以用逗號隔開進行多個設定

<uses-sdk tools:overrideLibrary="com.google.zxing.client.android,net.touchcapture.qr.flutterqr"/>

2、報錯Error: 與元素型別 “uses-sdk” 相關聯的屬性 “tools:overrideLibrary” 的字首 “tools” 未繫結

在 AndroidManifest 中的manifest xmlns:android="http://schemas.android.com/apk/res/android" 後加上一句
xmlns:tools="http://schemas.android.com/tools" 

<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 
    package="com.example.SQMall"></manifest>

3、Gradle sync failed: Could not find method android() for arguments

原因:
根目錄下的 build.gradle 檔案不能包含 android 區塊。
android 區塊只能包含在 子目錄中的 build.gradle檔案中。