【手把手學習flutter】Flutter打Android包的基本配置和包體積優化策略

【手把手學習flutter】Flutter打Android包的基本配置和包體積優化策略

關注「松寶寫程式碼」,回復「加群」
加入我們一起學習,天天向上

前言

因為最近參加2020FEHackson,有個項目需要要快速上線,把打包過程和遇到的問題做個記錄。

一、背景

在本地開發中,使用flutter run命令還是Android studio運行或者調試,flutter構建的是debug版本,也就是本地調試右上角出現debug標誌。

當本地調試OK後,準備release版本,比如發布到應用商城,或者交付用戶使用。

二、前期檢查工作

1、檢查AndroidManifest配置

/android/app/src/main/中的AndroidManifest.xml文件,並驗證這些屬性是否正確,特別是:

  • application屬性,這是應用的名稱。
  • uses-permission屬性,啟用flutter工具和app應用進行通訊,默認是開啟,如果不開啟,直接刪除該屬性這一行。

2、查看構建配置

/android/app/build.gradle」,驗證這些屬性是否正確,

  • defaultConfig文件
    • applicationId:制定始終唯一的appid。
    • versionCode && versionName:app應用版本號和版本號字元串。
    • minSdkVersion && targetSdkVersion:指定最低的API級別以及應用程式設計運用的API級別。

3、app簽名

創建keystore,如果之前已經創建過keystore,那就跳過,如果沒有創建過,繼續來看。

創建一個keystore,執行命令:

For more details, please visit //support.apple.com/kb/HT208050.
chengxinsongdeMacBook-Pro:~ chengxinsong$ keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

生成的文件是 key.jks
默認文件地址:/Users/你電腦名稱/key.jks

注意:密鑰是私密文件,不要加到git中。

下面是詳細的執行過程

Last login: Mon Nov  2 14:17:41 on ttys005

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit //support.apple.com/kb/HT208050.
chengxinsongdeMacBook-Pro:~ chengxinsong$ keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
輸入密鑰庫口令:  
再次輸入新口令: 
它們不匹配。請重試
輸入密鑰庫口令:  
再次輸入新口令: 
您的名字與姓氏是什麼?
  [Unknown]:  cheng
您的組織單位名稱是什麼?
  [Unknown]:  byte
您的組織名稱是什麼?
  [Unknown]:  byte
您所在的城市或區域名稱是什麼?
  [Unknown]:  nj
您所在的省/市/自治區名稱是什麼?
  [Unknown]:  nj
該單位的雙字母國家/地區程式碼是什麼?
  [Unknown]:  cn
CN=cheng, OU=byte, O=byte, L=nj, ST=nj, C=cn是否正確?
  [否]:  y

正在為以下對象生成 2,048 位RSA密鑰對和自簽名證書 (SHA256withRSA) (有效期為 10,000 天):
	 CN=cheng, OU=byte, O=byte, L=nj, ST=nj, C=cn
輸入 <key> 的密鑰口令
	(如果和密鑰庫口令相同, 按回車):  
再次輸入新口令: 
[正在存儲/Users/chengxinsong/key.jks]

Warning:
JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore /Users/chengxinsong/key.jks -destkeystore /Users/chengxinsong/key.jks -deststoretype pkcs12" 遷移到行業標準格式 PKCS12。
chengxinsongdeMacBook-Pro:~ chengxinsong$ 

4、應用中引入keystore

/android下新建key.properties的文件,其中包含對密鑰庫的引用:

storePassword=你輸入的密碼
keyPassword=你輸入的密碼
keyAlias=key
storeFile=/Users/你電腦名稱/key.jks

5、在構建配置中添加簽名

/android/app/build.gradle文件做修改:

...
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

// 新增的內容
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))


android {
    compileSdkVersion 28

...
...

    defaultConfig {
        // TODO: Specify your own unique Application ID (//developer.android.com/studio/build/application-id.html).
        applicationId "com.example.flutter_tester"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    // 新增內容 這塊就是從
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    // 新增內容
    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.release
        }
    }

現在應用打包的release版本將自動進行簽名。

三、打包命令

然後打包命令,構建發布版(release)APK。如果您完成了前一節中的簽名步驟,則會對APK進行簽名。

使用命令行:

cd <app dir> (<app dir> 為您的工程目錄).
運行flutter build apk (flutter build 默認會包含 --release選項).

打包好的發布APK位於/build/app/outputs/apk/app-release.apk。

四、包體積優化方法

發現flutter打包之後體積是有點大,我們來分析一下這個APK包的構成,我們主要來看不混淆的情況下。

全部內容可以點擊以下鏈接查看:

//www.chengxinsong.cn/post/110

//github.com/saucxs/full_stack_knowledge_list/blob/master/article/flutter/flutter_build_apk.md

字節跳動(社招)內推:

關注公眾號「松寶寫程式碼」,公眾號後台回復「加群」 加入我們一起學習。