Android项目从瘦身到打包

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库模块),记下这些模块名称,再到手机的程序管理中去找,若是有则卸载即可;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,152评论 25 707
  • 参考 中文官网构建指南:https://developer.android.google.cn/studio/bu...
    FinalSky阅读 5,353评论 0 16
  • 所有Android插件的基本扩展。 你不需要直接使用这个,你可以选择下面几个合适的直接使用 AppExtensio...
    我该忘了我自己w_u阅读 3,366评论 0 5
  • 当我真正放下你的时候,就敢正眼看你了。 1. 所有人都在玩微信,抛弃QQ的时候,我还是一如既往地狂刷空间,因为我知...
    周木槿阅读 455评论 0 0
  • 理解什么是财富自由 为什么没有以期望的速度靠近目标? 绝大多数人在追求某个东西的时候,可能连那个东西的定义都不清楚...
    徐清阅读 380评论 0 0