標簽:【每日一題】
25. 描述下 Android 數(shù)字簽名 【2018.1.26】
在 Android 系統(tǒng)中衍慎,所有安裝到系統(tǒng)的應用程序都必有一個數(shù)字證書杜跷,此數(shù)字證書用于標識應用程序的作者和在應用程序之間建立信任關系虚茶。
Android 系統(tǒng)要求每一個安裝進系統(tǒng)的應用程序都是經(jīng)過數(shù)字證書簽名的俐末,數(shù)字證書的私鑰則保存在程序開發(fā)者的手中芥永。Android將數(shù)字證書用來標識應用程序的作者和在應用程序之間建立信任關系聚蝶,不是用來決定最終用戶可以安裝哪些應用程序杰妓。
這個數(shù)字證書并不需要權威的數(shù)字證書簽名機構認證(CA),它只是用來讓應用程序包自我認證的碘勉。
同一個開發(fā)者的多個程序盡可能使用同一個數(shù)字證書巷挥,這可以帶來以下好處。
(1)有利于程序升級恰聘,當新版程序和舊版程序的數(shù)字證書相同時句各,Android 系統(tǒng)才會認為這兩個程序是同一個程序的不同版本吸占。如果新版程序和舊版程序的數(shù)字證書不相同,則Android系統(tǒng)認為他們是不同的程序凿宾,并產(chǎn)生沖突矾屯,會要求新程序更改包名。
(2)有利于程序的模塊化設計和開發(fā)初厚。Android系統(tǒng)允許擁有同一個數(shù)字簽名的程序運行在一個進程中件蚕,Android程序會將他們視為同一個程序。所以開發(fā)者可以將自己的程序分模塊開發(fā)产禾,而用戶只需要在需要的時候下載適當?shù)哪K排作。
在簽名時,需要考慮數(shù)字證書的有效期:
(1)數(shù)字證書的有效期要包含程序的預計生命周期,一旦數(shù)字證書失效,持有改數(shù)字證書的程序?qū)⒉荒苷I墶?br>
(2)如果多個程序使用同一個數(shù)字證書琢唾,則該數(shù)字證書的有效期要包含所有程序的預計生命周期。
(3)Android Market 強制要求所有應用程序數(shù)字證書的有效期要持續(xù)到 2033 年 10 月 22 日以后衫生。
Android 數(shù)字證書包含以下幾個要點:
(1)所有的應用程序都必須有數(shù)字證書,Android 系統(tǒng)不會安裝一個沒有數(shù)字證書的應用程序
(2)Android 程序包使用的數(shù)字證書可以是自簽名的土浸,不需要一個權威的數(shù)字證書機構簽名認證
(3)如果要正式發(fā)布一個 Android 罪针,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用 adt 插件或者 ant 工具生成的調(diào)試證書來發(fā)布黄伊。
(4)數(shù)字證書都是有有效期的泪酱,Android 只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經(jīng)安裝
在系統(tǒng)中还最,即使證書過期也不會影響程序的正常功能
24. Android 中布局的優(yōu)化措施都有哪些墓阀?
1、盡可能減少布局的嵌套層級
可以使用 sdk 提供的hierarchyviewer工具分析視圖樹憋活,幫助我們發(fā)現(xiàn)沒有用到的布局岂津。
2、不用設置不必要的背景悦即,避免過度繪制
比如父控件設置了背景色,子控件完全將父控件給覆蓋的情況下橱乱,那么父控件就沒有必要設置背景辜梳。
3、使用include
標簽復用相同的布局代碼
4泳叠、使用merge
標簽減少視圖層次結構
該標簽主要有兩種用法:
1) 因 為 所 有 的 Activity 視 圖 的 根 節(jié) 點 都 是 FrameLayout 作瞄, 因 此 如 果 我 們 的 自 定 義 的 布 局 也 是FragmenLayout 的時候那么可以使用 merge 替換。
2) 當應用 Include或者ViewStub標簽從外部導入xml結構時危纫,可以將被導入的 xml 用 merge作為根節(jié)點表示宗挥,這樣當被嵌入父級結構中后可以很好的將它所包含的子集融合到父級結構中乌庶,而不會出現(xiàn)冗余的節(jié)點。
merge
只能作為 xml 布局的根元素契耿。
5瞒大、通過ViewStub
實現(xiàn) View 的延遲加載
23. android:layout_gravity 和 android:gravity 的區(qū)別?
第一個是讓該布局在其父控件中的布局方式搪桂,第二個是該布局布置其子視圖的布局方式透敌。
22. Padding 和 Margin 有什么區(qū)別?
padding內(nèi)填充踢械,margin外邊距
padding 是站在父 view的角度描述問題酗电,它規(guī)定它里面的內(nèi)容必須與這個父 view 邊界的距離。margin則是站在自己的角度描述問題内列,規(guī)定自己和其他(上下左右)的view之間的距離撵术,如果同一級只有一個view,那么它的效果基本上就和 padding 一樣了话瞧。
21. 什么是 ANR 如何避免它嫩与?
在 Android 上,如果你的應用程序有一段時間響應不夠靈敏移稳,系統(tǒng)會向用戶顯示一個對話框蕴纳,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框。用戶可以選擇讓程序繼續(xù)運行个粱,但是古毛,他們在使用你的應用程序時,并不希望每次都要處理這個對話框都许。因此稻薇,在程序里對響應性能的設計很重要,這樣胶征,系統(tǒng)不會顯示ANR 給用戶塞椎。
不同的組件發(fā)生 ANR 的時間不一樣,主線程(Activity睛低、Service)是 5 秒案狠,BroadCastReceiver 是 10 秒。
解決方案:
將所有耗時操作钱雷,比如訪問網(wǎng)絡骂铁,Socket 通信,查詢大量 SQL 語句罩抗,復雜邏輯計算等都放在子線程中去拉庵,然后通過handler.sendMessage、runonUITread套蒂、AsyncTask等方式更新UI钞支。無論如何都要確保用戶界面操作的流暢度茫蛹。如果耗時操作需要讓用戶等待,那么可以在界面上顯示進度條烁挟。
20. Android中的動畫 【2018.1.25更新】
主要有三種動畫:幀動畫婴洼、補間動畫、屬性動畫(3.0增加)信夫。
補間動畫窃蹋,通過在兩個關鍵幀之間補充漸變的動畫效果來實現(xiàn),其優(yōu)點是可以節(jié)省空間
幀動畫静稻,其原理是在“連續(xù)的關鍵幀”中分解動畫動作警没,也就是在時間軸的每幀上逐幀繪制不同的內(nèi)容,使其連續(xù)播放而成動畫振湾。圖片不易過多過大杀迹,不然容易產(chǎn)生OOM。
屬性動畫押搪,改變的是對象的實際屬性树酪,ValueAnimator和ObjectAnimator是屬性動畫的兩個核心類。
19. Android中的常用布局
- Linearlayout 線性布局
- RelativeLayout 相對布局
- FrameLayout 幀布局
- GridLayout 網(wǎng)格布局
- TableLayout 表格布局
- AbsoluteLayout 絕對布局
- ConstraintLayout 約束布局
18. Android中的四大組件
- Activity
- Service
- BroadcastReceiver
- ContentProvider
只有廣播可以不在清單文件中注冊
17. Android 中數(shù)據(jù)存儲方式有哪些大州?
- 文件存儲
- xml续语,SharedPreference
- SQLiteDatabase
- ContentProvider
- 網(wǎng)絡
16. sp 頻繁操作有什么后果?sp 能存多少數(shù)據(jù)厦画?【2018.1.24】
Sp 的底層是由 xml 來實現(xiàn)的疮茄,操作 sp 的過程就是 xml的序列化和解析的過程。Xml 是存儲在磁盤上的根暑,因此考慮到需要 I/O 速度問題力试,sp 不適宜頻繁操作。同時序列化 xml是就是將內(nèi)存中的數(shù)據(jù)寫到 xml 文件中排嫌,由于 dvm 的內(nèi)存是很有限的畸裳,因此單個 sp文件不建議太大,具體多大是沒有一個具體的要求的淳地,但是我們知道 DVM 堆內(nèi)存也就是 16M怖糊,因此數(shù)據(jù)大小肯定不能超過這個數(shù)字的。其實 sp 設置的目的就是為了保存用戶的偏好和配置信息的颇象,因此不要保存太多的數(shù)據(jù)蓬抄。
15. Android 的四大組件都需要在清單文件中注冊嗎?
Activity 夯到、 Service 、 ContentProvider 如 果 要 使 用 則 必 須 在AndroidManifest.xml 中 進 行 注 冊 饮亏, 而BroadcastReceiver 則有兩種注冊方式耍贾,靜態(tài)注冊和動態(tài)注冊阅爽。其中靜態(tài)注冊就是指在 AndroidManifest.xml 中進行注冊,而動態(tài)注冊時通過代碼注冊
14. 一條最長的短信息約占多少 byte?
在國內(nèi)的三大運營商通常情況下中文 70(包括標點)荐开,英文 160 個付翁。對于國外的其他運行商具體多長需要看運營商類型了。
android 內(nèi)部是通過如下代碼進行判斷具體一個短信多少 byte 的晃听。
ArrayList<String> android.telephony.SmsManager.divideMessage(String text)
13. ddms 和 traceview 的區(qū)別
ddms 原意是:davik debug monitor service百侧。簡單的說 ddms是一個程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息能扒,traceView 是程序性能分析器佣渴。traceview 是 ddms 中的一部分內(nèi)容。
12. 請介紹下 adb初斑、ddms辛润、aapt 的作用
adb 是 Android Debug Bridge ,Android 調(diào)試橋的意思,
ddms 是 Dalvik Debug Monitor Service见秤,dalvik 調(diào)試監(jiān)視服務砂竖。
aapt 即 Android Asset Packaging Tool,在SDK的build-tools目錄下鹃答。該工具可以查看乎澄,創(chuàng)建,更新ZIP格式的文檔附件(zip,jar,apk)测摔。也可將資源文件編譯成二進制文件置济,盡管我們沒有直接使用過該工具,但是開發(fā)工具會使用這個工具打包 apk 文件構成一個 Android 應用程序避咆。
Android 的主要調(diào)試工具是 adb(Android debuging bridge)舟肉,ddms是一個在 adb 基礎上的一個圖形化工具。
adb查库,它是一個命令行工具路媚。而 ddms 功能與 adb相同,只是它有一個圖形化界面樊销。對不喜歡命今操作方式的人來說是一個不錯的選擇整慎。
11. 啟動應用后,改變系統(tǒng)語言围苫,應用的語言會改變么裤园?
這個一般是不會的,一般需要重啟應用才能改變應用語言剂府。但是對應應用來說如果做了國際化處理則支持如果沒
有處理那系統(tǒng)語言再更改也是無用的拧揽。
10. dvm 的進程和 Linux 的進程,應用程序的進程是否為同一個概念?【2018.1.23更新】
dvm 指 dalvik 的虛擬機。每一個 Android 應用程序都擁有一個獨立的 Dalvik 虛擬機實例,應用程序都在它自己的進程中運行淤袜。而每一個 dvm 都是在 Linux 中的一個進程痒谴,所以說可以近似認為是同一個概念。
什么是 android DVM:Dalvik 是 Google 公司自己設計用于 Android 平臺的 Java 虛擬機,每一個 Dalvik 應用作為一個獨立的 Linux進程執(zhí)行铡羡。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉积蔚。
Dalvik 和 Java 虛擬機的區(qū)別
1:Dalvik 主要是完成對象生命周期管理,堆棧管理烦周,線程管理尽爆,安全和異常管理,以及垃圾回收等等重要功能读慎。
2:Dalvik 負責進程隔離和線程管理漱贱,每一個 Android 應用在底層都會對應一個獨立的 Dalvik 虛擬機實例,其代碼在虛擬機的解釋下得以執(zhí)行贪壳。
3:不同于 Java 虛擬機運行 java 字節(jié)碼饱亿,Dalvik 虛擬機運行的是其專有的文件格式 Dex
4: dex 文件格式可以減少整體文件尺寸,提高 I/O 操作的類查找速度闰靴。
5: odex 是為了在運行過程中進一步提高性能彪笼,對 dex 文件的進一步優(yōu)化。
6:所有的 Android 應用的線程都對應一個 Linux 線程蚂且,虛擬機因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機制
7:有一個特殊的虛擬機進程 Zygote配猫,他是虛擬機實例的孵化器。它在系統(tǒng)啟動的時候就會產(chǎn)生杏死,它會完成虛擬機的初始化泵肄,庫的加載,預制類庫和初始化的操作淑翼。如果系統(tǒng)需要一個新的虛擬機實例腐巢,它會迅速復制自身,以最快的數(shù)據(jù)提供給系統(tǒng)玄括。對于一些只讀的系統(tǒng)庫冯丙,所有虛擬機實例都和 Zygote共享一塊內(nèi)存區(qū)域。
9. Android 程序與 Java 程序的區(qū)別遭京?
Android 程序用 android sdk 開發(fā),java 程序用 javasdk 開發(fā).
Android SDK 引用了大部分的 Java SDK胃惜,少數(shù)部分被 Android SDK 拋棄
8. 談一談 Android 的安全機制
1、Android 是基于 Linux 內(nèi)核的哪雕,因此 Linux 對文件權限的控制同樣適用于 Android
在 Android 中每個應用都有自己的/data/data/包名 文件夾船殉,該文件夾只能該應用訪問,而其他應用則無權
訪問斯嚎。
2利虫、Android 的權限機制保護了用戶的合法權益
如果我們的代碼想撥打電話挨厚、發(fā)送短信、訪問通信錄列吼、定位幽崩、訪問 sdcard 等所有可能侵犯用于權益的行為都是必須要在AndroidManifest.xml 中進行聲明的,這樣就給了用戶一個知情權寞钥。
3、Android 的代碼混淆保護了開發(fā)者的勞動成果
7. 談談Android的不足和優(yōu)點
優(yōu)點:
1陌选、開放性理郑,開源,免費咨油,可定制
2您炉、掙脫運營商束縛
3、豐富的硬件選擇
4役电、不受任何限制的開發(fā)商
5赚爵、無縫結合的 Google 應用
缺點:
1、安全問題法瑟、隱私問題
2冀膝、同質(zhì)化嚴重
3、運營商對 Android 手機仍然有影響
4霎挟、山寨化嚴重
5窝剖、過分依賴開發(fā)商,缺乏標準配置
6. Android中進程級別酥夭、內(nèi)存不足時回收順序赐纱?【2018.1.22更新】
1. 空進程(Empty Process)
不包含任何活動應用程序組件,這種進程存在的唯一原因是做為緩存以改善組件再次于其中運行時的啟動時間
2. 后臺進程(Background process)
不可見狀態(tài)的activity進程熬北,onstop被調(diào)用
3. 服務進程(Service Process)
由 startService() 方法啟動的服務疙描,一般都在做著用戶所關心的事情,系統(tǒng)會盡量維持它們的運行
4. 可見進程(Visible Process)
activity不在前端顯示讶隐,但也沒有完全隱藏起胰,能夠看得見,比如彈出一個對話框
5. 前臺進程(Foreground Process)
有正在與用戶交互的Activity
5. Android API級別
4. Android工程目錄結構
文件(夾)名 | 用途 |
---|---|
.gradleGradle | 編譯系統(tǒng)整份,版本由wrapper指定 |
.idea | Android Studio IDE所需要的文件 |
build | 代碼編譯后生成的文件存放的位置 |
gradle | wrapper的jar和配置文件所在的位置 |
.gitignore | git使用的ignore文件 |
build.gradle | gradle編譯的相關配置文件(相當于Makefile) |
gradle.properties | gradle相關的全局屬性設置 |
gradlew | *nix下的gradle wrapper可執(zhí)行文件 |
graldew.bat | windows下的gradle wrapper可執(zhí)行文件 |
local.properties | 本地屬性設置(key設置待错,android sdk位置等屬性),這個文件是不推薦上傳到VCS中去的 |
settings.gradle | 和設置相關的gradle腳本 |
Project目錄:
文件(夾)名 | 用途 |
---|---|
.gradleGradle | 編譯系統(tǒng)烈评,版本由wrapper指定 |
.idea | Android Studio IDE所需要的文件 |
build | 代碼編譯后生成的文件存放的位置 |
gradle | wrapper的jar和配置文件所在的位置 |
.gitignore | git使用的ignore文件 |
build.gradle | gradle編譯的相關配置文件(相當于Makefile) |
gradle.properties | gradle相關的全局屬性設置 |
gradlew | *nix下的gradle wrapper可執(zhí)行文件 |
graldew.bat | windows下的gradle wrapper可執(zhí)行文件 |
local.properties | 本地屬性設置(key設置火俄,android sdk位置等屬性),這個文件是不推薦上傳到VCS中去的 |
settings.gradle | 和設置相關的gradle腳本 |
文件(夾)名 | 用途 |
---|---|
build | 編譯后的文件存在的位置(包括最終生成的apk也在這里面) |
libs | 依賴的庫所在的位置(jar和aar) |
src | 源代碼所在的目錄 |
src/main | 主要代碼所在位置(src/androidTest)就是測試代碼所在位置了 |
src/main/assets | android中附帶的一些文件 |
src/main/java | 最最重要的讲冠,我們的java代碼所在的位置 |
src/main/jniLibs | jni的一些動態(tài)庫所在的默認位置(.so文件) |
src/main/res | android資源文件所在位置 |
src/main/AndroidManifest.xml | AndroidManifest不用介紹了吧~ |
build.gradle | 和這個項目有關的gradle配置瓜客,相當于這個項目的Makefile,一些項目的依賴就寫在這里面 |
proguard.pro | 代碼混淆配置文件 |
Module目錄:
文件(夾)名 | 用途 |
---|---|
build | 編譯后的文件存在的位置(包括最終生成的apk也在這里面) |
libs | 依賴的庫所在的位置(jar和aar) |
src | 源代碼所在的目錄 |
src/main | 主要代碼所在位置(src/androidTest)就是測試代碼所在位置了 |
src/main/assets | android中附帶的一些文件 |
src/main/java | 最最重要的,我們的java代碼所在的位置 |
src/main/jniLibs | jni的一些動態(tài)庫所在的默認位置(.so文件) |
src/main/res | android資源文件所在位置 |
src/main/AndroidManifest.xml | AndroidManifest不用介紹了吧~ |
build.gradle | 和這個項目有關的gradle配置谱仪,相當于這個項目的Makefile玻熙,一些項目的依賴就寫在這里面 |
proguard.pro | 代碼混淆配置文件 |
3. Apk打包流程
1、打包資源文件疯攒,生成R.java文件
2嗦随、處理aidl文件,生成相應java 文件
3敬尺、編譯工程源代碼枚尼,生成相應class 文件
4、轉(zhuǎn)換所有class文件砂吞,生成classes.dex文件
5署恍、打包生成apk
6、對apk文件進行簽名
7蜻直、對簽名后的apk文件進行處理
2. DVM 和 JVM 區(qū)別
a) dvm 執(zhí)行的是.dex 文件盯质,而 jvm 執(zhí)行的是.class。Android 工程編譯后的所有.class 字節(jié)碼會被 dex 工具抽取到一個.dex 文件中概而。
b) dvm 是基于寄存器的虛擬機 而 jvm 執(zhí)行是基于虛擬棧的虛擬機呼巷。寄存器存取速度比棧快的多到腥,dvm 可以根據(jù)硬件實現(xiàn)最大的優(yōu)化朵逝,比較適合移動設備。
c) .class 文件存在很多的冗余信息乡范,dex 工具會去除冗余信息配名,并把所有的.class 文件整合到.dex 文件中。減少了 I/O 操作晋辆,提高了類的查找速度渠脉。