小知識集錦【1】

繼續總結本司機在工作過程中涉及到的一些小知識點或小的技巧,其中有代碼片段,也有知識點,經驗總結和分享。因爲工作比較忙,真的沒法保證每天都有一篇公號文章發出,所以標題再叫“每天一點小知識”就不太合適了,因此改名爲“小知識集錦”。後續使用這個名稱,繼續爲大家總結各種小知識或技巧。

1、Drawable和Bitmap區別

Bitmap - 稱作位圖文件(Bitmap),擴展名可以是.bmp或者.dib。位圖是Windows標準格式圖形文件,它將圖像定義爲由點(像素)組成,每個點可以由多種色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩圖片,其所佔存儲字節數爲:1024×768×32/(8*1024)=3072KB。
位圖文件圖像效果比較好,但是是非壓縮格式的,需要佔用較大存儲空間,不利於在網絡上傳送。jpg格式則恰好彌補了位圖文件這個缺點。
Drawable -是 Android平臺通用的圖形處理對象,它可以裝載常用格式的圖像,比如 GIF、PNG、JPG,以及 BMP,另外還提供一些高級的可視化對象,比如漸變、圖形等。

2、Android編譯器一點知識

最近在調試一些開源項目時遇到如下報錯,
Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.錯誤解決
經過在網上查找資料,找到一個知識點需要跟大家普及一下。
2016 年 3 月,Google 向外界發佈了 Android N 的預覽版的同時,指出 Android N 增加了一項的新特性,這個特性是一項新的工具鏈,它與 Android 生態圈的所有開發者關係,即 Jack & Jill 編譯器的引入。我們知道,Android一直依賴 Sun/Oracle 的 Java 編譯器達十年之久,而Google和Sun/Oracle一直在爲Java的版權問題打官司,所以,Google研發了自己的Java編譯器–Jack。Jack 是 Java Android Compiler Kit 的縮寫,它可以將 Java 代碼直接編譯爲 Dalvik 字節碼,可以進行 Minification, Obfuscation, Repackaging, Multidexing, Incremental compilation等工作。它可以取代 javac/dx/proguard/jarjar/multidex 庫等目前已有的這些工具。
而Android N 7.0(API24)在對JAVA8的支持上,採用了新的編譯器。所以這個變異錯誤的解決方法是在app的gradle文件defaultConfig 段中,增加如下聲明語句,

jackOptions {
enabled true
}

即可解決問題。
參考官網定義如下,

android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

注意: 需要使用Android N 也就是API24

3、Canvas 和和 Paint 的關係

Canvas - 畫布。

我們可以看作處理工具,使用其提供的方法可以管理 Bitmap、或Path 所在的圖形對象,同時它可以配合 Matrix 矩陣類給圖像做旋轉、縮放等操作,以及可以進行裁剪、選取等操作。

Paint - 畫筆。

可以把它看做一個畫圖工具,比如畫筆、畫刷。用它可以設置畫圖時的字體、顏色、樣式等。

4、插件化和熱修復的區別

這兩個概念對於新手來說,比較容易混淆,這裏簡單介紹一下二者的區別。
實際上,兩者的表現並不相同,而且差別也較明顯,雖然有些框架實現上可能有相同之處,比如利用ClassLoad進行hook等。
插件化或者叫組件化的目的是爲了減小模塊耦合,方便在項目體量變大之後實現更好地團隊協作。說白一些就是讓你把部分功能提取出來,放到插件裏面,而不是一股腦都放到主APK裏面,等你需要用到這個插件對應的功能的時候再把它下載下來,這樣可以充分減少你主APK的大小。還有一個好處是可以靈活擴展功能,比如版本迭代,引入新的功能。
熱更新或者熱修復主要目的是不用重新下載和安裝新的apk,使用戶可以在無感知的情況下修復線上的問題,避免了應用在遇到問題後或者嚴重bug後頻繁發佈新版本。

5、比較新和有權威的插件化框架

插件化或組件化:

● DroidPlugin – 360團隊出品

質量有保證,成功案例——360手機助手

● Replugin – 360出品

2017年06月30日開源,360 公司幾乎所有的億級用戶量的 APP ,以及多款主流第三方 APP ,都採用了 RePlugin 方案

● Small–wequick推出的框架

輕巧的插件化框架,酷狗音樂等著名開發團隊在使用。

● Atlas–阿里框架

淘寶開發和實用的組件化開發框架。

● VirtualAPK–滴滴

2017年6月3號開源,良好的兼容性,且入侵性較低,可以作爲加載耦合插件方案是較好選擇。

除了以上,還有寫比較老一些的或者個人開發者框架如,AndroidDymnamicLoader,dynamic-load-apk,CJFrameForAndroid,direct-load-api。

6、比較有名的熱修復框架

● Weex–阿里

不僅可以實現熱修復,還支持跨平臺。

● andfix(或hotfix)–阿里

2015年下半年開源,提供了一種運行時在Native修改Filed指針的方式,實現方法的替換,達到即時生效無需重啓。

● dexposed–阿里

阿里大部分App客戶端採用的熱修復、線上調試能力的框架。

● Sophix–阿里

2017年阿里新開源的框架,Sophix 可以說是博採衆長,前面提到的Tinker及AndFix 都在某一方面存在缺陷。

● Robust–美團

Robust 兼容性與成功率較高,但是它與 AndFix 一樣,無法新增變量與類只能用做的 bugFix 方案。

● QQ 空間超級補丁方案–騰訊

採用Dex分包機制實現,讓修復後的類替換原有的類。

● Tinker–騰訊

它是微信官網的Android熱補丁解決方案

7、UID和PID區別

UID是用戶ID。每個應用程序只有一個。
Android中的UID和計算機不一樣,計算機指的是每個用戶都具有一個Uid,而Android中每個程序都有一個Uid,默認情況下,Android會給每個程序分配一個普通級別互不相同的 Uid,Android規定只有Uid相同的組件纔可以互相調用,因此同一個應用下的Activity是可以互相調用的。
可以通過讀取文件data/system/packages.list來查看應用對應的UID。
也可以通過如下代碼獲取UID,

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ApplicationInfo appinfo = getApplicationInfo();
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
for (RunningAppProcessInfo runningProcess : run) {
if ((runningProcess.processName != null) && runningProcess.processName.equals(appinfo.processName)) {
uid = String.valueOf(runningProcess.uid);
break;
}
}

PID是進程ID。每個進程對應一個ID,但一個應用可能會有多個進程,因此應用的PID並不是唯一的,它可能會有多個。
可以通過如下shell指令查看應用對應的PID。

ps|grep XXX

XXX表示程序的包名。

8、模擬產生點擊事件

有些同學不知道,在Android原生系統中有一個input工具,位於/system/bin目錄下,國內大部分國產手機是保留這個二進制可執行文件的,而有些手機卻將其閹割掉了。它的使用方法如下:
input keyevent xxx<按鍵名或者按鍵值>
xxx指具體的事件,如KEYCODE_BACK,表示一個返回鍵,對應的值爲3,再比如KEYCODE_HOME模擬一個home鍵。按鍵名或者值可以從官方文檔查詢,只要是以KEYCODE_開頭的都可以。
但是這個指令的執行需要root權限才行。

9、如何判斷activity是否已經被銷燬

一般我們使用activity.isFinishing()方法來判斷activity是否已經被銷燬,若Activity被結束,這返回true,否則的話返回false。但是在實際的項目中還是有問題,需要增加activity.isDestoryed()方法來判斷activity是否被銷燬,但是isDestoryed()方法支持的最低版本爲Level 17,因此這個方法也不是太靠譜?
官方給出一個方法,
FragmentManager的API doc 中有這樣的定義:

/**
* Returns true if the final {@link Android.app.Activity#onDestroy() Activity.onDestroy()}
* call has been made on the FragmentManager's Activity, so this instance is now dead.
*/

public abstract boolean isDestroyed();

因此可以藉助FragmentManager對象來判斷,即

 if(fragmentManager.isDestroyed) return;

10、Opus文件格式

前一段時間協助遙控器端調節智能語音遙控器,需要將遙控器端用戶輸入的語音數據由遙控器的智能芯片通過藍牙BLE傳輸給盒子端,然後盒子端進行解碼後用來識別,從而控制盒子的操作。我們使用的這個芯片支持三種語音格式,broadvoice,adpcm和opus這三種格式。於是對opus進行了一下了解,以下內容來自於網上。這裏帶大家瞭解一下這種音頻壓縮格式。
Opus編碼器 是一個有損聲音編碼的格式,由互聯網工程任務組近來開發的。Opus 格式是一種聲音編碼格式,並且是一個開放的格式,使用上沒有任何專利或限制。它前身是celt編碼器。在當今的有損音頻格式爭奪上,擁有衆多不同編碼器的AAC格式打敗了頗有潛力的Musepack、Vorbis等格式,而在Opus格式誕生後,情況有所變化。通過諸多的對比測試,低碼率下Opus完勝曾經優勢明顯的HE AAC,中碼率就已經可以媲敵碼率高出30%左右的AAC格式,而高碼率下更接近原始音頻。

這裏寫圖片描述
本公衆號將以推送Android各種碎片化小知識或小技巧,以及整理老司機日常工作中踩過的坑涉及到的知識點爲主,也會不定期將正在學習使用的React Native一些知識點總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章