flutter混淆编译生成releaseAPK文件

本文详细介绍了如何在Flutter项目中生成key.jks文件并进行配置,以实现应用的正式发布。同时,提供了如何设置混淆文件proguard-rules.pro以减少APK大小的方法,并解决常见的混淆失败问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flutter 学习demo记录:https://github.com/carlzhan/learning_flutter

喜欢的随手来个star,谢谢

 

通过命令生成key.jks文件

keytool -genkey -v -keystore 秘钥文件目录/名称.jks -keyalg RSA -keysize 2048 -validity 有效天数 -alias 昵称 

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

在目录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.debug

            minifyEnabled true
            useProguard true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

	    dependencies {
	        implementation 'com.android.support:support-fragment:28.0.0'
	    }
        }
    }
...
}

在目录android下创建文件key.properties

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

在android->app目录下创建混淆文件proguard-rules.pro

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

命令行中执行命令:flutter build apk

就可以在\build\app\outputs\apk\release目录中看到app-release.apk文件

常见混淆失败报错:
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'void setContentView(android.view.View)' in program class io.flutter.embedding.android.FlutterActi
vity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'void addContentView(android.view.View,android.view.ViewGroup$LayoutParams)' in program class io.f
lutter.embedding.android.FlutterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.res.Resources$Theme getTheme()' in program class io.flutter.embedding.android.Flu
tterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.res.Resources getResources()' in program class io.flutter.embedding.android.Flutt
erActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.view.Window getWindow()' in program class io.flutter.embedding.android.FlutterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.support.v4.app.FragmentManager getSupportFragmentManager()' in program class io.flutter.e
mbedding.android.FlutterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.Intent getIntent()' in program class io.flutter.embedding.android.FlutterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.Context getApplicationContext()' in program class io.flutter.embedding.android.Fl
utterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.pm.PackageManager getPackageManager()' in program class io.flutter.embedding.andr
oid.FlutterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.ComponentName getComponentName()' in program class io.flutter.embedding.android.F
lutterActivity
Warning: io.flutter.embedding.android.FlutterActivity: can't find referenced method 'android.content.pm.ApplicationInfo getApplicationInfo()' in program class io.flutter.embedding.an
droid.FlutterActivity
Warning: io.flutter.embedding.android.FlutterFragment: can't find referenced method 'void setArguments(android.os.Bundle)' in program class io.flutter.embedding.android.FlutterFragme
nt
Warning: io.flutter.embedding.android.FlutterFragment: can't find referenced method 'android.support.v4.app.FragmentActivity getActivity()' in program class io.flutter.embedding.andr
oid.FlutterFragment
Warning: io.flutter.embedding.android.FlutterFragment: can't find referenced method 'android.os.Bundle getArguments()' in program class io.flutter.embedding.android.FlutterFragment
Warning: io.flutter.embedding.android.FlutterFragment: can't find referenced method 'android.content.Context getContext()' in program class io.flutter.embedding.android.FlutterFragme
nt
Warning: io.flutter.embedding.android.FlutterFragment: can't find referenced method 'android.content.res.Resources getResources()' in program class io.flutter.embedding.android.Flutt
erFragment
Warning: io.flutter.embedding.android.FlutterFragment$1: can't find referenced method 'android.support.v4.app.FragmentActivity getActivity()' in program class io.flutter.embedding.an
droid.FlutterFragment
Warning: io.flutter.embedding.android.FlutterFragment$Builder: can't find referenced method 'void setArguments(android.os.Bundle)' in program class io.flutter.embedding.android.Flutt
erFragment
Warning: there were 18 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile the code.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
Thread(Tasks limiter_10): destruction

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
> Job failed, see logs for details

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 4s
Running Gradle task 'assembleRelease'...
Running Gradle task 'assembleRelease'... Done                       4.7s
*******************************************************************************************
The Gradle failure may have been because of AndroidX incompatibilities in this Flutter app.
See https://goo.gl/CP92wY for more information on the problem and how to fix it.
*******************************************************************************************
Gradle task assembleRelease failed with exit code 1

The Flutter Android Java code contains references to the Android fragment support library. But the default template Flutter app does not use fragments, so the template build.gradle script does not link in the fragment support library in order to reduce APK binary size.

However, Proguard will scan all the classes in the app and will generate the errors seen above unless it can find the fragment support classes.

You may need to declare a different dependency if you app uses the AndroidX libraries instead of support-fragment.

For example:

buildTypes {
        release {
            signingConfig signingConfigs.debug

            minifyEnabled true
            useProguard true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

	    dependencies {
	        implementation 'com.android.support:support-fragment:28.0.0'
	    }
        }
    }
### 如何在 Flutter 项目中禁用代码混淆Flutter 中,默认情况下,发布模式下的构建会启用代码树摇动(Tree Shaking)以及 Dart 的混淆功能来优化应用体积并保护代码逻辑。如果希望完全禁用这些功能,则可以通过修改 `flutter build` 命令中的参数或者配置文件实现。 以下是具体方法: #### 方法一:通过命令行参数禁用代码混淆 可以使用 `-d` 参数指定设备,并通过设置环境变量 `DART_OBFUSCATION=false` 来显式禁用代码混淆[^1]。例如,在执行构建命令时加入如下选项: ```bash DART_OBFUSCATION=false flutter build apk --release ``` 此方式适用于临时需求场景下快速测试无混淆版本的应用程序效果。 #### 方法二:编辑 `.dart_tool/package_config.json` 对于更持久化的更改,可以在项目的根目录找到 `.dart_tool/package_config.json` 文件,并手动调整其中关于 stagehand 或其他插件的相关配置项以移除任何可能触发自动开启混淆行为的部分[^2]。不过需要注意的是该文件通常是自动生成的,因此建议优先考虑第三种全局范围内的解决办法。 #### 方法三:更新 pubspec.yaml 添加额外元数据标记 另一种推荐的方式是在 `pubspec.yaml` 文件里增加特定字段声明不希望被处理的内容区域。虽然官方文档并未直接提及如何针对整个工程彻底关闭这一特性,但是可以通过添加注解形式绕过某些敏感片段的实际转换过程。比如下面的例子展示了怎样利用 custom metadata 实现目的: ```yaml flutter: uses-material-design: true meta_data: no-obfuscate-files: - 'lib/sensitive_code/*.dart' ``` 以上定义意味着所有位于 lib/sensitive_code 子路径下的 dart 脚本都不会受到最终打包阶段的影响而保持原始状态不变[^3]。 另外值得注意的一点是,即便完成了上述操作之后仍然有可能遇到类似错误提示:“GOMA usage was specified but can't be found...”,这是因为远程分布式编译服务未正确定位所致;对此只需按照报错信息指示重新确认 GOMA_DIR 变量指向即可恢复正常流程运行。 最后附带一段简单的辅助函数用于验证当前工作区是否存在潜在影响正常发布的异常情况: ```python def check_build_env(): import os goma_dir = os.getenv('GOMA_DIR') if not goma_dir or not os.path.exists(goma_dir): print("Warning! GOMA directory misconfigured.") check_build_env() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值