Android与iOS包体优化及一键自动打包脚本

目录
  • 系统信息
    • 介绍
  • 安卓APK优化包体大小
    • 一、原理与介绍
    • 二、Flutter代码配置
    • 三、Android代码配置
    • 四、多渠道调试与打包指令
  • 安卓一键打包脚本
    • 一、简单介绍
    • 二、项目路径结构
    • 三、脚本内容
    • 四、脚本使用步骤
  • 苹果优化包体大小
    • 一、常规优化(分发到 App Store 或者 打Ad hoc 测试包)
    • 二、非常规优化
      • 1、Flutter导出IPA(共4步)
      • 2、第一次优化包体大小(共5步)
      • 3、第二次优化包体大小(共6步)
      • 4、一些说明
  • 苹果一键打包脚本
    • 一、简单介绍
    • 二、项目路径结构
    • 三、脚本内容
    • 四、plist文件
    • 五、脚本使用步骤

系统信息

  • System version: MacOS 12
  • Flutter version: 1.22.5
  • Dart version: 2.10.4
  • Android Studio version: 4.1.1

介绍

  • APK优化包体大小
  • APK多渠道打包
  • APK一键打包脚本
  • IPA优化包体大小
  • IPA无签名打包
  • IPA一键打包脚本

脚本地址

github脚本地址

安卓APK优化包体大小

  • 优化图片等资源大小,删除无用资源
  • 只选择保留必要的so库。第三方SDK也尽量只里保留必要的so库,优化后的包体至少减少几十兆

参考修改android/app/build.gradle 文件

    buildTypes {
        release {
            ndk{
                //"armeabi","armeabi-v7a","arm64-v8a","x86_64","x86"  //x86是兼容模拟器的
                abiFilters "armeabi","armeabi-v7a","arm64-v8a"  //手机没什么x86框架的,只包含arm32和arm64即可
            }
        }
    }

安卓多渠道配置与打包

一、原理与介绍

  • 从 Flutter v1.17 开始,Flutter 命令工具增加了自定义参数的功能 --dart-define,我们可以用这个命令参数在打包或运行 App 时设置参数。这样我们就能在Flutter代码和原生代码中获取传过来的参数,从而实现多渠道功能。
  • 假设我们设置5个渠道 1、应用宝, 2、华为商店, 3、小米商店,4、OPPO商店 5、VIVO商店

二、Flutter代码配置

1、获取参数

配置文件路径:lib/main.dart

/// 这里定义环境变量配置
class EnvironmentConfig {
  static const CHANNEL = String.fromEnvironment('CHANNEL');
  //DEBUG = Y 是调试模式,其他为生产模式
  static const DEBUG = String.fromEnvironment('DEBUG');
}

2、任意的地方使用参数

#获取CHANNEL 参数值
String appMarket = EnvironmentConfig.CHANNEL;
#获取DEBUG 参数值
String debug = EnvironmentConfig.DEBUG;

三、Android代码配置

1、获取参数

配置文件路径:android/app/build.gradle

/// 获取渠道参数使用,这里设置一下默认值
def dartEnvironmentVariables = [
        CHANNEL: 'YYB',
        DEBUG: '',
]
if (project.hasProperty('dart-defines')) {
    dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
                def pair = URLDecoder.decode(entry).split('=')
                [(pair.first()): pair.last()]
            }
}

2、使用

配置文件路径:android/app/build.gradle

//例子:打包APK时修改文件名带上渠道参数,还有一些SDK也可以通过这种方式设置参数
//dartEnvironmentVariables.CHANNEL 使用参数
android{
   android.applicationVariants.all {
        variant ->
            variant.outputs.all {
                output ->
                    def outputFile = output.outputFile
                    if (outputFile.name.contains("release")) {
                        outputFileName = "APP_${getDateTime()}_${dartEnvironmentVariables.CHANNEL}.apk"
                    }
            }
    }
}

四、多渠道调试与打包指令

# 调试例子1:设置渠道为应用宝。
flutter run --dart-define=CHANNEL=YYB
# 调试例子2:设置渠道为应用宝。DEBUG参数是Y
flutter run --dart-define=CHANNEL=YYB --dart-define=DEBUG=Y
#打包例子1:打包应用宝渠道包
flutter build apk --dart-define=CHANNEL=YYB
#打包例子2:打包应用宝渠道包,DEBUG参数是Y
flutter build apk --dart-define=CHANNEL=YYB --dart-define=DEBUG=Y

安卓一键打包脚本

一、简单介绍

通过上面的配置和优化后我们就能开始执行脚本打包了,本脚本主要实现了以下功能

  • 可控制是否执行 flutter clean 清理指令(回车或者5秒无指令输入默认不清理)
  • 可控制只打某个渠道包或者全部渠道包(回车或者5秒无指令输入默认打全部包)
  • 可设置渠道种类数组,可无限扩展
  • 成功打包后自动打开文件夹
  • 实现无人值守打包

二、项目路径结构

1、shell 目录存放脚本文件 ,papk.sh 是安卓脚本

2、prod 目录导出打包文件

三、脚本内容

#!/bin/sh
#---------------------必须修改:渠道数组----------------#
channels=(YYB HUAWEI MI OPPO VIVO)
#当前工程绝对路径
project_path=$(pwd)
#安卓包product文件夹路径
prod_path=${project_path}/prod/apk/
#Flutter打包生成的最初地址
release_path=${project_path}/build/app/outputs/apk/release/
clean_tips="执行flutter clean(默认:n) [ y/n ]"
echo $clean_tips
read  -t 5 is_clean
if [  ! -n "${is_clean}" ];then
    is_clean="n"
fi
while([[ $is_clean != "y" ]] && [[ $is_clean != "n" ]])
do
  echo "错误!只能输入[ y/n ] !!!"
  echo $clean_tips
  read is_clean
done
tips="请输入选择渠道(默认:0) [ ALL: 0 "
c_length=${#channels[@]};
for(( i=0; i<$c_length; i++)) do
  if (($i < $c_length-1 )); then
    tips="${tips}${channels[i]}: $((i+1)) "
  else
    tips="${tips}${channels[i]}: $((i+1)) ]"
  fi
done;
echo $tips
read  -t 5 number
if [  ! -n "${number}" ];then
    number=0
fi
while(( $number < "0" || $number > $c_length ))
do
  echo "错误!只能输入0到${c_length} !!!"
  echo $tips
  read number
done
#如果有product/apk文件夹则删除,然后再创建一个空文件夹
if [ -d ${prod_path} ]; then
  rm -rf ${prod_path}
fi
#创建目录
mkdir -p ${prod_path}
if [ ${is_clean} = "y" ];then
  echo "=============== 开始清理 ==============="
    flutter clean
fi
if (($number == 0 )); then
  echo "=============== 开始构建:全部渠道包 ==============="
  for(( i=0;i<${c_length};i++)) do
    echo "正在构建:${channels[$i]} 渠道包"
    flutter build apk --no-shrink --dart-define=CHANNEL=${channels[$i]}
    cp -R ${release_path}*.apk ${prod_path}
  done;
else
  echo "=============== 正在构建:${channels[$((number-1))]} 渠道包 ==============="
  flutter build apk --no-shrink --dart-define=CHANNEL=${channels[$((number-1))]}
  cp -R ${release_path}*.apk ${prod_path}
fi
#判断apk目录下是否有文件
if [ "$(ls -A $prod_path)" ]; then
  echo "=============== APK包已导出:$prod_path ==============="
  open $prod_path
else
  echo '=============== APK包导出失败 ==============='
  exit 1
fi
exit 0

四、脚本使用步骤

  • 1、在项目根目录创建一个shell文件夹
  • 2、在shell目录创建papk.sh文件,并粘贴脚本内容。修改channels渠道数组变量值为自己的,然后保存脚本
  • 3、项目根目录执行命令添加执行权限: chmod u+x shell/papk.sh
  • 4、项目根目录执行命令:./shell/papk.sh

苹果优化包体大小

一、常规优化(分发到 App Store 或者 打Ad hoc 测试包)

  • 优化图片等资源大小,删除无用资源,比较简单,而且对于一般的app来说优化效果不大,这里就不详细说明了。
  • 只选择保留必要的指令集类型。xcode 12以上默认是包含armv7和arm64位两种指令集。我们打Release包时可以排除armv7指令集。只保留arm64指令集就可以了 看图操作:

** 如果担心兼容性的,下面再附一张指令集对应手机型号的图 **

二、非常规优化

一般情况下我们使用xcode分发的时候,xcode还会帮我们优化一次代码大小的,包体大概能减少一半以上。然鹅,如果需要自己导出一个无签名的IPA包时我们应该怎么优化包体大小?下面是我总结的操作步骤

1、Flutter导出IPA(共4步)

  • 执行flutter build ios --release 生成Runner.app文件
  • 在Runner.app目录下新建一个Payload文件夹, 并将该 app 拖进去
  • 右键->压缩"Payload"为Payload.zip
  • 将生成的 Payload.zip 文件更名为 xxx.ipa 即可得到 ipa 安装包

2、第一次优化包体大小(共5步)

上面生成的ipa大的离谱。动不动就几百兆。所以,我们需要利用Xcode来帮忙优化一下Runner.app。总体步骤比上面的打包多了一步。

  • 执行flutter build ios --release 生成Runner.app文件
  • 使用xcode打开项目,然后点击product->build。成功后生成一个新的Runner.app。
  • 在Runner.app目录下新建一个Payload文件夹, 并将该 app 拖进去
  • 右键->压缩"Payload"为Payload.zip
  • 将生成的 Payload.zip 文件更名为 xxx.ipa 即可得到 ipa 安装包

一顿操作后,包体大概能减少几十或者上百兆。看着很可观,但是由于原来的包实在太大,即使减了这么多,可能最终还有一百来兆。

3、第二次优化包体大小(共6步)

  • 执行flutter build ios --release 生成Runner.app文件
  • 使用xcode打开项目,然后点击product->build。成功后生成一个新的Runner.app。
  • Runner.app目录下执行指令: xcrun bitcode_strip Runner.app/Frameworks/Flutter.framework/Flutter -r -o Runner.app/Frameworks/Flutter.framework/Flutter
  • 在Runner.app目录下新建一个Payload文件夹, 并将该 app 拖进去
  • 右键->压缩"Payload"为Payload.zip
  • 将生成的 Payload.zip 文件更名为 xxx.ipa 即可得到 ipa 安装包

再一顿操作下来后,包体大概又能减少几十或者上百兆。终于基本优化到一百兆以内,接近用Ad hoc分发的ipa包的大小

4、一些说明

1、 Flutter生成Runner.app比较大的原因

ios的Flutter二进制文件增加了对bitcode的支持,从而导致体积增大

2、 如何优化

执行 xcrun bitcode_strip 指令就能去掉bitcode

xcrun bitcode_strip 指令大家可以自行网上搜索。详细的使用我就不细说了

苹果一键打包脚本

一、简单介绍

通过上面的”常规优化“后我们就能开始执行脚本打包了,本脚本主要实现了以下功能

  • 可控制是否执行 flutter clean 清理指令(回车或者5秒无指令输入默认不清理)
  • 可控制选择打无签名包还是Ad hoc测试包(回车或者5秒无指令输入默认无签名包)
  • 成功打包后自动打开文件夹
  • 实现无人值守打包
  • 如果要导出无签名包,脚本中添加了”非常规的优化“相关的操作

二、项目路径结构

1、shell 目录存放脚本和plist文件, pipa.sh 是苹果脚本,

2、prod 目录导出打包文件

三、脚本内容

#!/bin/sh
#当前工程绝对路径
project_path=$(pwd)
#xCode build 出来的APP文件有所优化,比Flutter build ios 的Runner.app要小
#------------------必须修改:XCODE工程导出路径----------------#
runner_path=~/Library/Developer/Xcode/DerivedData/Runner-bsrdqyyshhsictbeoknvquvcxcsm/Build/Products/Release-iphoneos/Runner.app
#-------------------可选:自己的plist配置路径------------------#
export_plist_path=${project_path}/shell/scriptTest.plist
#-------------------可选:修改为自己的APP名称------------------#
app_name="APP名称"
#----------------可选:将Runner替换成自己的工程名---------------#
project_name=Runner
#----------------可选:将Runner替换成自己的sheme名--------------#
scheme_name=Runner
#打包模式 Debug/Release
development_mode=Release
#导出.ipa文件所在路径
ipa_path=${project_path}/prod/ipa/
#导出签名.ipa文件所在路径
sign_path=${ipa_path}/sign
#导出未签名.ipa文件所在路径
unsign_path=${ipa_path}/unsign
#导出未签名.Payload文件所在路径
payload_path=${unsign_path}/Payload
clean_tips="执行flutter clean(默认:n) [ y/n ]"
echo $clean_tips
read  -t 5 is_clean
if [  ! -n "${is_clean}" ];then
    is_clean="n"
fi
while([[ $is_clean != "y" ]] && [[ $is_clean != "n" ]])
do
  echo "错误!只能输入[ y/n ] !!!"
  echo $clean_tips
  read is_clean
done
echo "请输入选择模式(默认:0) [ UnSign: 0 AdHoc: 1 ] "
read  -t 5 number
if [  ! -n "${number}" ];then
    number=0
fi
while([[ $number != 0 ]] && [[ $number != 1 ]])
do
  echo "错误!只能输入0或者1!!!"
  echo "请输入选择模式? [ UnSign: 0 AdHoc: 1 ] "
  read number
done
if [ ${is_clean} = "y" ];then
  echo "=============== 开始清理 ==============="
    flutter clean
fi
echo "=============== 构建FLUTTER_IOS工程 ==============="
if [ $number == 0 ];then
  flutter build ios --release --no-codesign
else
  flutter build ios
fi
#flutter build ios --release --no-codesign --obfuscate --split-debug-info=./symbols
#如果有product/ipa文件夹则删除,然后再创建一个空文件夹
if [ -d ${ipa_path} ]; then
  rm -rf ${ipa_path}
fi
#创建目录
mkdir -p ${ipa_path}
#rm -rf ${ipa_path}
if [ $number == 0 ];then
  #无签名打包
  echo "=============== 正在编译XCODE工程:${development_mode} ==============="
  xcodebuild build -workspace ios/${project_name}.xcworkspace -scheme ${scheme_name} -configuration ${development_mode}
  mkdir -p ${payload_path}
  cp -r ${runner_path} ${payload_path}
  cd ${unsign_path}
  echo "=============== 读取APP信息 ==============="
  #info.plist路径
  info_plist="Payload/Runner.app/info.plist"
  version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$info_plist")
  build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$info_plist")
  time=$(date "+%Y%m%d_%H%M")
  appName="$app_name""_v$version""_b$build""_$time.ipa"
  echo "=============== 优化Framework大小 ==============="
  xcrun bitcode_strip ${payload_path}/Runner.app/Frameworks/Flutter.framework/Flutter -r -o ${payload_path}/Runner.app/Frameworks/Flutter.framework/Flutter
  xcrun bitcode_strip ${payload_path}/Runner.app/Frameworks/AgoraRtcKit.framework/AgoraRtcKit -r -o ${payload_path}/Runner.app/Frameworks/AgoraRtcKit.framework/AgoraRtcKit
  xcrun bitcode_strip ${payload_path}/Runner.app/Frameworks/App.framework/App -r -o ${payload_path}/Runner.app/Frameworks/App.framework/App
  echo "=============== 生成IPA(压缩Payload文件并修改文件名为IPA) ==============="
  zip -r ${appName} *
  if [ -e $unsign_path/$appName ]; then
    echo "=============== IPA包已导出:$unsign_path/$appName ==============="
    open $unsign_path
  else
    echo '=============== IPA包导出失败 ==============='
    exit 1
  fi
else
  #Ad hoc 打包
  echo "=============== 正在编译工程:${development_mode} ==============="
  xcodebuild \
  archive -workspace ${project_path}/ios/${project_name}.xcworkspace \
  -scheme ${scheme_name} \
  -configuration ${development_mode} \
  -archivePath ${ipa_path}/${project_name}.xcarchive  -quiet  || exit
  echo ''
  echo '=============== 开始IPA打包 ==============='
  xcodebuild -exportArchive -archivePath ${ipa_path}/${project_name}.xcarchive \
  -configuration ${development_mode} \
  -exportPath ${sign_path} \
  -exportOptionsPlist ${export_plist_path} \
  -quiet || exit
  if [ -e $sign_path/$app_name.ipa ]; then
    echo "=============== IPA包已导出:$sign_path/$app_name.ipa ==============="
    open $sign_path
  else
    echo '=============== IPA包导出失败 ==============='
    exit 1
  fi
fi
exit 0

四、plist文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>compileBitcode</key>
    <true/>
    <key>destination</key>
    <string>export</string>
    <key>method</key>
    <string>ad-hoc</string>
    <key>signingCertificate</key>
    <string>XXXXXXXX</string>
    <key>signingStyle</key>
    <string>automatic</string>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>teamID</key>
    <string>XXXXXX</string>
    <key>thinning</key>
    <string>&lt;none&gt;</string>
</dict>
</plist>

五、脚本使用步骤

  • 1、在项目根目录创建一个shell文件夹
  • 2、在shell目录创建papk.sh文件,并粘贴脚本内容。修改runner_path变量值为自己xcode导出Runner.app的路径,然后保存并关闭
  • 3、在shell目录创建scriptTest.plist文件,并粘贴plist文件内容。修改自己的signingCertificate和teamID的值,然后保存并关闭
  • 4、项目根目录执行命令添加执行权限: chmod u+x shell/pipa.sh
  • 5、项目根目录执行命令:./shell/papk.sh

以上就是安卓与iOS包体优化及一键自动打包脚本的详细内容,更多关于安卓 iOS打包脚本的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现自动截图脚本

    做开发的总会碰到测试或者项目经理问你要某个界面截图的情况,用手机的快捷键截图再上传效率不高,又不太想用手机助手(怕全家桶),便打起Android的ADB命令的主意.adb指令中screencap指令就是截图方法,再通过pull拉取到指定文件夹即可. 这边我对不同的操作系统都进行了相应的整理和使用.windows下为批处理程序,mac下为shell可执行脚本程序. 需注意,脚本使用,都需要先在桌面上新建AndroidScreen文件夹,然后电脑同时只可以连接一台手机(当然这些也都可以完善). Wi

  • 详解基于Android的Appium+Python自动化脚本编写

    1.Appium Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序. 通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码. 下面开始Appium的配置. appPackage和APPActivity的获取 任意下载一个app 解压 但是解压出来的xml文件可能是乱码,所以我们需要反编译文件. 逆向AndroidMan

  • Android之在linux终端执行shell脚本直接打印当前运行app的日志的实现方法

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 adb shell dumpsys activity top 2).我们的终端安装了pidcat.py脚本,然后执行如下的命令就可以打印当前运行app的全日志, pidcat.py packageName 3).思考,为什么每次都需要这样重复的操作呢?一说到重复,我们应该立马想到是否可以用脚本解决重复

  • 浅谈Android程序与JavaScript脚本的交互

    我们都知道,手机时代的来临的主要标志是啥?能够方便的接入互联网!互联网展现给我们的方式一般都是网页,网页中又必不可少的拥有javascript,所以说,android提供对javascript的支持那是迫在眉睫了,幸好,android早就给我们提供了无缝连接.让我们可以通过android与javascript进行交互. 我们的应用很简单,如图: 我们有一个输入框,旁边有个按钮,点击按钮就会提示我们输入的内容.当然这只是html中最简单的程序了,但是你将这个程序放入android手机中访问下试试,

  • android studio 3.0 gradle 打包脚本配置详解

    本文介绍了android studio 3.0 gradle 打包脚本配置,分享给大家,具体如下: 修改输出的名字 保存输出的文件路径 def fileArray = [] //遍历输出文件 android.applicationVariants.all { variant -> variant.outputs.all { output -> def outputFile = output.outputFile if (outputFile != null && outputF

  • Android开发设计nowinandroid构建脚本学习

    目录 引言 gradle.properties 中的配置 自动安装 git hook 使用 includeBuild 而不是 buildSrc 如何复用 build.gradle 代码? 使用 Version Catalog 管理依赖 代码格式检查 自定义 lint 检查 总结 引言 nowinandroid 项目是谷歌开源的示例项目,它遵循 Android 设计和开发的最佳实践,并旨在成为开发人员的有用参考 这个项目在架构演进,模块化方案,单元测试,Jetpack Compose,启动优化等多

  • Android与iOS包体优化及一键自动打包脚本

    目录 系统信息 介绍 安卓APK优化包体大小 一.原理与介绍 二.Flutter代码配置 三.Android代码配置 四.多渠道调试与打包指令 安卓一键打包脚本 一.简单介绍 二.项目路径结构 三.脚本内容 四.脚本使用步骤 苹果优化包体大小 一.常规优化(分发到 App Store 或者 打Ad hoc 测试包) 二.非常规优化 1.Flutter导出IPA(共4步) 2.第一次优化包体大小(共5步) 3.第二次优化包体大小(共6步) 4.一些说明 苹果一键打包脚本 一.简单介绍 二.项目路径

  • Android和iOS包批量重签名

    本文实例为大家分享了Android和iOS包批量重签名的具体代码,供大家参考,具体内容如下 Android篇 环境要求 1 安装winrar,然后配置winrar的环境变量,要用到winrar指令 2 配置java的bin目录到环境变量,要用到jarsigner指令 重签名步骤说明: 1 从母包复制一个子包 2 删除子包的签名文件META-INFO 3 根据需要修改子包的文件,比如渠道号文件之类 4 重签名子包 对应的python脚本 import os import sys import sh

  • Nginx丢弃http包体处理实例详解

    Nginx丢弃http包体处理实例详解 http框架丢弃http请求包体和上一篇文章http框架接收包体, 都是由http框架提供的两个方法,供http各个模块调用,从而决定对包体做什么处理.是选择丢弃还是接收,都是由模块决定的.例如静态资源模块,如果接收到来自浏览器的get请求,请求某个文件时,则直接返回这个文件内容给浏览器就可以了.没有必要再接收包体数据,get请求实际上也不会有包体.因此静态资源模块将调用http框架提供的丢弃包体函数进行丢包处理. 相比接收包体过程, 丢弃包体操作就简单很

  • React Native第三方平台分享的实例(Android,IOS双平台)

    本文主要介绍了React Native第三方平台分享的实例(Android,IOS双平台),分享给大家,具体如下: 源码已开源到Github,地址请点击:react-native-share[一行代码,双平台分享] 目前支持分享的平台有[QQ][QQ空间][微信][朋友圈][微博][FaceBook]  欢迎大家star,fork..... [ Android平台配置 ] 1. app目录下创建 libs 文件夹,添加依赖文件[直接复制源码中 libs 目录即可] 2. app / src /

  • Android EasyPlayer声音自动停止、恢复,一键静音等功能

    Android EasyPlayer声音自动停止.恢复,一键静音等功能 我们在开发播放器时,可能会需要静音或者降低音量的功能.比如说某款音乐播放器,当在后台播放时,如果此时有另外的系统通知声音发出,可能播放器会把音量降低,系统声音结束后,再调高:如果有来电了,播放器可能会把音乐暂停,等通话结束后再继续播放.还有,比方说我们在某个场合放个视频,不料音量很大,会引来很多目光(很尴尬),这时候可能我们需要一键静音的功能.那这些功能我们应该如何实现呢? Android播放声音的类为AudioTrack,

  • Android编程开发之性能优化技巧总结

    本文详细总结了Android编程开发之性能优化技巧.分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读. 2.listview 性能优化 1).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用.如果couvertview中的view需要添加listern

  • 探究Android客户端网络预连接优化机制

    目录 一.连接复用 二.预连接实现 三.源码分析 四.优化 五.问答 一.连接复用 对于一个普通的接口请求,通过charles抓包,查看网络请求Timing栏信息,我们可以看到类似如下请求时长信息: Duration 175 ms DNS 6 ms Connect 50 msTLS Handshake 75 ms Request 1 ms Response 1 ms Latency 42 ms 同样的请求,再来一次,时长信息如下所示: Duration 39 ms DNS - Connect -

  • Android、iOS和Java通用的AES128加密解密示例代码

    前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密.Android和ios通用的AES加密算法.大家可以直接集成到自己的项目.服务器接口如果是用Java写的话.整个框架都完美了.如果是.NET编写的后台接口的话.得改造一下哦 IOS加密 /*加密方法*/ (NSString *)AES256EncryptWithPlainText:(NSString

  • iOS缓存文件大小显示功能和一键清理功能的实现方法

    缓存占用了系统的大量空间,如何实时动态的显示缓存的大小,使用户清晰的了解缓存的积累情况,有效的进行一键清理呢? 为方便读者和未来自己更好理解,我们创建这样场景.(在表视图的清除缓存一单元格内创建一个UILabel *cacheLabel用于显示当前缓存,当点击单元格弹出提示框,点击确定,清除缓存). 下面是实现代码: #pragma mark - 计算缓存大小 - (NSString *)getCacheSize { //定义变量存储总的缓存大小 long long sumSize = 0; /

随机推荐