在这篇文章中,我们将为您详细介绍Flutter发布APK时进行代码/资源混淆的坑的内容,并且讨论关于flutterbuildapk的相关问题。此外,我们还会涉及一些关于android–flutterI
在这篇文章中,我们将为您详细介绍Flutter 发布APK时进行代码/资源混淆的坑的内容,并且讨论关于flutter build apk的相关问题。此外,我们还会涉及一些关于android – flutter Image.network没有正在发布apk、Android 资源混淆的方案及注意事项、dart – Flutter Error:当前的Flutter SDK版本是2.1.0-dev.0.0.flutter-be6309690f、Flutter - flutter desktop embedding / flutter 桌面支持的知识,以帮助您更全面地了解这个主题。
本文目录一览:- Flutter 发布APK时进行代码/资源混淆的坑(flutter build apk)
- android – flutter Image.network没有正在发布apk
- Android 资源混淆的方案及注意事项
- dart – Flutter Error:当前的Flutter SDK版本是2.1.0-dev.0.0.flutter-be6309690f
- Flutter - flutter desktop embedding / flutter 桌面支持
Flutter 发布APK时进行代码/资源混淆的坑(flutter build apk)
Flutter 发布APK时进行代码/资源混淆的坑
@author ixenos
1. 关键点
proguard是Java的代码混淆工具,但是当用第三方库的时候,必须要告诉proguard不要检查,因为第三方库里往往有些不会用到的类,没有正确引用,
此时必须设置-dontwarn,比如(-dontwarn io.Flutter.**),对第三方库进行warning忽略,否则编译不通过
2.在发布Flutter APK时,如需代码混淆,那么需要在/app/build.gradle中加入如下语句
1 ... 2 3 //这里对签名配置文件进行读取 4 def keystorePropertiesFile = rootProject.file("key.properties") 5 def keystoreProperties = new Properties() 6 keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 7 8 ... 9 10 android { 11 12 ... 13 14 //这里是签名配置, 15 signingConfigs { 16 release { 17 keyAlias keystoreProperties['keyAlias'] 18 keyPassword keystoreProperties['keyPassword'] 19 storeFile file(keystoreProperties['storeFile']) 20 storePassword keystoreProperties['storePassword'] 21 } 22 } 23 24 //发布配置 25 buildTypes { 26 release { 27 signingConfig signingConfigs.release 28 29 minifyEnabled true //资源压缩设置 30 useProguard true //代码压缩设置 31 32 //读取代码压缩配置文件 33 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 34 } 35 } 36 37 ... 38 39 }
那么在 "proguard-rules.pro" 文件中,我们就要加入 -dontwarn 语句对第三方库进行报错屏蔽,否则proguard的代码混淆无法进行
示例:
#Flutter Wrapper -dontwarn io.Flutter.** -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.** { *; }
android – flutter Image.network没有正在发布apk
得到奇怪的问题.如果我在模拟器中运行应用程序,工作正常.如果我通过连接Android设备安装app工作正常.但如果我通过Flutter build apk制作apk并安装在设备中.
网络形象不会来?为什么?什么事都出错了?无需提供代码.对于显示网络图像,我使用简单的Image.network与谷歌图像的网址.
我尝试过颤振干净,然后颤振构建apk – 发布但同样的问题来了
NOT WORKING BY RELEASE APK:
Uer-MacBook-Air:AppName user$Flutter build apk --release
Initializing gradle... 2.0s
Resolving dependencies... 3.1s
Running Gradle task 'assembleRelease'...
Running Gradle task 'assembleRelease'... Done 63.4s
Built build/app/outputs/apk/release/app-release.apk (8.1MB).
WORKING BY DEBUG APK
Uer-MacBook-Air:AppName user$Flutter build apk --debug
Initializing gradle... 3.5s
Resolving dependencies... 5.5s
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done 36.2s
Built build/app/outputs/apk/debug/app-debug.apk.
有人遇到过这种问题吗?我已经安装了许多apk由Flutter build apk,这工作正常,现在不能在发布模式下工作?但是,当我尝试使用调试模式Flutter build apk –debug它的工作正常意味着图像正在显示?
我必须为发布模式apk添加一些权限吗?
解决方法:
是的,将这些权限添加到AndroidManifest.xml,它将起作用
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
更新:只有INTERNET权限就足够了
<uses-permission android:name="android.permission.INTERNET" />
Android 资源混淆的方案及注意事项
原理
Android的资源类型是很多的,比如说drawable,string,layout等,aapt在打包时,会将这些资源的名称,id和位置打包进一个resources.arsc包。 通过AndroidStudio可以查看resouces.arsc文件的内容。
AndResGuard大致上做的就是修改资源的名称和路径,修改为a b c这种简短的名称。
注意事项
如果你的资源,存在使用插件化的方式加载的,即:使用名称去找id,再用id去加载资源,由于资源的名称已经修改过了,所以会无法找到id。这种情况不能混淆。框架中提供了添加白名单的方法。 但是三方sdk中隐藏的插件化方式有点防不胜防。官方提供了常见的sdk白名单
使用方法
我使用的是gradle集成的方式
1.添加gradle配置
2.设置白名单,我设置了除了layout以外所有的资源不进行混淆,因为我的需求是应付安全监测,并且我们的项目中存在图片插件加载,为了降低后期维护成本,就不进行混淆了。
3.执行命令:resguardRelease 与assemble类似
具体可以参考github
一些细节
- mappingFile要不要加?我选择不加,加了之后,会keep住资源的路径,如果对增量包大小有要求的,可以加。不加的话,包体积可以进一步减小,并在一定程度上提高反编译的难度。
- mergeDuplicationedRes要不要加?我是加的。是否会造成什么问题?应该是不会的。因为框架本质上修改的是图片的指向的路径,图片的名称和id都没有修改,所以不管是正常引用和插件化加载都是没问题的。
附:美团的资源混淆方案
Android查找资源的流程
在Android系统中,每一个应用程序一般都会配置很多资源,用来适配不同密度、大小和方向的屏幕,以及适配不同的国家、地区和语言等等。这些资源是在应用程序运行时自动根据设备的当前配置信息进行适配的。这也就是说,给定一个相同的资源ID,在不同的设备配置之下,查找到的可能是不同的资源。
这个查找过程对应用程序来说,是完全透明的,这个过程主要是靠Android资源管理框架来完成的,而Android资源管理框架实际是由AssetManager和Resources两个类来实现的。其中,Resources类可以根据ID来查找资源,而AssetManager类根据文件名来查找资源。事实上,如果一个资源ID对应的是一个文件,那么Resources类是先根据ID来找到资源文件名称,然后再将该文件名称交给AssetManager类来打开对应的文件的。
基本流程如下图:
通过上图我们可以看到Resources是通过resources.arsc把Resource的ID转化成资源文件的名称,然后交由AssetManager来加载的。
而Resources.arsc这个文件是存放在APK包中的,他是由AAPT工具在打包过程中生成的,他本身是一个资源的索引表,里面维护者资源ID、Name、Path或者Value的对应关系,AssetManager通过这个索引表,就可以通过资源的ID找到这个资源对应的文件或者数据。
AAPT
AAPT是Android Asset Packaging Tool的缩写,它存放在SDK的tools/目录下,AAPT的功能很强大,可以通过它查看查看、创建、更新压缩文件(如 .zip文件,.jar文件, .apk文件), 它也可以把资源编译为二进制文件,并生成resources.arsc, AAPT这个工具在APK打包过程中起到了非常重要作用,在打包过程中使用AAPT对APK中用到的资源进行打包,这里不对AAPT这个工具做过多的讨论,只看一下AAPT这个工具在打包过程中起到的作用,下图是AAPT打包的流程:
AAPT这个工具在打包过程中主要做了下列工作:
- 把”assets”和”res/raw”目录下的所有资源进行打包(会根据不同的文件后缀选择压缩或不压缩),而”res/”目录下的其他资源进行编译或者其他处理(具体处理方式视文件后缀不同而不同,例如:”.xml”会编译成二进制文件,”.png”文件会进行优化等等)后才进行打包;
- 会对除了assets资源之外所有的资源赋予一个资源ID常量,并且会生成一个资源索引表resources.arsc;
- 编译AndroidManifest.xml成二进制的XML文件;
- 把上面3个步骤中生成结果保存在一个*.ap_文件,并把各个资源ID常量定义在一个R.java中;
资源混淆
我们知道在系统的Proguard中,对APK中资源文件名使用简短无意义名称进行替换,给破解者制造困难,从而做到资源的相对安全。通过阅读AAPT编译资源的代码,我们发现修改AAPT在处理资源文件相关的源码是能够做到资源文件名的替换,下面是Resource.cpp中makeFileResources()的修改的代码片段:
static status_t makeFileResources(Bundle* bundle, const sp<AaptAssets>& assets, ResourceTable* table, const sp<ResourceTypeSet>& set, const char* resType) { String8 type8(resType); String16 type16(resType); bool hasErrors = false; ResourceDirIterator it(set, String8(resType)); ssize_t res; while ((res=it.next()) == NO_ERROR) { if (bundle->getVerbose()) { printf(" (new resource id %s from %s)\n", it.getBaseName().string(), it.getFile()->getPrintableSource().string()); } String16 baseName(it.getBaseName()); const char16_t* str = baseName.string(); const char16_t* const end = str + baseName.size(); while (str < end) { if (!((*str >= ''a'' && *str <= ''z'') || (*str >= ''0'' && *str <= ''9'') || *str == ''_'' || *str == ''.'')) { fprintf(stderr, "%s: Invalid file name: must contain only [a-z0-9_.]\n", it.getPath().string()); hasErrors = true; } str++; } String8 resPath = it.getPath(); resPath.convertToResPath(); String8 obfuscationName; String8 obfuscationPath = getObfuscationName(resPath, obfuscationName); table->addEntry(SourcePos(it.getPath(), 0), String16(assets->getPackage()), type16, baseName, // String16(obfuscationName), String16(obfuscationPath), // resPath NULL, &it.getParams()); assets->addResource(it.getLeafName(), obfuscationPath/*resPath*/, it.getFile(), type8); } return hasErrors ? UNKNOWN_ERROR : NO_ERROR; }
上述代码是在ResourceTable和Assets中添加资源文件时, 对资源文件名称进行修改,这就能够做到资源文件名称的替换,这样通过使用修改过的AAPT编译资源并进行打包,从而达到保护资源的目的。
以上就是Android 资源混淆的使用及注意事项的详细内容,更多关于Android 资源混淆的资料请关注其它相关文章!
- Android使用插件实现代码混淆
- Android 一些常用的混淆Proguard
- Android Studio配置反混淆的实现
- Android studio 混淆配置详解
- 详解Android代码混淆实战
- Android常用三方库混淆规则整理(小结)
- Android代码混淆的写法总结
- proguar在Android混淆中的用法
- 详解Android的反编译和代码混淆
- Android studio 混淆+打包+验证是否成功
- Android studio利用gradle打jar包并混淆的方法详解
dart – Flutter Error:当前的Flutter SDK版本是2.1.0-dev.0.0.flutter-be6309690f
The current Dart SDK version is 2.1.0-dev.0.0.Flutter-be6309690f. Because buddy depends on Flutter_built_redux 0.4.5 which requires SDK version >=1.19.0 <2.0.0,version solving Failed. pub get Failed (1)
如何降级Dart或如何解决此问题,我在mac上运行android studio.
我试过通过改变颤动的通道开发和主人,但它并没有什么区别.
扑医生-v结果:
[✓] Flutter (Channel dev,v0.6.0,on Mac OS X 10.13.4 17E202,locale en-IN) • Flutter version 0.6.0 at /Users/pro/Downloads/Flutter • Framework revision 9299c02cf7 (5 days ago),2018-08-16 00:35:12 +0200 • Engine revision e3687f70c7 • Dart version 2.1.0-dev.0.0.Flutter-be6309690f [✓] Android toolchain - develop for Android devices (Android SDK 27.0.3) • Android SDK at /Users/pro/Library/Android/sdk • Android NDK location not configured (optional; useful for native profiling support) • Platform android-27,build-tools 27.0.3 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_152-release- 1024-b01) • All Android licenses accepted. [✓] iOS toolchain - develop for iOS devices (Xcode 9.4.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 9.4.1,Build version 9F2000 • ios-deploy 1.9.2 • CocoaPods version 1.5.0 [✓] Android Studio (version 3.1) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 27.1.1 • Dart plugin version 173.4700 • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01) [!] Connected devices ! No devices available
解决方法
错误是由包而不是Flutter sdk引起的.
看这里
https://github.com/davidmarne/flutter_built_redux/blob/master/pubspec.yaml#L22
和
您可以使用此链接在Flutter_built_redux包上发布问题
https://github.com/davidmarne/flutter_built_redux/issues/new?title=support%20for%20flutter%20sdk%202.1.0.dev&body=please%20upgrade%20the%20package%20for%20new%20flutter%20releases
Flutter - flutter desktop embedding / flutter 桌面支持
2019年5月9日,随着谷歌在IO19宣布Flutter支持Web平台,就标志着Flutter已经全面支持所有平台(移动、网页、桌面、嵌入式)。
现编一个跨平台小段子:
微软Xarmarin:喵喵喵???不是我最先做的吗,咋没人关注???
Facebook React Native:我是做的最好的跨平台。
谷歌Flutter:去你的吧,支持桌面端不,嵌入式?哈哈哈
苹果SwiftUI:老司机们,等等我。
但是这次要说的是,Flutter for desktop,Flutter支持桌面版已经有很长一段时间了,但是一直都没大研究。主要原因就是现在除了Flutter for mobile可以用在production以外,其他的三个平台知识现在已经验证技术上可行,但仍处于technical preview。像现在的官方大部分plugins,仍然没有适配desktop版本,更不要说第三方的plugins。这些plugins在桌面上调用时,轻者会点击毫无反应,重者会导致程序崩溃。而且现在桌面版普遍的一个问题就是,当app最小化的时候,app崩溃。
所以大家激动归激动,千万别冲动。
不过既然有了Flutter for desktop,我们就尝鲜一下,看看在桌面上是什么效果。
1 工具准备
我用的是Windows平台,需要Visual Studio 2017 or 2019,并且包含“C++桌面开发负载”。其他平台可以去Github主页查看。
2 下载官方示例
打开 Desktop Embedding for Flutter,下载整个项目并解压。把整个example文件夹拖进VS Code或者在VS Code 里面打开文件夹,
然后VS Code提示 Some packages are missing or out of date, would you like to get them Now?
毫不犹豫的点击Get Packages按钮,或者在终端输入Flutter packages get也行
如果网络没问题的话或者镜像配置正确(下载不下来或者配置镜像自行搜索,本文不做介绍)的话,VS Code就会输出
[example] Flutter packages get Running "Flutter pub get" in example... 6.7s exit code 0
3 桌面版运行配置
由于我们下载的是官方示例,所里都配置好了。但是我们还是要看一下,因为以后要移植自己的项目鸭~~~
3a 打开pubspec.yaml文件
# See https://github.com/Flutter/Flutter/wiki/Desktop-shells#fonts fonts: - family: Roboto fonts: - asset: fonts/Roboto/Roboto-Thin.ttf weight: 100 - asset: fonts/Roboto/Roboto-Light.ttf weight: 300 - asset: fonts/Roboto/Roboto-Regular.ttf weight: 400 - asset: fonts/Roboto/Roboto-Medium.ttf weight: 500 - asset: fonts/Roboto/Roboto-Bold.ttf weight: 700 - asset: fonts/Roboto/Roboto-Black.ttf weight: 900
官方指定了Roboto字体,大部分应用也都需要指定一个字体。但是现在的话,不指定,也可以运行。不过有的Widgets可能在字体显示上有异常。
官方的解释:
Fonts Flutter applications may default to fonts that are standard for the target platform, but unavailable on desktop. For instance, if the target platform is TargetPlatform.iOS the Material library will default to San Francisco, which is available on macOS but not Linux or Windows. Most applications will need to set the font (e.g., via ThemeData) based on the host platform, or set a specific font that is bundled with the application. Other widgets that doesn't use ThemeData may not display without extra font specification (e.g., the DEBUG banner's text). Symptoms of missing fonts include text failing to display and/or console logging about failure to load fonts.
3b 打开main.dart
设置运行平台
import 'package:Flutter/foundation.dart' show debugDefaultTargetPlatformOverride; void main() { // See https://github.com/Flutter/Flutter/wiki/Desktop-shells#target-platform-override debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; runApp(new MyApp()); }
3c 切换Flutter到master channel
在终端中输入
Flutter channel master
3d 升级master channel到最新版,然后会自动运行运行Flutter doctor
Flutter upgrade
3e 设置运行平台为桌面模式
如果VS Code终端是PowerShell,那么输入
$env:ENABLE_FlutteR_DESKTOP="true"
CMD输入
set ENABLE_FlutteR_DESKTOP=true
4 Flutter Run
如果按照上面操作没有问题的话,那么最激动
关于Flutter 发布APK时进行代码/资源混淆的坑和flutter build apk的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – flutter Image.network没有正在发布apk、Android 资源混淆的方案及注意事项、dart – Flutter Error:当前的Flutter SDK版本是2.1.0-dev.0.0.flutter-be6309690f、Flutter - flutter desktop embedding / flutter 桌面支持等相关内容,可以在本站寻找。
本文标签: