美文网首页
Flutter集成与打包Android应用

Flutter集成与打包Android应用

作者: 一个半吊子工程师 | 来源:发表于2023-09-08 15:00 被阅读0次

    添加启动屏

    添加启动背景图

    修改文件目录drawable-v21\launch_background.xmldrawable\launch_background.xml

    image.png
    <?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    //添加 splash_screen_background这个是图片
        <item android:drawable="@drawable/splash_screen_background" /></layer-list>
    

    设置启动屏全屏

    styles.xml

        <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
    
            <item name="android:windowBackground">@drawable/launch_background</item>
    
            <item name="android:windowFullscreen">true</item>
    
        </style>
    

    支持刘海屏

    找到AndroidManifest.xml

    
    <activity
    
                android:name=".MainActivity"
    
                android:launchMode="singleTop"
    
                android:theme="@style/LaunchTheme"
    
                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    
                android:hardwareAccelerated="true"
    
                android:windowSoftInputMode="adjustResize">
    
                <!-- 支持刘海屏-->
    
                <meta-data android:name="android.notch_support"  android:value="true"/>
    

    设置状态栏为透明色

    image.png
    image.png
    package org.devio.flutter.bili.flutter_bili_app
    
     import android.graphics.Color
     import android.os.Build
     import android.os.Bundleimport io.flutter.embedding.android.FlutterActivity
    
    classMainActivity : FlutterActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                 valwindow = activity.window
                 //设置状态栏为透明色,fix 启动时状态栏会灰色闪一下
                 window.statusBarColor = Color.TRANSPARENT
             }
         }
    }
    

    修改后需要重新运行

    APP名字

    image.png

    快照名

    image.png

    AppID 和版本号

    image.png

    启动图标

    image.png

    配置网络权限

    AndroidManifest.xml中添加

    <uses-permission android:name="android.permission.INTERNET"/>
    

    签名APP

    构建release包需要用到keystore,如果你还没有keystore可以通过一下方式来创建:

    创建keystore

    Mac:

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

    Windows:

    keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
    

    -keystore:用户指定存储路径
    然后按照提示进行输入,完成所有输入之后会在上述路径中创建一个key.jks文件。然后将该文件复制到Flutter项目下的android目录下。


    image.png

    配置keystore

    在你的flutter应用/android目录下创建key.properties文件,然后添加:

    storePassword=<password from previous step>
    
    keyPassword=<password from previous step>
    
    keyAlias=key
    
    storeFile=../key.jks
    

    配置打包签名

    用AS打开你的flutter应用/android/app/build.gradle文件然后在android代码块上面添加:

       def keystoreProperties = new Properties()
    
       def keystorePropertiesFile = rootProject.file('key.properties')
    
       if (keystorePropertiesFile.exists()) {
    
           keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
       }
    
       android {
    
             ...
    
       }
    

    然后在android代码块中添加signingConfigs:

        signingConfigs {
    
            release {
    
                keyAlias keystoreProperties['keyAlias']
    
                keyPassword keystoreProperties['keyPassword']
    
                storeFile file(keystoreProperties['storeFile'])
    
                storePassword keystoreProperties['storePassword']
    
            }
    
        }
    

    最后在buildTypes代码块中添加release配置:

        buildTypes {
    
            release {
    
                signingConfig signingConfigs.release
    
            }
    
        }
    

    构建release包

    构建全部架构的安装包

    ./gradlew assembleRelease
    

    构建出来的Release包是包含所有ABI架构的。

    构建单一架构的安装包

    cd <flutter应用的android目录>
    
    flutter build apk --split-per-abi
    
     flutter build:命令默认会构建出release包
    
     --split-per-abi:表示构建单一架构
    

    上传应用

    安装包构建好之后发布到Android各大应用市场,无论是长传到那个应用市场首先需要注册该平台的开发者通过开发者认证后便可进行应用上传了。

    开发者注册和应用上传各大平台都有详细的说明教程和问题,下面分享国内比较大的应用市场:

    · 华为:https://consumer.huawei.com/cn/

    · 小米:https://dev.mi.com/console/

    · OPPO:https://open.oppomobile.com/

    · vivo:https://dev.vivo.com.cn/home

    · 百度:https://app.baidu.com/apps/

    有需要的小伙伴可以按照官方的说明进行注册和上传应用。

    FAQ

    启用代码压缩后无法打包

    很多同学会发现当启用代码压缩(minifyEnabled true )后,在打release包时报错,无法打出release包,那么只需将targetSdkVersion 和 compileSdkVersion 升级到 28。

    关联问题 @https://github.com/flutter/flutter/issues/26860#issuecomment-469751224

    安装release包运行crash报so包找不到

    flutter build apk会构建出包含x86_64、arm64-v8a、armeabi-v7a架构的安装包,但如何项目中所依赖的某个库和Flutter所支持的架构不一致就会出现so找不到的crash ,比如:XX三方库仅有armeabi-v7a的so,当APP被安装到支持arm64-v8a的手机上时,手机发现APP中包含arm64-v8a的目录,于是就向这个目录中查找某某三方库的so发现找不到就报错了。 解决方案是只会打armeabi-v7a架构的flutter so,所以在release包前需要添加如下配置:

    ndk {
    //只打包flutter所支持的架构,flutter没有armeabi架构的so,加x86的原因是为了能够兼容模拟器
    //abiFilters "armeabi-v7a","arm64-v8a","x86_64","x86" 
    //release 时只打"armeabi-v7包
    abiFilters "armeabi-v7a" 
    }
    

    相关文章

      网友评论

          本文标题:Flutter集成与打包Android应用

          本文链接:https://www.haomeiwen.com/subject/yccdvdtx.html