“總是有種空虛的感覺,回想這些年其實自己似乎從未真正擁有過什么。”
愛在相遇的那一刻便達到了巔峰,隨后的每一天仿佛都是在向下滑行。
曾經相識的人,如今卻隔著遙遠的山河與人潮,彼此之間已無心相交。
擅長使用冷暴力的人實際上內心是非常脆弱的,他們缺乏解決問題的能力,內心深處常常充滿自私和冷漠,并且在推卸責任方面表現得非常出色,你也不會成為他的例外。因此,最好還是盡早與這樣的關系保持距離。
婚姻的本質在于:逐漸削弱一個女人原有的自信,讓她意識到,世界上并沒有真正的避風港,只有不斷的風雨。
“嘴上說著愛你,卻做了許多讓你失望的事,最后卻問我對你是不是不夠好。是的,從滿心期待到徹底失望,你消耗了我所有的熱情。”
不要過于執著于感情,也不要把它們看得過于重要,否則在經歷分離時,你會感到難以承受。畢竟,分離是生活中不可避免的常態。
]]>減肥&賺錢兩手抓
每天都要給自己一個小驚喜,這可以是一杯喜歡的咖啡,一首動聽的音樂,或者一段有趣的對話。這樣能讓生活充滿樂趣和意外,讓每一天變得更加有趣和美好。
長期的壓力和負面情緒可能會產生多種不利影響,如焦慮、抑郁和身體健康問題。
好好減肥、賺錢并寵愛自己是非常重要的。
]]>最近我總是沉迷于刷抖音,發現一些點贊量特別高的抖音號,他們的內容都非常優質。有一個有趣的現象是,他們的頭部都設計得很獨特,有的是一句話,有的是一張有趣的圖片。受到啟發,我也做了一大批有趣的圖片,喜歡的人可以自行保存。這些內容簡直讓人無法抗拒!
這些圖片清晰且沒有水印,你可以直接保存到手機中,并將其設置為抖音的頭圖,以吸引更多朋友的注意。
如果你有自己的內容需要設計但又不知道如何下手,請在評論區留言,我會為你提供設計方案。下一次的頭圖設計將會更加有趣!記得關注,免費獲取更多個性化的圖片!
]]>一、圖片素材
1. 尺寸規范
小紅書要求廣告圖片的尺寸必須符合規范,遵循以下標準:建議大小為640*640px或1080*1080px,文件格式為JPG、PNG。
2. 圖片內容
廣告圖片的設計需要簡潔明了,突出產品或品牌的優勢。顏色、字體和排版等方面也要符合品牌風格和用戶偏好。
3. 美學要求
小紅書是一個以美學為基礎的社交電商平臺,因此對于圖片素材的審美要求相當嚴格。廣告圖片要求搭配合理,顏色要求清新自然、舒適雅致。此外,主圖需要有明確的主題,并且能夠引起用戶的興趣。
二、視頻素材
1. 視頻長度
小紅書要求廣告視頻長度不超過60秒,因此在制作視頻時需要簡潔明了,盡量快速展現產品或品牌優勢。
2. 視頻內容
廣告視頻的制作需要突出品牌或產品的特色和優勢,同時考慮到目標受眾的口味和興趣。視頻制作要求清晰、流暢,腳本需要精心設計,具有邏輯性,以便讓觀眾更好地理解和接受廣告內容。
3. 美學要求
小紅書非常重視視頻的美學表現,他們對視頻素材的審美要求相當嚴格。他們注重視頻畫面的色調、畫面質量、字體排版等方面,以符合品牌風格和用戶口味,從而讓用戶在觀看廣告時感到舒適、自然、優雅。
三、文案素材
1. 文字內容
廣告文案要簡潔有力,突出品牌特色和產品優勢。語言表達要清晰易懂,吸引用戶接受。
2. 表達方式
小紅書的用戶主要是年輕人,所以廣告文案需要充滿個性和流行元素,語言表達要生動、輕松、親切,盡量避免過于正式的表達方式。
3. 美學要求
小紅書非常重視文案的美學表現,對文案素材的審美要求極其嚴格。廣告文字的排版、字體、顏色等需要充分考慮品牌風格和用戶口味,以確保用戶在閱讀廣告時感受到舒適、自然和雅致的體驗。
說到小紅書廣告推廣,素材的質量是至關重要的。企業需根據自身需求和目標受眾選擇合適的素材類型和內容,充分展現品牌或產品的特點和優勢。同時,確保素材符合小紅書的規范,滿足用戶審美要求,從而提高廣告的轉化率。
]]>鏂版箹鍗楀鎴風鎺ㄥ嚭浜嗕竴嬈捐悓钀岀殑灝忚荊铏庡勾琛ㄦ儏鍖咃紝闈炲父閫傚悎鐢ㄦ潵鎷滃勾錛佽繖嬈捐〃鎯呭寘鏃㈠彲鐖卞張鏈夊姏閲忥紝緇濆鏄偍鎷滃勾鐨勯閫夛紒
(濡備綍灝嗗皬鍙埍鐙楀彉鎴愯嚜宸辯殑琛ㄦ儏鍖咃紵璇峰厛闀挎寜鍥劇墖淇濆瓨鍒版墜鏈猴紝鐒跺悗鎵撳紑鎵嬫満寰俊琛ㄦ儏錛岀偣鍑誨績褰㈡寜閽煠嶏紝鍐嶇偣鍑誨乏涓婅鐨勫姞鍙?錛屽啀嬈$偣鍑誨姞鍙?錛屽嵆鍙皢鍥劇墖娣誨姞鍒拌嚜宸辯殑涓撳睘琛ㄦ儏鍖呬腑銆?
鍑哄搧浜猴細棰滄枌
緇熺錛氭枃鍑ら洀 璧甸洦鏉?
鎵ц錛氶檲姘稿垰 鍛ㄧ孩娉?闄堥潚闈?
鏂囨錛氭湵鐜夋枃 鍙惰壋濞?
璁捐錛氬彾鑹沖 鏉庣湡鏄?
[璐g紪:褰江]
[鏉ユ簮:婀栧崡鏃ユ姤路鏂版箹鍗楀鎴風]
婀栧崡鏃ユ姤路鏂版箹鍗楀鎴風鎶ラ亾縐幫紝鏍規嵁鏈€鏂版暟鎹樉紺猴紝婀栧崡鐪佺殑緇忔祹澧為暱鎸佺畫淇濇寔紼沖畾銆傛嵁緇熻錛屼粖騫翠笂鍗婂勾錛屾箹鍗楃渷鐨凣DP澧為€熻揪鍒頒簡6.8%錛岃秴榪囦簡鍏ㄥ浗騫沖潎姘村鉤銆?
榪欎竴鏁版嵁鏄劇ず鍑烘箹鍗楃渷鍦ㄧ粡嫻庡彂灞曟柟闈㈠彇寰椾簡鏄捐憲鎴愮嘩銆傛嵁浜嗚В錛屾箹鍗楃渷鍦ㄦ帹鍔ㄥ垱鏂板彂灞曘€佸姞澶ф姇璧勫姏搴︺€佷紭鍖栬惀鍟嗙幆澧冪瓑鏂歸潰閮藉彇寰椾簡縐瀬榪涘睍銆傜壒鍒槸鍦ㄧ鎶€鍒涙柊鏂歸潰錛屾箹鍗楃渷鍔犲ぇ浜嗗縐戞妧浼佷笟鐨勬敮鎸佸姏搴︼紝鎺ㄥ姩浜嗙鎶€鍒涙柊鎴愭灉鐨勮漿鍖栧拰搴旂敤銆?
姝ゅ錛屾箹鍗楃渷榪樺姞澶т簡瀵歸噸鐐逛駭涓氱殑鎵舵寔鍔涘害錛岄€氳繃寮曡繘澶栬祫銆佸煿鑲叉湰鍦熶紒涓氱瓑鏂瑰紡錛屼績榪涗簡浜т笟鍗囩駭鍜岃漿鍨嬪彂灞曘€傚悓鏃訛紝婀栧崡鐪佽繕縐瀬鎺ㄥ姩涔℃潙鎸叴鎴樼暐錛屽姞寮哄啘鏉戝熀紜€璁炬柦寤鴻錛屾彁鍗囧啘姘戞敹鍏ユ按騫熾€?
婀栧崡鐪佺殑緇忔祹澧為暱涓嶄粎甯﹀姩浜嗗氨涓氬鍔狅紝榪樹負灞呮皯鎻愪緵浜嗘洿澶氱殑鍙戝睍鏈轟細銆傛嵁緇熻錛屼粖騫翠笂鍗婂勾錛屾箹鍗楃渷鍩庨晣鏂板灝變笟浜烘暟杈懼埌浜?00涓囦漢浠ヤ笂錛屽眳姘戜漢鍧囧彲鏀厤鏀跺叆涔熸湁浜嗘槑鏄懼闀褲€?
婀栧崡鐪佺殑緇忔祹澧為暱紼沖畾鏈夊姏鍦版帹鍔ㄤ簡鍏ㄧ渷鍚勯」浜嬩笟鐨勫彂灞曘€傛湭鏉ワ紝婀栧崡鐪佸皢緇х畫鍧氭寔鍒涙柊椹卞姩鍙戝睍鎴樼暐錛屽姞澶у縐戞妧鍒涙柊鍜屼駭涓氬崌綰х殑鏀寔鍔涘害錛屽姫鍔涘疄鐜伴珮璐ㄩ噺鍙戝睍銆?/p>
前后對比還是挺明顯,左邊是褪色版。
同樣,這對比圖中,也是左邊顏色淺一些。
在網友們的描述里,部分微信頭像在用過一段時間后,出現褪色現象。
這張更明顯了。
機哥看到最夸張的一組對比圖,長這樣。
不、不至于吧??
很快,「微信頭像褪色」上了熱搜。
根據網友曬圖,變化規律基本上都是,圖片會泛白。
看起來像素變低,更模糊。
有位網友說得更夸張:
乍眼看這熱搜,很容易會以為:微信頭像用一段時間不換的話,它會自動褪色。
啊這,機哥列表里有很多常年不換頭像的,沒見這么夸張啊?
Emmmm,確實是有點誤會了。
微信頭像會褪色,這事兒不假。
但,它是有限定條件的。
很快微信官方回復了,聰明的機友們,從這回復中,應該能看出端倪。
一是對機型有限制,安卓的盆友們,又中了。
二是使用條件有限制。
不是說微信頭像放在不動,它自己會褪色。而是當反復用到「查看上一張頭像」這功能時,才會出現褪色情況。
喏,具體操作是這樣。
在這張動圖里,眼尖的小伙伴應該發現了,頭像圖片確實有在褪色。
重復幾遍以上操作之后,整個頭像泛白嚴重。
美女還是那位美女,可是圖片色彩變了。
這時好友視角看你頭像,確實也顯示褪色。
機哥換了張圖片嘗試,經過 10 次「查看上一張頭像」-「使用此頭像」操作之后,頭像大紅色變成了淺紅色。
同樣,是褪色效果。
So,整個測試下來,微信頭像褪色現象確實存在,但只要你不手癢反復去弄,應該不會中招。
至于為什么會重復「查看上一張頭像」這動作,機哥其實也理解。
這種情況多數出現在糾結微信頭像的朋友身上,當糾結對比用新頭像還是舊頭像的時候,「查看上一張頭像」會方便一點。
但肯定沒有像熱搜詞條說的那么夸張,除了「查看上一張頭像」這操作可能會令頭像褪色,其他騷操作機哥暫時沒測出來。
大致搞清楚“是什么”之后,好奇小伙伴又問“為什么”了。
沒錯,相信很多機友跟機哥一樣,第一反應就是那些被傳得包漿的表情包。
估計微信頭像褪色原理也是類似的,因為在「查看上一張頭像」-「使用此頭像」這系列操作中,每重新使用一次,其實在界面會顯示:
正在上傳頭像。
相當于每重新使用一次,會重新上傳一次頭像到服務器,只不過這過程不用我們手動而已。
辣么,如果這上傳過程并不是將頭像圖片完完整整地上傳,那自然會產生折損。
上傳次數越多,圖片質量折損越嚴重。
這在微信使用過程中,我們應該體驗過很多次了。
安卓確實嚴重點,iOS 次之。至少在這次換頭像測試中,iOS 沒出現明顯褪色。
但也不是說 iOS 微信完全沒問題,有個狠人曾經在微信對話框里來回上傳+下載同一張圖。
前后重復 400 多次,整個圖片質量變成這樣:
國外也有人試過,在國外社交網站上,不斷重復上傳、下載、再上傳、再下載同一張圖。
重復 90 次之后都變灰了。
圖片質量折損,似乎是所有互聯網流傳圖片的宿命。
今天微信頭像褪色這事被發現后,網友們在評論區也討論到了。
不僅頭像,朋友圈發照片一樣的。
比如,機哥用手機拍照,照片 7.85MB。
然后,我把這張照片發朋友圈之后,再重新下載到手機。
喜提 174KB,分辨率大小也不一樣啦。
在對話框里發圖片是差不多情況的,機哥以前專門寫文章展示過,這里就不重復啦。
無論微信占了我們手機多少個 GB 的內存,圖片視頻該壓縮的還是會壓。
害,習慣了。
評論區網友們其實更擔心另一個地方:QQ 空間。
因為啊,很多人都拿 QQ 空間存照片的。
以前的照片本來就模糊,要是再來個折損,畫質得多差啊。
但究竟有沒有壓縮,我們也沒有原圖對比了。
機哥找來一張 2011 年上傳的 QQ 空間照片,看起來還好,沒有戰損模式。
重新下載這張圖,分辨率是 332*500 像素。
然而我無從對比,當時上傳的原圖是多少像素。
再來一張壁紙類的圖片,重新下載回來,分辨率倒也還是常規壁紙大小。
然而,當機哥重新往 QQ 空間上傳一張圖片,還是發現它似乎多少會壓縮。
在電腦端 QQ 空間,可以選擇普通上傳或高清上傳。
然而無論是普通上傳,還是高清上傳,機哥重新下載兩張圖片后,都是 14.6KB)。
也就是說,一張原本為 22.7KB 的圖,上傳到 QQ 空間后重新下載,回來只有 14.6KB 嘍。
但是,將 jfif 格式重新轉化為 jpg 格式后,分辨率和大小都會恢復。
如果用手機端上傳圖片到 QQ 空間,不好意思,會壓縮的,除非開黃鉆傳原圖。
機哥測試,7MB 的圖上傳到 QQ 空間,重新下載回來得到 322KB。
評論區有網友說,微博就不會壓縮。
機哥試了試,確實上傳前后都為 22.7KB,分辨率沒變。
咳咳,微博這回淺淺勝出。
但很多人已經習慣用 QQ 空間存照片了,怎么辦?
機哥只能說,如果你只是圖個肉眼能看清,那稍微壓縮畫質,還是能接受。
用電腦上傳圖片,似乎會比用手機上傳圖片更能保留圖片畫質。只是,在電腦上重新下載圖片后,需要經過格式轉換步驟。
如果你對畫質特別有要求,喜歡高清無碼大圖的,那要不咱還是找個硬盤來存圖片視頻吧。
至于微信頭像褪色問題,多多少少被熱搜傳得有點烏龍。
基本原理就是,重復上傳圖片,導致折損。
想要頭像保持美美高清,那就不要選「查看上一張頭像」,而是直接在手機相冊里選,會清晰些。
問題不大,坐等微信團隊修復吧~
圖片來自網絡
]]>京東App在2019年做了一輪瘦身,當時做了全方位的瘦身,但隨著業務快速迭代和新技術框架引入以及管控力度不足,安裝包體積出現了反彈。結合之前治而未管和業內一些同行的瘦身經驗,本文介紹此次瘦身過程積累的一些實踐經驗以及管控方案。首先拆分安裝包梳理數據,將安裝包的成份數據做成線上化看板,根據數據找出安裝包體積增長主要因素,結合京東App現狀進行了一系列綜合性的瘦身動作,也沉淀了一套新的管控規范及管控平臺,最終實現了安裝包體積下降30%以上。
安裝包成份分析
瘦身未動,“數據”先行,包瘦身的第一步是要分析出App組成成份的大小數據,為包瘦身的目標設定及任務拆解提供數據支撐,達到可度量、線上化、統一數據標準的目的。如何進行安卓App的包成份分析?安卓開發者基本都會用到Android Studio自帶的Apk Analyzer工具,將Apk文件拖入Android Studio中即可查看,下圖是京東App拖入Android Studio中顯示的包大小數據,可以清晰的看出包體積里占比較大的主要是lib(存放動態庫及安卓插件)、r(存放圖片、xml等資源)、assets目錄、dex和resources.arsc(資源映射表)幾類文件。
apk Analyzer工具對于初步的、特定的包大小數據查看非常方便,但是對于需要進行的包瘦身項目來看,數據過于籠統,沒有按模塊維度進行劃分,無法將包瘦身責任劃分給對應的研發團隊,不便于后續包瘦身項目的具體實施。為了度量各模塊對包大小的影響,我們需要一套精細化的包大小分析方案。
首先來看一下京東App的工程結構,簡化模型如下圖所示。京東App整體采用了插件化的架構,開發迭代過程中逐漸按照功能、業務類型拆分成了很多模塊,各模塊有獨立的項目工程、倉庫,日常進行獨立的開發維護,最終集成在Application工程中。功能型的模塊基本上是以library依賴的形式引入到工程中的,比如常用的網絡庫、圖片庫、埋點庫等;業務型的模塊大多是以插件的形式存在,比如搜索、商詳、購物車等;此外主工程中還存在少部分未拆分成模塊的歷史遺留邏輯,在日常迭代中占比非常少。
基于京東App模塊化的現狀,安裝包的成份分析可以從三個方面進行:分析包成份的總覽數據、分析插件數據和分析library數據。
01
Apk總覽數據分析
安卓的包產物apk文件本質上是一個zip文件,可以用zipinfo命令輸出壓縮包中每個文件的詳細信息日志,用法:
Zipinfo -l --t --h xxxx.apk > xxxx.txt
輸出的日志文件打開如下圖,每個文件的壓縮信息一行,包括文件名、原始大小、壓縮后大小等指標。
對以上日志信息進行逐行解析,根據解混淆后的文件名路徑、文件類型進行歸類統計,即可得出apk的總覽信息,包括各類型文件的數量、總大小、單一文件大小等指標,并建立文件大小索引。
02
插件數據分析
插件產物的本質也是apk,目前京東App的預裝插件有50+,App打包時各插件會以.so為后綴的形式放在lib目錄中。對插件的分析可以直接基于包產物進行,解析時只需要將apk解壓開來,按照文件名特征將插件從全部so文件中分離出來,逐一按照上述zipinfo相同方法進行解析即可。
03
library數據分析
各library模塊大多是以aar/jar依賴的形式引入到項目工程中,目前京東App的全部項目依賴庫有300+,包括直接依賴、間接依賴。對library數據的分析主要是在分析各依賴對包大小的影響和分析維護開發者兩個方面。
01
分析依賴對包大小影響
安卓工程在構建時,Gradle構建工具會自動將依賴庫同步緩存到本地,與工程中的代碼資源一起編譯merge最終輸出apk。通過編寫gradle腳本任務在構建過程中可以取到aar/jar依賴文件,但是考慮到分析工具的獨立性,盡量避免和打包流程耦合在一起,采用了自行解析依賴的方式來實現,整體流程如下:
a. 打包過程中執行gradle命令生成app運行時依賴樹日志文件,用法:
./gradlew:app:dependencies--configuration xxxReleaseRuntimeClasspath > dep.txt
生成的日志文件部分如下:
b.解析日志文件生成N叉樹模型,每一行日志生成一個依賴節點,包含groupId、artifact_name、version信息,日志中的->表示版本沖突取高版本,(*)表示重復依賴,在application和common_library中添加的依賴為直接依賴,對應根節點和common_library節點的子節點,其它節點為間接依賴。
c.將N叉樹扁平化去重逐一解析依賴,下載aar/jar文件。解析過程中拼接url輪詢倉庫,為了加快解析速度,可以根據依賴的groupId區分依賴的來源,如果是jd內部的依賴,則優先請求內部的私服,否則優先訪問常用的鏡像倉庫。此外可以加入LRU緩存機制,本地存在的依賴產物不再請求倉庫,進一步加快解析速度。存在的一個潛在問題是快照版本的依賴會對應多個產物,解析時取的最新版本可能和app構建時用的不是同一個,通常發版分支上的依賴被規定不能用快照版本,所以這個問題也就間接規避了。
d. aar也是一種zip文件,同樣可以用zipinfo命令來解析組成成份大小,建立內部jar、so、圖片、xml、asset等文件的索引。
e.將aar內部的各文件根據名稱與總覽數據分析時建立的文件大小索引進行關聯,即可知道aar內部的so、圖片、xml、asset等文件最終在apk壓縮包里的大小。由于代碼文件jar最終經過編譯、刪減、混淆merge成了dex,無法精確的溯源,代碼部分的大小計算采用了原始大小按比例折算的方式進行。折算比例是實驗去掉比較獨立的依賴后打包看包大小的差值,去除非代碼部分的大小后,即可算出代碼部分的折算比例,重復N次去除不同的依賴取平均值。
02
分析模塊負責人
前述京東App有300+依賴,由于業務調整、人員變動等原因沒有一個統一的library維護關系數據。對于直接依賴部分,初期通過git blame 命令輸出app、common_library工程的build.gradle文件修改記錄日志,正則匹配出依賴和維護者的對應關系;對于間接依賴部分,將前述N叉樹的每一個間接依賴節點,向上尋找它的父節點直到直接依賴節點,則直接依賴的開發者也是此間接依賴引入的責任人,會存在多個直接依賴引用了同一個間接依賴的情形,即某個間接依賴庫對應多個引入責任人。
通過上述分析方案,已經可以完整的分析出安裝包的各成份大小及對應的負責人,為瘦身工作的實施提供了數據指引。分析方案全部是用python腳本的方式實現,已集成到公司內部的CD系統,數據看板效果如下。
京東App的開發者團隊規模較大,在安裝包成份數據線上化建設完成后,所有開發者統一了看數標準和渠道,每個App版本的增長與下降也可以歸因到具體模塊級別以及對應的開發者,同時這個數據分析看板也為瘦身的度量和管控提供了基礎數據能力。根據數據分析我們發現App內資源文件、ReactNative、插件的數量和體積都比較大,所以瘦身重點圍繞這幾方面進行專項治理,同時基于之前瘦身出現過反彈的教訓,分析發現在過往開發迭代中缺乏約束管控,技術選型和研發復用也暴露了部分問題,因此制定了精細化的管控規范并在研測流程中落地實施。
瘦身方案
借鑒業內的瘦身措施,結合京東App自身特性制定了瘦身方案,首先進行了常規化瘦身舉措主要包括壓縮資源、內置ReactNative轉為下載、插件轉下載、R8編譯升級等,其次對App內的圖片進行專項治理,構建了圖片管理平臺,最終使安卓安裝包體積下降了近30%+,包體積瘦身趨勢圖如下圖。
01
瘦身措施
京東mPaaS平臺提供了安卓端插件轉下載安裝的能力,2022年初我們協同mPaaS團隊、運維團隊共同對其進行優化提升了其可用性和穩定性。將下載器的unknown host問題解決,加入了httpdns能力,支持切換域名能力等,運維團隊通過撥測解決某些cdn節點異常導致的文件md5不一致問題,最終在真實用戶網絡環境下平均單次下載網絡請求成功率在98%以上,由于在用戶進入頁面前存在多次觸發下載的機會,進入頁面而未加載成功場景的概率在十萬分之4以下,此概率已低于App的崩潰率,體驗上已完全可以保障,實踐過程中也未出現用戶體驗異常反饋。通過業務模塊的uv進行倒排序,最終甄選了10+插件進行了轉下載安裝。
在優化之初,京東大部分用React Native開發的業務模塊均采用內置App的方式,峰值數量達到50+個。聯合mPaaS團隊進行優化,最初評估采用Brotli壓縮本地內置包,經評估其解壓耗時是gzip的2倍,內存使用是幾十至幾百倍,最終放棄這個方案。統一采用了將內置包轉下載安裝的方案,通過拆分基礎包和業務包將JSBundle體積縮小,設置了預下載非強制更新、預下載強制更新以及增加某個RN業務打開則觸發其他未下載業務下載等策略有效提升了單周新版更新覆蓋率,提供h5降級、統一兜底降級等多重兜底體驗,最終提升了RN相關能力的穩定性和可用性,保障了用戶體驗,目前內置的RN業務模塊數已經降至個位數。
針對圖片壓縮,借助集成TinyPNG壓縮工具對10K以上的圖片進行壓縮;受限于Android工程minSdkVersion=16,不能將所有的png圖片都轉成webp格式,只能將無透明通道的圖片轉成webp。后期對包大小更嚴格的要求,可以考慮將圖片遠程化。
借助瘦身腳本分析工具掃描安裝包中方正純色的小圖片轉成iconfont,包內掃描出800多張可轉成iconfont,數量較多需要長期治理,雖然收益不明顯但利于各個業務零散的小圖標進行統一管理,同時有利于App整體視覺風格的統一。
通過自定義Gradle插件利用ASM對class文件進行字節碼操作,將class文件中引用到R類資源id替換成對應的常量值并刪除R文件,達到減少包體積的目的。由于京東App采用插件化的方式開發業務,每個業務插件都會引用公共資源,不能簡單的將公共資源id添加到白名單中,所以結合京東App插件化方案(aura)的公共資源id固定的能力,實現插件化工程中的公共資源內聯。目前開啟R文件內聯已完成灰度,后續會陸續上線,包體積整體收益5.5MB以上。
隨Target31適配升級AGP到4.1版本,同步開啟了R8編譯,需要注意R8會忽略部分Proguard混淆規則,針對R8編譯對混淆規則的變更點,編寫了mapping文件檢測腳本工具,對Proguard和R8編譯生成的mapping混淆文件進行對比,檢測網絡解析、反射相關的類是否添加了正確的混淆規則,利用工具保障了升級R8編譯后App的穩定性。R8編譯對代碼混淆優化效果要優于Proguard,開啟R8后,包體積減少1.6MB,構建耗時也降低30%(3min)以上。
7Zip兼容Zip格式,支持Zip的Deflate算法,使用7zip極限壓縮模式比Android打包默認的zip壓縮率高,可以將加固好的apk文件進行7zip解壓縮后重新簽名,包體積降低約2.2%(2MB)。為了驗證其穩定性與可用性,計劃對內部和外部市場都分別進行灰度,通過京東內部灰度渠道已灰度完成,對外部的各個渠道將包直接投遞到渠道,如小米、華為等在灰度進行中。
在完成這些常規瘦身方案優化后,App安裝包大小依舊較大。先前圖片資源優化主要是通過圖片壓縮、使用一套分辨率xhdpi圖片、圖片轉webp、資源名混淆等方式進行,這些優化方式都是將內置的圖片進行瘦身優化,隨著業務功能的不斷迭代,瘦身收益將越來越少。京東App各個業務的開發方式是以插件化的形式進行,通過對這些業務插件包的分析,發現這些業務模塊中內置的圖片資源大小占各自插件包總大小的25%以上,針對內置圖片資源過多問題,提出一種圖片資源遠程化的優化方案。
02
圖片資源遠程化
直接將圖片資源轉成在線加載可能會影響用戶體驗,將內置的圖片資源從App應用內剝離,然后將圖片上傳到CDN獲取到圖片的網絡鏈接,應用通過加載圖片鏈接進行在線加載的方式來展示圖片,在線加載圖片需要經過下載圖片的過程,考慮到用戶所處的網絡環境受多種因素的影響,常使用默認的兜底圖在圖片展示區域進行占位,或者使用全屏的加載中動畫進行過渡等方式來優化用戶體驗。從優化用戶體驗角度出發,提出一種2層網絡加載+3層降級措施的優化方案,可以提高網絡圖片的加載成功率,同時給用戶展示圖片的體驗如同加載應用內置圖片資源一樣,整體方案如下:
該優化方案主要由圖片管理CMS平臺和獲取圖片信息的客戶端組件組成,由業務研發在CMS配置各自模塊的圖片信息,客戶端通過組件獲取圖片地址展示圖片。
01
CMS圖片管理
02
客戶端圖片預加載與緩存
該優化方案中,2層網絡加載的第一層網絡加載是指業務模塊的zip包,下載一次多版本復用;第二層網絡加載是指圖片zip包預加載未完成或失敗時,通過安裝包中內置的圖片CDN鏈接兜底配置信息加載圖片網絡鏈接來展示圖片,該兜底配置信息以圖片名+圖片CDN鏈接鍵值對的形式保存。
3層降級措施的第一層降級是獲取圖片zip包預加載的本地緩存圖片;第二層降級是當本地圖片緩存失效時,獲取內置的圖片CDN鏈接加載;第三層降級則是默認的兜底圖。瘦身業務模塊開啟圖片zip預加載功能時,CMS支持業務模塊設置zip包預加載策略,業務模塊根據實際情況選擇不同的加載策略,例如某些業務模塊頁面入口比較深,這些業務模塊就可以選擇用戶在進入頁面時觸發zip包的預加載;
某些業務模塊進入頁面入口比較淺就可以設置App啟動后空閑時預加載,其他二級、三級的頁面可以設置App啟動后x秒(隨機時間)才開始下載。通過設置這些預加載策略,將圖片zip包分散在不同時間段下載,降低圖片加載時的網絡流量峰值。
上述方案需要業務研發積極配合,需要業務模塊額外通過固定的模塊ID+圖片ID優先獲取本地緩存的方式加載圖片,使用過程較繁瑣,缺乏靈活性,為方便開發者更容易使用,提供更多選擇,降低接入成本,我們在CMS和客戶端作了些改進,又提出了下面的優化方案:
CMS后臺對圖片zip打包做額外處理:取圖片CDN鏈接中固定路徑計算MD5值,并將該MD5值重命名圖片名稱,不保留圖片類型后綴。例如鏈接:https://xxx/jfs/xxx/name.png,對鏈接中jfs開頭和.png之間的路徑字符串進行MD5值計算:MD5(/jfs/xxx/name) =MD5-Value ,以該MD5-Value值作為圖片名稱,并且移除圖片類型后綴名(.png等), 其他圖片同樣按照該步驟進行重命名,最后打包成以模塊名命名的圖片壓縮包。
提供一個工具類,以模塊名和圖片CDN鏈接作為入參,對圖片CDN鏈接進行相同的處理,獲取CDN鏈接中固定路徑字符串的MD5值,然后根據模塊名和MD5值查找該圖片本地緩存是否已存在,即圖片zip包預加載是否成功,如果圖片已成功緩存則將該圖片的緩存路徑(file://協議)返回給圖片加載框架,如果圖片緩存不存在,則原樣返回圖片CDN鏈接(http://協議)。同樣也可以結合圖片加載框架實現,新增以業務模塊名作為別名的圖片加載屬性,該別名屬性就是業務模塊圖片緩存本地的目錄,如果設置了該屬性,圖片加載框架就會優先判斷該圖片是否已緩存成功,若圖片已緩存成功,則通過本地路徑展示圖片,若緩存未成功,則直接在線加載圖片,該方案需要客戶端圖片加載框架同時支持file協議和http協議。該方案也可以應用于大促等場景的圖片預加載。
通過埋點數據查看zip包預加載成功率,圖片zip包預加載在配置首頁啟動后x秒下載,iOS端的zip包加載成功率在98.9%~99.1%波動,Android端的zip加載成功率在96.7%~98.1%波動,剩余1%~3%的用戶則通過內置的兜底cdn鏈接在線加載,倆者結合展示圖片的成功率接近100%;客戶端從本地緩存加載圖片的效率要高于從網絡在線加載圖片,省去了等待圖片下載的過程,降低了默認兜底圖的展示概率,在體驗上接近于本地內置圖片加載的效果。
管控
京東App在2019年專項瘦身后經過一段時間又反彈了50%,一方面因為業務快速迭代發展以及新引入了一些比較大的基礎庫,另一方面原因就是重點做了瘦身治理卻沒有深入做管控準入防止劣化。因此在新一輪瘦身優化過程中,我們一邊做瘦身治理,一邊在探索常態化的管控機制,最終沉淀了一套管控規范和管控平臺。
管控的目的不是為了限制需求迭代與增加代碼,目的是做好把控讓合理的代碼放進來,不合理的拒絕掉以及淘汰陳舊的代碼,提升開發者們的瘦身意識。管控對產研全鏈路提出了新的要求,對于以往粗放型的需求開發迭代方式會有所約束,產品側需要及時的配合研發側將ABTest的廢棄實驗代碼下線,研發側需要做好技術規劃和技術選型,盡可能的精簡代碼和復用代碼,加強技術團隊之間的協同,不放置過大或冗余的資源文件等。
管控的前提是基于App已經充分的組件化解耦,且App開發人員規模相對比較大,比如京東App當前安卓端是由業務插件和AAR依賴庫組成。App的組成成份整體上是由一個配置表來表示,配置表內描述所有組件的配置版本信息,一個組件是否允許集成到App內的前提是這個組件體積增長大小符合我們制定的規范,然后組件的最新版本才可以集成到配置表內。我們管控的核心機制就是控制配置表的更新集成權限,以此來約束每個組件的開發者,通過App架構師委員會(京東內由架構師形成的虛擬組織)制定的公共管控規范來評判每個組件體積增長是否合規,合規則準入更新配置表,否則走異常申請流程。
01
管控流程與方案
管控流程是伴隨著開發、測試、發布整個流程進行的,整體的流程如圖所示。開發者開發完成后,由開發者在京東內部的組件構建與發布平臺(mPaaS)發布形成新的組件版本,在構建完成后開發者在打包平臺(Bamboo)基于臨時配置表進行打包并提測,在此過程中會基于包計算出對應組件的體積變化數據,同時打包系統會以郵件形式將數據同步至開發者,盡可能前置的告知開發者是否存在不合規;
測試通過后開發者申請集成組件版本信息至配置表,若合規則更新配置表且流程結束,若不合規開發者可以進行代碼優化后在申請集成,或者申請異常審批流程至App架構師委員會。常規的業務迭代大部分不會出現違規,但也會存在部分異常的情況,異常的處理往往會產生較多的爭議,研發的安裝包體積管控需要頂住產品和業務的壓力,異常處理的流程需要客觀、透明、靈活,異常處理流程如圖所示。
某個組件違規了發起申請,對于三方庫、國家要求的隱私整改、安卓系統升級適配等情況,可以審核準許通過,其他一些特殊情況也可以通過,由App架構師委員會來酌情把控。對于一些正常情況下產生了組件體積增長超限違規,短期無法優化瘦回可以申請設置未來n個版本后瘦回,或者A組件協商B、C組件來協助分擔瘦回,最終瘦身方案由App架構師委員會判斷合理性,后續在n個版本內由平臺自動計算瘦身的階段性進展數據告知瘦身發起的相關人員;在n個版本后若未達成瘦身既定計劃的目標則進行線下專項討論,重新制定計劃或做一些公示性處罰。
判斷一個組件合規與否依賴于管控規范,管控規范由App架構師委員會共同討論制定,最初我們設定的管控規范比較粗糙:每個組件當前版本相對于上個版本應小于等于n KB(起初n設置為100),隨著瘦身進展到后期發現其存在比較多的弊端,對于體積大的模塊其往往是多個開發者協作經常容易出現違規,對于體積小的模塊往往參與人少迭代變化也不頻繁,所以規范根本對其不起作用。
基于這個情況我們改進了規范:將組件分為A1和A2兩類,A1類組件>=n MB,A2類組件<n MB,對于A1類組件限定其年增幅應小于等于x%,對于A2類組件限定其單個版本增量應<=yKB。A1類模塊一般迭代頻率高且開發人員多,限定年增幅度每個版本的回旋調整余地更大;對于A2類模塊迭代頻率一般不高,設定單個版本增量更小也可以對應的約束其增長;對于一些三方庫、公共庫設置白名單處理;從全局來看管控規范基本兼具一定的公平性和合理性。結合App實際情況,通過合理的設定n、x及y值,可以將增幅控制在計劃范圍內。
總結
隨著業務和用戶需求的發展,App的體積會保持向上增長的趨勢,業內各個體積較大的App都在進行著瘦身。我們借鑒了業內一些優秀的瘦身方案,結合京東App的實際場景進行了多項措施相結合的綜合性瘦身方案,提出了既要治理又要管控的思路,沉淀了一套管控規范,并將其落地到研發測試流程系統內。隨著新技術的迭代更新,新的瘦身方案與措施會不斷涌現,我們會持續保持跟蹤,歡迎讀者們交流拍磚。
【參考資料】
1、5年磨一劍|優酷Android包瘦身治理思路全解:https://developer.aliyun.com/article/953463
2、抖音包大小優化-資源優化:https://juejin.cn/post/6844904106696376334
3、Google縮減應用大小:https://developer.android.google.cn/studio/build/shrink-code#shrink-resources
4、Android App包瘦身優化實踐:https://tech.meituan.com/2017/04/07/android-shrink-overall-solution.html
5、百度App Android包體積優化實踐:https://mp.weixin.qq.com/s?__biz=MzUxMzk2ODI1NQ==&mid=2247485123&idx=1&sn=09e7fb181f8d1e8d0736931c42be0707&chksm=f94c57d3ce3bdec52c78db8b86e1fdac1f4564ccff94382aec1e5fb060b543ab134de7ac9c3d&scene=21#wechat_redirect
6、R8:https://r8.googlesource.com/r8
7、京東插件化工程R文件瘦身技術方案:https://mp.weixin.qq.com/s/JgNugWIyor23J-nrKMC6dg
8、京東到家Android瘦身探索:https://mp.weixin.qq.com/s/qqa931j9Jw2ojCX18E1–g
作者:App瘦身團隊
來源:微信公眾號:京東零售技術
出處:https://mp.weixin.qq.com/s/sSpbbq-v04CAB5ifKmC20g
]]>大家好,歡迎回到辦公半點功夫。眼下,年味越來越濃了,就在家家戶戶都在興高采烈置辦年貨的時候,微信官方也迎來了重磅更新,原來每次發送總被9張數量所限制,而現在好了,官方直接發大招,在這萬家團圓的時刻,偷偷將9張圖片的限制升級為20張,真是好消息!然而,使用過后的用戶卻實在高興不起來,這到底是怎么回事?
一、重磅升級
日前,iOS版本微信迎來超大喜訊,經過更新到8.0.18正式版后,雖然在官方更新報告中并未提及,用戶突然發現了一個極其重大的更新,那就是大家一致詬病的圖片發送9張限制問題,本次竟然升級為20張圖片,也就是說,你原來每次只能發送給對方9張圖片,現在可以直接選擇20張。或許有的小伙伴還不相信,上圖證實。還沒有體驗的朋友,還不快快去實驗一番。
二、實則還有內情
就在大家興奮的時候,卻突然發現這里面還隱藏有小技巧。我們都知道原來給對方發送圖片的時候,雖然只能最多選擇9張,但選中的圖片都可以單獨一個個發送給他人。而本次更新后,雖然一次性最多可以選擇20張圖片,卻在關鍵的地方幫你整合。見圖片
根據提示,我們很清晰的發現,如果選擇的圖片超過了9張,雖然還可以繼續選中,但軟件默認將開啟制作系統模式,也就是說,你選中的圖片超過了9張,將啟動類似于視頻相冊的功能,自動幫你制作成了視頻,而不是我們傳統觀念中的單獨一個個圖片。這對于想單獨使用照片的場景來說,就畫蛇添足了。
三、有遺憾也有驚喜
雖然,并沒有用戶想象中的那么如意,但升級后的功能還是可圈可點。雖然超過了9張圖片不能發送為單獨的照片,但是對于很多平時想制作成照片視頻的朋友來說,簡直就太方便了。
是的,很多朋友看到了自己朋友圈別人制作的照片視頻很是羨慕,想嘗試制作卻苦于沒有技術,現在更新后的功能簡直就是為這些人量身打造的。
雖然,本次更新沒有用戶預想的如意,但是相信不久官方必定還有大招,到那時肯定不光是iOS用戶了福利了。
]]>相冊的斷舍離立即開始…
首先刪除的是各種景色的照片,這些景色當時拍時已經一睹為快,有的甚至被編成小視頻在自己的網絡空間永久存在,不會也沒有必要在相冊里重溫舊夢,所以,先從它們下手吧。點擊圖庫里相冊,再點擊所有圖片,在需要被刪除的每張圖片的右下角的方框里點擊畫上?,可以拖動手指一行一行連續畫?后,再點擊屏幕下方的刪除鍵集體刪除。
不同的時間,不同的地點,景色照片被分布在不同的相冊地點,連續刪了五六次才全部刪完。同樣的操作,刪除了所有的綠植花卉。同樣的景色每年都有,同樣的綠植花卉還在綠意盎然的生長,所以盡情的刪吧,一點也不可惜。
接下來要刪除的是單位的各種辦公圖片,教學檢查的,領導視察的,公開課的,各種會議的,孩子們跑操的、獲獎的等等,還有一些幫同事拍的工作照。這些照片有用的都用在新聞稿里,以后需要時可以直接下載,手機里的這些只剩下占用空間的功能。刪吧,毫不留情的,干干脆脆的,你們都去垃圾箱呆著吧。
下面要刪的就是各種截圖,百度里的識萬物,拍了很多張的植物花草和學科的各種習題,小紅書里面的雞湯文字、書籍推薦、穿搭美容運動等各種截圖,某寶里的各種截圖搜圖等等,一張張,一頁頁,全部被我打上了小勾勾,送你們全部都去垃圾箱吧。還有各種美食圖片,吃火鍋的,吃烤串的,徽菜的,食堂的早餐中餐,到姐姐家蹭飯的,自己做的各種黑暗料理,一行行,一排排,全部被我點擊刪除進了垃圾箱。美食每天有,留下已經吃過的圖片實在糟心。
最后需要刪除的是各種有人像的照片了,最多的也屬于這一類照片,先刪去瞇眼的,歪嘴的,各種奇怪表情的,模糊的,再把同一種動作或表情的圖片只留下最好的那一張,合影也是,只留下每個人的表情都自然正常的那張,其余全部刪除。看美照心情愉悅,看丑照心情不爽,那為何還留下丑照?刪去不想看的,留下想永久保存的,既討好了心情,又留下了美好,真是一舉兩得的美事。
點點擊擊,刪刪減減,花了半個多小時的時間,五千多張圖片最后只剩下一百多張,每一張都很滿意,每一張都是精挑細選的。最后,一起上傳到qq的私密相冊里。
上傳完后。手機圖庫里的僅剩的一百多張,也被我拖進了垃圾箱。我的圖庫圖片變成了0數字,而我的心情卻由壓抑變得輕松的想飄起來。
從明天開始,我的手機攝影照相功能又將重新啟動,我要拍一組,檢查一組,刪除不想要的,留下滿意的。哪怕耽誤時間,我也不會把n張無用的不美的圖片留在手機里,如果沒有時間,就在晚上下班后抽個5分鐘時間整理當天的手機相冊。讓我的手機相冊和我的心情一樣,脫去一天的疲憊,舒舒服服睡個好覺。
]]>抖音漲粉周榜來啦!小編帶你回顧上周(9.05~9.11)抖音漲粉情況!
本周在漲粉數據方面,有2個賬號漲粉破百萬,分別是@辛吉飛、@郭聰明。
榜單前二十中明星賽道有2個賬號上榜,母嬰親子賽道、劇情搞笑賽道和美食賽道各有3個賬號上榜,其他品類則分布均勻。
▲數據來源:考古加數據
本周漲粉第一的是美食賽道的@辛吉飛,視頻內容為制作“科技美食”,即路邊攤美食解密,本周漲粉219.3萬,粉絲總數395.2萬。
小編在上周的漲粉周榜中對@辛吉飛 的視頻內容做過詳細分析,感興趣的朋友可以點擊下方圖片閱讀。
▲點擊上圖,跳轉原文閱讀
漲粉榜第二的是音樂賽道的@郭聰明,他在21年的時候就擁有4000萬的粉絲,但當時因為“震顫病”退圈。
上周日攜新專輯回歸,小楊哥助力直播首秀,薛之謙空降直播間,當日漲粉90.3萬,本周漲粉112.1萬,粉絲總數3740.5萬。
▲圖片來源:抖音截圖
本周上榜的3個母嬰親子賽道的賬號@希希不挑食、@My name is 伊森、@艾夏 漲粉數據接近,但漲粉技巧各有不同,接下來,我們來重點分析這三個賬號的漲粉路徑。
1
@希希不挑食
萌娃靠吃飯圈粉
@希希不挑食 賬號運營者是95后寶媽,從21年開始記錄寶寶的自主進食的日常。
當時寶寶只有一周歲左右,雖然有時也會用手去抓飯,但是寶媽非常有耐心,溫柔引導孩子用正確的方式吃飯。
在日復一日的視頻更新中,我們可以看到寶寶逐漸養成良好的進食習慣,會正確拿筷子,會主動要求帶圍兜。
▲圖片來源:抖音截圖
寶媽準備的食物種類齊全,寶寶也不挑食,大口吃飯的視頻,讓網友直呼“太下飯了,想搶她的飯!”
▲圖片來源:抖音截圖
同時,隨著寶寶年齡的增長,越來越可愛的外形,更是俘獲的網友的心。
▲圖片來源:抖音截圖
視頻不僅是記錄寶寶吃飯,也在記錄孩子的成長,比如有個視頻,媽媽給寶寶打飯,寶寶突然說了一句“謝謝媽媽”,這是寶寶在耳濡目染中學會的感恩。
▲圖片來源:抖音截圖
雖然是記錄孩子吃飯的視頻,但是畫面干凈整潔,而且媽媽育兒有方,吸引了眾多寶媽來取經,寶寶可愛的外形更是收獲了 一批云養娃的粉絲。@希希不挑食 本周漲粉58.1萬,粉絲總數132萬。
2
@My name is 伊森
上海版“成長的煩惱”
美國情景喜劇《成長的煩惱》,演繹多子女家庭雞飛狗跳日常,曾經風靡一時,在國內外都極受歡迎。
而@My name is 伊森 的視頻,則是上海版“成長的煩惱”。視頻內容是爸爸帶娃日常,輔導孩子寫作業,媽媽極少出鏡。看多了媽媽帶娃的視頻,爸爸帶娃的視頻也讓人覺得有些許新鮮感。
▲圖片來源:抖音截圖
視頻中學霸姐姐和學渣弟弟的組合,姐姐在爸媽忙碌時會幫忙輔導弟弟的作業,兩個孩子截然不同的性格,催生出了不一樣的化學反應。
▲圖片來源:抖音截圖
而爸爸在輔導學渣弟弟的功課時,抓耳撓腮痛苦不堪的樣子也會引起了因輔導作業而頭疼的家長們的共鳴,讓屏幕前的家長們代入感極強。
▲圖片來源:抖音截圖
真實還原有孩家庭的日常,加上新鮮有趣的家庭成員分工,還有幽默詼諧的劇情設定。這些都讓@My name is 伊森 收獲了眾多的粉絲,本周漲粉54.5萬,粉絲總數248.6萬。
3
@艾夏
老外媳婦帶娃日常
@艾夏 的賬號運營者是土耳其嫁到中國的老外媳婦,她的視頻內容分為孩子的成長記錄、外國辣媽好物分享、還有中外趣味文化差異。
▲圖片來源:抖音截圖
@艾夏 的孩子是混血寶寶,但卻混了個寂寞,在爸爸強大的中國基因之下,@艾夏 的基因毫無存在感,孩子的外貌特征和普通的中國寶寶無異,但是不像混血的混血兒,反而讓人們有記憶點。
▲圖片來源:抖音截圖
外國辣媽好物分享是艾夏給網友們種草一些寶媽愛用護膚品和寶寶的生活用品,這些都對新手媽媽有一定的參考作用。
▲圖片來源:抖音截圖
中外趣味文化差異則包括了老年人使用翻譯軟件和國外的家人交流,還有中國的輩分讓她“變老”了,以及外國女生對中國女生的印象等。這些視頻用輕松活潑的風格講述了兩國文化的差異,也極受粉絲喜愛。
▲圖片來源:抖音截圖
但是讓@艾夏 本周迅速漲粉的,則是一條獲贊192.7萬的視頻。視頻內容是三年沒回家的艾夏,歷時6天,從中國回到了土耳其,想給父母一個驚喜,一開門媽媽就激動的哭著癱坐到地上。
雖然不同的國家之間存在文化差異,但是親情的內核是相同的,這一幕也深深感動了網友。@艾夏 本周漲粉46.1萬,粉絲總數84.6萬。
▲圖片來源:抖音截圖
本周上榜親子賽道的三個賬號,漲粉原因各有不同,@希希不挑食 靠吃飯可愛漲粉,@My name is 伊森 真實還原輔導孩子的場景讓家長們有代入感,@艾夏 靠中外差異引人關注,還有有一個共同點,就是內容真實,孩子可愛。
其實不管是國內還是國外,網友們圍觀人類幼崽的熱情從未衰減。抖音上的萌娃憑借天真可愛俘獲千萬觀眾,與之相對應的則是他們強大的吸金能力。萌娃流量所帶來的商機又促使家長進行“啃小”獲利。
事實上,如果把成年人做主播視為自主選擇的結果,那么很多打著萌娃旗號的未成年人直播、短視頻則屬于“趕鴨子上架”。在孩子尚未形成獨立世界觀之前,他們不得不面對成人世界的價值邏輯。親子賽道日益擁擠,風險也如影隨形,這些都應當可愛的你給小編點個贊吧~
]]>