上一篇,使用material原生控件完成了人生的一個(gè)用flutter開(kāi)發(fā)的APP,這兩天為了理解flutter,翻了很多資料,信息量太大,燒了不少腦子,今天這篇就簡(jiǎn)單點(diǎn),實(shí)戰(zhàn)走一下安卓客戶端的打包流程,看看會(huì)遇到什么問(wèn)題。想查看官方資料的請(qǐng)移步Preparing an Android App for Release。
第一步
首先,你需要找到這幾個(gè)路徑下的文件,并配置其中的幾個(gè)參數(shù):
配置APP圖標(biāo)
- 項(xiàng)目目錄/android/app/src/main/res/
進(jìn)入這個(gè)路徑后,會(huì)看到很多個(gè)以mipmap-為前綴命名的文件夾,文件夾名稱的后綴是對(duì)應(yīng)的APP圖標(biāo)像素密度:
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi
將對(duì)應(yīng)像素密度的圖片放入對(duì)應(yīng)的文件夾中,圖片記得用png格式,安裝的APP會(huì)根據(jù)對(duì)應(yīng)的屏幕像素密度使用適應(yīng)尺寸的圖標(biāo),但要注意,APP圖標(biāo)文件最好統(tǒng)一使用同一個(gè)名字,方便后面配置。
配置APP名稱、圖標(biāo)和系統(tǒng)權(quán)限
- 項(xiàng)目目錄/android/app/src/main/AndroidManifest.xml
application標(biāo)簽內(nèi)部:
android:label="myflutter" //此屬性為你的APP安裝到手機(jī)上顯示的名稱,支持中文,所以取名的時(shí)候請(qǐng)浪一點(diǎn)~
android:icon="@mipmap/ic_test" //此屬性為APP圖標(biāo)用到的圖片文件名稱
//這里圖片文件不需要輸入文件格式后綴,前面說(shuō)過(guò)的要使用相同文件名,因?yàn)檫@里并沒(méi)有按像素密度分別配置對(duì)應(yīng)的圖片文件
uses-permission標(biāo)簽,此標(biāo)簽定義APP的系統(tǒng)權(quán)限,比如打開(kāi)麥克風(fēng)攝像頭啦、獲取聯(lián)系人號(hào)碼簿啦、是否允許上網(wǎng)等等等,權(quán)限有很多,具體請(qǐng)參考翻墻官網(wǎng)。在這里,默認(rèn)配置了一個(gè)android:name="android.permission.INTERNET"的權(quán)限,意思是允許手機(jī)聯(lián)網(wǎng),因?yàn)閒lutter和APP交換數(shù)據(jù)需要用到這個(gè)權(quán)限。
第二步
APP注冊(cè)
生成keystore
官方寫(xiě)的很簡(jiǎn)單,終端下輸入命令即可獲?。?/p>
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
然而實(shí)際上的效果是:

然后官方note了一下,說(shuō)可能會(huì)因?yàn)檎也坏?strong>keytool而報(bào)錯(cuò),叫我們輸入flutter doctor命令,從結(jié)果的Java binary at:中找到keytool.exe文件路徑再執(zhí)行上面的命令,然而我使用了N次flutter doctor也沒(méi)找到Java binary at::

正確的打開(kāi)方式是輸入下面這個(gè)命令:
flutter doctor -v
然后你看到的結(jié)果是:

啊喂~那個(gè)官方文檔是不是忘了更新啦。
然后我們復(fù)制上圖中的路徑,輸入這個(gè)命令:
E:\Applications\AndroidStudio\jre\bin\keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
注意,把路徑中最后的java替換成keytool。
這時(shí)候會(huì)彈出一堆問(wèn)詢,小伙伴們按要求填寫(xiě)即可:

但是按要求操作的小伙伴并不能如愿以償?shù)玫浇Y(jié)果,由于當(dāng)前的目錄下沒(méi)有寫(xiě)的權(quán)限,所以要找一個(gè)有寫(xiě)入權(quán)限的路徑放置生成的KEY,于是上面的命令變成了:
E:\Applications\AndroidStudio\jre\bin\keytool -genkey -v -keystore /E:/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
注意看~/key.jks改成了/E:/key.jks,于是乎:

然后到E盤(pán)根目錄下可以發(fā)現(xiàn)多了一個(gè)key.jks文件,記住:不要把這個(gè)jks文件共享給任何人??!不要把這個(gè)jks文件共享給任何人!!不要把這個(gè)jks文件共享給任何人??!尤其是只圖方便把源碼一股腦簽入github的XX,如果是為公司做的APP,后果自己想~。
這時(shí)候到項(xiàng)目目錄的android文件夾下創(chuàng)建一個(gè)名為key.properties的文件,并打開(kāi)貼入以下代碼:
storePassword=<password from previous step> //輸入上一步創(chuàng)建KEY時(shí)輸入的 密鑰庫(kù) 密碼
keyPassword=<password from previous step> //輸入上一步創(chuàng)建KEY時(shí)輸入的 密鑰 密碼
keyAlias=key
storeFile=<E:/key.jks> //key.jks的存放路徑
這個(gè)key.properties文件也不要共享出去??!
配置key注冊(cè)
進(jìn)入項(xiàng)目目錄的/android/app/build.gradle文件,在android {這一行前面,加入如下代碼:
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
把如下代碼:
buildTypes {
release {
signingConfig signingConfigs.debug
}
}
替換成:
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
到defaultConfig中,錄入APPID和版本號(hào),版本號(hào)命名控制參考翻墻吧你少年:
defaultConfig {
applicationId "com.example.myflutter" //APPID
minSdkVersion 16 //可運(yùn)行應(yīng)用的最低版本的 Android 平臺(tái),由該平臺(tái)的 API 級(jí)別標(biāo)識(shí)符指定
targetSdkVersion 27 //指定運(yùn)行應(yīng)用的目標(biāo) API 級(jí)別。在某些情況下,這允許應(yīng)用使用在目標(biāo) API 級(jí)別中定義的清單元素或行為,而不是僅限于使用那些針對(duì)最低 API 級(jí)別定義的元素或行為。
versionCode 1 //內(nèi)部版本號(hào)
versionName "1.0" //對(duì)外公布的版本號(hào)
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
第三步
編譯生成apk文件
到終端中輸入如下命令:
flutter build apk
耐心等待執(zhí)行完畢后你會(huì)看到:

然后到圖中標(biāo)識(shí)的路徑下,找到生成apk文件,即打包完成了,你也可以在終端輸入命令安裝APP:
flutter install
安裝時(shí),會(huì)把原來(lái)調(diào)試運(yùn)行安裝的APP卸載掉,重新安裝新的APP:

然后看手機(jī)上:

O了,今天的搬運(yùn)到此完畢,走過(guò)一遍流程下來(lái)發(fā)現(xiàn)官網(wǎng)文檔可能沒(méi)及時(shí)更新,導(dǎo)致我踩了幾個(gè)坑,不過(guò)總體來(lái)說(shuō)還比較簡(jiǎn)單,大家可以自己搞搞試試,就到這里,補(bǔ)瞌睡去~
flutter 中文社區(qū)(官方QQ群:338252156)