美文网首页
Android项目从瘦身到打包

Android项目从瘦身到打包

作者: 3Q竹林 | 来源:发表于2018-05-30 22:06 被阅读40次
    APK瘦身方向:
    1. 代码方面
      除必要的封装外,还可以通过混淆压缩

       release {
               minifyEnabled true // 是否混淆
               //去除无效的文件,但目前还不支持移除app和libray中的values目录下的资源文件(strings,dimensions,styles,colors),这些我//们可以使用Splits解决
               shrinkResources true 
               // 混淆的配置文件
               proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           }
      
    2. lib
      轻量级lib是首选;

    3. so本地库
      主流的架构都是arm的;

    4. 资源文件(图片,音频,字体等)
      a. 通过Lint工具扫描代码中没有使用到的静态资源,但不包括assets中的文件,方法:在As的 Analyze –>Inspect Code,并合理删除无用代码;

      b. 图片处理及优化方面

      • 必要时可采用图片旋转方式代替添加新的图片:
        <rotate xmlns:android="http://schemas.android.com/apk/res/android"
         android:drawable="@drawable/blue_btn_icon"
         android:fromDegrees="180"
         android:pivotX="50%"
         android:pivotY="50%"
         android:toDegrees="180" />
        
      • 在某些时候jpeg可以减少图片的体积(无alpha属性);
      • 9.png的图片,特点是可拉伸;
      • 在不降低图片效果、保证APK显示效果的前提下缩小图片-如使用tinypng优化大部分图片资源(缺点:对有过渡效果(带alpha值)的图片不能使用,会造成图片失真,这种图片可以将png图片转换为webP格式(软件:iSparta));
      • 用svg替换原来图片能立刻将图片减少,而且不用考虑分辨率适配的问题。但在As中需要vectorDrawable配合。

      d. 清除你的无用的代码以及资源

      • 查询到的都是对当前项目无贡献的资源: Analyze –>Run Inspection by name –> unused resources

      • 分析得到没有用的类及方法: Analyze –>Run Inspection by name –> unused declaration

        注意:上述两个方法,查询到的文件中也包括了一些需要保留的资源,手动删除前还是需要分析下的(资源使用查询:alt+F7,删除文件:alt+Del)

      • 指定资源配置

        android {
            ......
          productFlavors {
            cs {
              resConfigs "zh","xxhdpi" //指定资源配置
              ext.dexOptions = false //调试构建停用 Crashlytics
              ext.alwaysUpdateBuildId = false //阻止 Crashlytics 不断更新其构建 ID
            }
          }
        }
        

        注意:
        无论时尺寸适配还是语言适配,都需要有values这个文件夹,并且values-zh或values-400x320中的所有文件,在values中也"必须也要有",否则会报错

      e. 混淆配置参考:https://www.jianshu.com/writer#/notebooks/9538856/notes/28822848


    apk打包
    • 配置产品风味实现多个变体:
      变体可以理解为apk变体,多少种变体就是多少种apk类型;

      公式:
      变体数 = 被标记为不同种维度的产品风味个数的乘积 * 构建类型个数 - 过滤变体构建类型个数
      (如下边例子的 变体数 = 2
      32 - 12 = 10)

      flavorDimensions "mode","suffix"  //产品风味组(也称风味维度,其中有两种维度,优先级前高后低,不同维度的产品风味会自由组合)
      productFlavors { //产品风味配置标志 
        cancell{ //产品风味名
          dimension "suffix"
          versionNameSuffix "-csss"
        }
      
        dess{ //产品风味名
          dimension "suffix"
          versionNameSuffix "-devss"
        }
      
        cs { //产品风味名
          dimension "mode"
          resConfigs "zh","en","xxhdpi"
          ext.dexOptions = false //调试构建停用 Crashlytics
          ext.alwaysUpdateBuildId = false //阻止 Crashlytics 不断更新其构建 ID
          buildConfigField 'String', 'API_URL', "\"https://cs.XXX\""
          buildConfigField 'String', 'WETCHAT_ID', "\"XXX\""
          buildConfigField 'String', 'PAY_URL', "\"https://XXX\""
          manifestPlaceholders =
              [JPUSH_APPKEY: "XXX", JPUSH_PKGNAME: "com.XXX.app", JPUSH_CHANNEL: "developer-default",UMENG_CHANNEL_VALUE: "cs"]
        }
      
        dev { //产品风味名
          dimension "mode"
          buildConfigField 'String', 'API_URL', "\"https://cs.XXX\""
          buildConfigField 'String', 'WETCHAT_ID', "\"XXX\""
          buildConfigField 'String', 'PAY_URL', "\"https://XXX\""
          manifestPlaceholders =
              [JPUSH_APPKEY: "XXX", JPUSH_PKGNAME: "com.XXX.app", JPUSH_CHANNEL: "developer-default",UMENG_CHANNEL_VALUE: "dev"]
        }
      
        prod { //产品风味名
          dimension "mode"
          buildConfigField 'String', 'API_URL', "\"https://cs.XXX\""
          buildConfigField 'String', 'WETCHAT_ID', "\"XXX\""
          buildConfigField 'String', 'PAY_URL', "\"https://XXX\""
          manifestPlaceholders =
              [JPUSH_APPKEY: "XXX", JPUSH_PKGNAME: "com.XXX.app", JPUSH_CHANNEL: "developer-default",UMENG_CHANNEL_VALUE: "prod"]
        }
      }
      
       //变体过滤器,可以过滤掉种变体,配置后在Build > Select Build Variant(或工具窗口栏中的 Build Variants)中,这些构建变体将不会再显示在下拉菜单中。
       variantFilter { variant ->
        def names = variant.flavors*.name
        if (names.contains("cancell") && names.contains("cs")) {
          setIgnore(true)
        }
      }
      
      buildTypes { //构建类型
        debug { //构建类型名
          signingConfig signingConfigs.debug
          minifyEnabled false //混淆
          zipAlignEnabled true //zipalign优化
          shrinkResources false //移除无用resources
        }
        release { //构建类型名
          signingConfig signingConfigs.release
          zipAlignEnabled true //zipalign优化
          minifyEnabled false
          shrinkResources false
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
      }
      
    • Splits构建不同density和ABI 的APK:

        android {
          ...
          splits {
            density {
              enable true
              exclude "ldpi", "tvdpi", "xxxhdpi" //不能与reset()一起使用
              compatibleScreens 'small', 'normal', 'large', 'xlarge'
            }
          }
      
         android {
          ...
          splits {
            abi {
              enable true
              reset()
              include 'x86', 'armeabi-v7a', 'mips' //必须与reset()一起使用
              universalApk true
            }
          }
        }
      
        参数解析:
            enable: 启用屏幕密度拆分机制
            exclude: 默认情况下所有屏幕密度都包括在内,你可以移除一些密度。
            include: 表示要包括哪些屏幕密度
            reset(): 重置屏幕密度列表为只包含一个空字符串 (这能够实现,在与include一起使用时可以表示使用哪一个屏幕密度,而不是要忽略哪一些屏幕密度)
            compatibleScreens:表示兼容屏幕的列表。这将会注入到manifest中匹配的 节点。这个设置是可选的。
            universalApk:指示是否打包一个通用版本(包含所有的ABI)。默认值为 false。
        
      
      
    • 其他

      1. 查看生产的apk各个资源占用情况:
        a. 先要用As生产一个apk;
        b. build-Analyze Apk(或者在生产apk时会有analyze提示);

      2. 当apk安装不上问题解决:
        如错误信息:It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.时,在手机上有没有找到此应用的应用图标,这也有可能是该应用的某个模块在手机上隐式安装了,我们可以先查看工程中都有那些模块(android库模块),记下这些模块名称,再到手机的程序管理中去找,若是有则卸载即可;

    相关文章

      网友评论

          本文标题:Android项目从瘦身到打包

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