Android項(xiàng)目從瘦身到打包

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
    輕量級(jí)lib是首選伐蒋;

  3. so本地庫
    主流的架構(gòu)都是arm的;

  4. 資源文件(圖片迁酸,音頻先鱼,字體等)
    a. 通過Lint工具掃描代碼中沒有使用到的靜態(tài)資源,但不包括assets中的文件奸鬓,方法:在As的 Analyze –>Inspect Code,并合理刪除無用代碼型型;

    b. 圖片處理及優(yōu)化方面

    • 必要時(shí)可采用圖片旋轉(zhuǎn)方式代替添加新的圖片:
      <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" />
      
    • 在某些時(shí)候jpeg可以減少圖片的體積(無alpha屬性);
    • 9.png的圖片全蝶,特點(diǎn)是可拉伸闹蒜;
    • 在不降低圖片效果、保證APK顯示效果的前提下縮小圖片-如使用tinypng優(yōu)化大部分圖片資源(缺點(diǎn):對(duì)有過渡效果(帶alpha值)的圖片不能使用抑淫,會(huì)造成圖片失真绷落,這種圖片可以將png圖片轉(zhuǎn)換為webP格式(軟件:iSparta));
    • 用svg替換原來圖片能立刻將圖片減少始苇,而且不用考慮分辨率適配的問題砌烁。但在As中需要vectorDrawable配合。

    d. 清除你的無用的代碼以及資源

    • 查詢到的都是對(duì)當(dāng)前項(xiàng)目無貢獻(xiàn)的資源: Analyze –>Run Inspection by name –> unused resources

    • 分析得到?jīng)]有用的類及方法: Analyze –>Run Inspection by name –> unused declaration

      注意:上述兩個(gè)方法站宗,查詢到的文件中也包括了一些需要保留的資源佩抹,手動(dòng)刪除前還是需要分析下的(資源使用查詢:alt+F7,刪除文件:alt+Del)

    • 指定資源配置

      android {
          ......
        productFlavors {
          cs {
            resConfigs "zh","xxhdpi" //指定資源配置
            ext.dexOptions = false //調(diào)試構(gòu)建停用 Crashlytics
            ext.alwaysUpdateBuildId = false //阻止 Crashlytics 不斷更新其構(gòu)建 ID
          }
        }
      }
      

      注意:
      無論時(shí)尺寸適配還是語言適配,都需要有values這個(gè)文件夾笨奠,并且values-zh或values-400x320中的所有文件管呵,在values中也"必須也要有"梳毙,否則會(huì)報(bào)錯(cuò)

    e. 混淆配置參考:http://www.reibang.com/writer#/notebooks/9538856/notes/28822848


apk打包
  • 配置產(chǎn)品風(fēng)味實(shí)現(xiàn)多個(gè)變體:
    變體可以理解為apk變體,多少種變體就是多少種apk類型捐下;

    公式:
    變體數(shù) = 被標(biāo)記為不同種維度的產(chǎn)品風(fēng)味個(gè)數(shù)的乘積 * 構(gòu)建類型個(gè)數(shù) - 過濾變體構(gòu)建類型個(gè)數(shù)
    (如下邊例子的 變體數(shù) = 2
    32 - 12 = 10)

    flavorDimensions "mode","suffix"  //產(chǎn)品風(fēng)味組(也稱風(fēng)味維度账锹,其中有兩種維度,優(yōu)先級(jí)前高后低,不同維度的產(chǎn)品風(fēng)味會(huì)自由組合)
    productFlavors { //產(chǎn)品風(fēng)味配置標(biāo)志 
      cancell{ //產(chǎn)品風(fēng)味名
        dimension "suffix"
        versionNameSuffix "-csss"
      }
    
      dess{ //產(chǎn)品風(fēng)味名
        dimension "suffix"
        versionNameSuffix "-devss"
      }
    
      cs { //產(chǎn)品風(fēng)味名
        dimension "mode"
        resConfigs "zh","en","xxhdpi"
        ext.dexOptions = false //調(diào)試構(gòu)建停用 Crashlytics
        ext.alwaysUpdateBuildId = false //阻止 Crashlytics 不斷更新其構(gòu)建 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 { //產(chǎn)品風(fēng)味名
        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 { //產(chǎn)品風(fēng)味名
        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)中坷襟,這些構(gòu)建變體將不會(huì)再顯示在下拉菜單中奸柬。
     variantFilter { variant ->
      def names = variant.flavors*.name
      if (names.contains("cancell") && names.contains("cs")) {
        setIgnore(true)
      }
    }
    
    buildTypes { //構(gòu)建類型
      debug { //構(gòu)建類型名
        signingConfig signingConfigs.debug
        minifyEnabled false //混淆
        zipAlignEnabled true //zipalign優(yōu)化
        shrinkResources false //移除無用resources
      }
      release { //構(gòu)建類型名
        signingConfig signingConfigs.release
        zipAlignEnabled true //zipalign優(yōu)化
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      }
    }
    
  • Splits構(gòu)建不同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
          }
        }
      }
    
      參數(shù)解析:
          enable: 啟用屏幕密度拆分機(jī)制
          exclude: 默認(rèn)情況下所有屏幕密度都包括在內(nèi),你可以移除一些密度婴程。
          include: 表示要包括哪些屏幕密度
          reset(): 重置屏幕密度列表為只包含一個(gè)空字符串 (這能夠?qū)崿F(xiàn)廓奕,在與include一起使用時(shí)可以表示使用哪一個(gè)屏幕密度,而不是要忽略哪一些屏幕密度)
          compatibleScreens:表示兼容屏幕的列表档叔。這將會(huì)注入到manifest中匹配的 節(jié)點(diǎn)桌粉。這個(gè)設(shè)置是可選的。
          universalApk:指示是否打包一個(gè)通用版本(包含所有的ABI)蹲蒲。默認(rèn)值為 false番甩。
      
    
    
  • 其他

    1. 查看生產(chǎn)的apk各個(gè)資源占用情況:
      a. 先要用As生產(chǎn)一個(gè)apk;
      b. build-Analyze Apk(或者在生產(chǎn)apk時(shí)會(huì)有analyze提示);

    2. 當(dāng)apk安裝不上問題解決:
      如錯(cuò)誤信息:It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.時(shí)侵贵,在手機(jī)上有沒有找到此應(yīng)用的應(yīng)用圖標(biāo)届搁,這也有可能是該應(yīng)用的某個(gè)模塊在手機(jī)上隱式安裝了,我們可以先查看工程中都有那些模塊(android庫模塊),記下這些模塊名稱窍育,再到手機(jī)的程序管理中去找卡睦,若是有則卸載即可;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漱抓,一起剝皮案震驚了整個(gè)濱河市表锻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乞娄,老刑警劉巖瞬逊,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仪或,居然都是意外死亡确镊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門范删,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕾域,“玉大人,你說我怎么就攤上這事≈枷铮” “怎么了巨缘?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長采呐。 經(jīng)常有香客問我若锁,道長,這世上最難降的妖魔是什么懈万? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任拴清,我火速辦了婚禮,結(jié)果婚禮上会通,老公的妹妹穿的比我還像新娘口予。我一直安慰自己,他們只是感情好涕侈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布沪停。 她就那樣靜靜地躺著,像睡著了一般裳涛。 火紅的嫁衣襯著肌膚如雪木张。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天端三,我揣著相機(jī)與錄音舷礼,去河邊找鬼。 笑死郊闯,一個(gè)胖子當(dāng)著我的面吹牛妻献,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播团赁,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼育拨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欢摄?” 一聲冷哼從身側(cè)響起熬丧,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怀挠,沒想到半個(gè)月后析蝴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绿淋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年闷畸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躬它。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腾啥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倘待,我是刑警寧澤疮跑,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站凸舵,受9級(jí)特大地震影響祖娘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啊奄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一渐苏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菇夸,春花似錦琼富、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至择诈,卻和暖如春械蹋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羞芍。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工哗戈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荷科。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓唯咬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親步做。 傳聞我的和親對(duì)象是個(gè)殘疾皇子副渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,773評(píng)論 25 707
  • 參考 中文官網(wǎng)構(gòu)建指南:https://developer.android.google.cn/studio/bu...
    FinalSky閱讀 5,321評(píng)論 0 16
  • 所有Android插件的基本擴(kuò)展奈附。 你不需要直接使用這個(gè)全度,你可以選擇下面幾個(gè)合適的直接使用 AppExtensio...
    我該忘了我自己w_u閱讀 3,345評(píng)論 0 5
  • 當(dāng)我真正放下你的時(shí)候,就敢正眼看你了斥滤。 1. 所有人都在玩微信将鸵,拋棄QQ的時(shí)候,我還是一如既往地狂刷空間佑颇,因?yàn)槲抑?..
    周木槿閱讀 445評(píng)論 0 0
  • 理解什么是財(cái)富自由 為什么沒有以期望的速度靠近目標(biāo)顶掉? 絕大多數(shù)人在追求某個(gè)東西的時(shí)候,可能連那個(gè)東西的定義都不清楚...
    徐清閱讀 364評(píng)論 0 0