android面試題及答案
android面試題及答案
怎樣修改Android.mk文件,下面就由學(xué)習(xí)啦小編為大家介紹一下的android面試題-簡(jiǎn)答題文章,歡迎閱讀。
android面試題-簡(jiǎn)答題篇1
1、在多線(xiàn)程編程這塊,我們經(jīng)常要使用Handler,Thread和Runnable這三個(gè)類(lèi),那么他們之間的關(guān)系你是否弄清楚了呢?
答:Android的CPU分配的最小單元是線(xiàn)程,Handler一般是在某個(gè)線(xiàn)程里創(chuàng)建的,因而Handler和Thread就是相互綁定的,一一對(duì)應(yīng)。而Runnable是一個(gè)接口,Thread是Runnable的子類(lèi)。所以說(shuō),他倆都算一個(gè)進(jìn)程。HandlerThread顧名思義就是可以處理消息循環(huán)的線(xiàn)程,他是一個(gè)擁有Looper的線(xiàn)程,可以處理消息循環(huán)。與其說(shuō)Handler和一個(gè)線(xiàn)程綁定,不如說(shuō)Handler是和Looper一一對(duì)應(yīng)的。最后需要說(shuō)明的是,在UI線(xiàn)程(主線(xiàn)程)中: mHandler=new Handler();
mHandler.post(new Runnable(){
void run(){
//執(zhí)行代碼...}
});
這個(gè)線(xiàn)程其實(shí)是在UI線(xiàn)程之內(nèi)運(yùn)行的,并沒(méi)有新建線(xiàn)程。
常見(jiàn)的新建線(xiàn)程的方法是:
Thread thread = new Thread();
thread.start();
HandlerThread thread = newHandlerThread("string");
thread.start();
2、如何設(shè)定應(yīng)用程序?yàn)橄到y(tǒng)級(jí)別的應(yīng)用?
答:apk 獲取system權(quán)限;如何獲取如下:
第一個(gè)方法簡(jiǎn)單點(diǎn),不過(guò)需要在Android系統(tǒng)源碼的環(huán)境下用make來(lái)編譯:
1. 在應(yīng)用程序的AndroidManifest.xml中的manifest節(jié)點(diǎn)中加入android:sharedUserId="android.uid.system"這個(gè)屬性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
3. 使用mm命令來(lái)編譯,生成的apk就有修改系統(tǒng)時(shí)間的權(quán)限了。
第二個(gè)方法是直接把eclipse編出來(lái)的apk用系統(tǒng)的簽名文件簽名
1. 加入android:sharedUserId="android.uid.system"這個(gè)屬性。
2. 使用eclipse編譯出apk文件。
3. 使用目標(biāo)系統(tǒng)的platform密鑰來(lái)重新給apk文件簽名。首先找到密鑰文件,在我ndroid源碼目錄中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem兩個(gè)文件。然后用Android提供的Signapk工具來(lái)簽名,signapk的源代碼是在"build/tools/signapk"下,編譯后在out/host/Linux-x86/framework下,用法為Java -jarsignapk.jar platform.x509.pem platform.pk8 input.apk output.apk"。
加入android:sharedUserId="android.uid.system"這個(gè)屬性。通過(guò)Shared User id,擁有同一個(gè)User id的多個(gè)APK可以配置成運(yùn)行在同一個(gè)進(jìn)程中。那么把程序的UID配成android.uid.system,也就是要讓程序運(yùn)行在系統(tǒng)進(jìn)程中,這樣就有權(quán)限來(lái)修改系統(tǒng)時(shí)間了。
只是加入U(xiǎn)ID還不夠,如果這時(shí)候安裝APK的話(huà)發(fā)現(xiàn)無(wú)法安裝,提示簽名不符,原因是程序想要運(yùn)行在系統(tǒng)進(jìn)程中還要有目標(biāo)系統(tǒng)的platform key,就是上面第二個(gè)方法提到的platform.pk8和platform.x509.pem兩個(gè)文件。用這兩個(gè)key簽名后apk才真正可以放入系統(tǒng)進(jìn)程中。第一個(gè)方法中加入LOCAL_CERTIFICATE :=platform其實(shí)就是用這兩個(gè)key來(lái)簽名。
這也有一個(gè)問(wèn)題,就是這樣生成的程序只有在原始的Android系統(tǒng)或者是自己編譯的系統(tǒng)中才可以用,因?yàn)檫@樣的系統(tǒng)才可以拿到platform.pk8和platform.x509.pem兩個(gè)文件。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android中的key來(lái)簽名,程序在模擬器上運(yùn)行OK,不過(guò)放到G3上安裝直接提示"Package... has no signatures that match those in shared user android.uid.system",這樣也是保護(hù)了系統(tǒng)的安全。
3、談?wù)凙ndroid的IPC(進(jìn)程間通信)機(jī)制
答:Android系統(tǒng)中,每一個(gè)應(yīng)用程序都是由一些Activity和Service組成的,這些Activity和Service有可能運(yùn)行在同一個(gè)進(jìn)程中,也有可能運(yùn)行在不同的進(jìn)程中,android的IPC機(jī)制也就是Binder機(jī)制,Android系統(tǒng)是基于Linux內(nèi)核的,而Linux內(nèi)核繼承和兼容了豐富的Unix系統(tǒng)進(jìn)程間通信(IPC)機(jī)制, 但是,Android系統(tǒng)沒(méi)有采用上述提到的各種進(jìn)程間通信機(jī)制,而是采用Binder機(jī)制,Binder是一種進(jìn)程間通信機(jī)制,它是一種類(lèi)似于COM和CORBA分布式組件架構(gòu),通俗一點(diǎn),其實(shí)是提供遠(yuǎn)程過(guò)程調(diào)用(RPC)功能。從英文字面上意思看,Binder具有粘結(jié)劑的意思,那么它把什么東西粘結(jié)在一起呢?在Android系統(tǒng)的Binder機(jī)制中,由一系統(tǒng)組件組成,分別是Client、Server、Service Manager和Binder驅(qū)動(dòng)程序,其中Client、Server和Service Manager運(yùn)行在用戶(hù)空間,Binder驅(qū)動(dòng)程序運(yùn)行內(nèi)核空間。Binder就是一種把這四個(gè)組件粘合在一起的粘結(jié)劑了,其中,核心組件便是Binder驅(qū)動(dòng)程序了,Service Manager提供了輔助管理的功能,Client和Server正是在Binder驅(qū)動(dòng)和ServiceManager提供的基礎(chǔ)設(shè)施上,進(jìn)行Client-Server之間的通信;
1. Client、Server和Service Manager實(shí)現(xiàn)在用戶(hù)空間中,Binder驅(qū)動(dòng)程序?qū)崿F(xiàn)在內(nèi)核空間中
2. Binder驅(qū)動(dòng)程序和Service Manager在Android平臺(tái)中已經(jīng)實(shí)現(xiàn),開(kāi)發(fā)者只需要在用戶(hù)空間實(shí)現(xiàn)自己的Client和Server
3.Binder驅(qū)動(dòng)程序提供設(shè)備文件/dev/binder與用戶(hù)空間交互,Client、Server和Service Manager通過(guò)open和ioctl文件操作函數(shù)與Binder驅(qū)動(dòng)程序進(jìn)行通信
4. Client和Server之間的進(jìn)程間通信通過(guò)Binder驅(qū)動(dòng)程序間接實(shí)現(xiàn)
5. Service Manager是一個(gè)守護(hù)進(jìn)程,用來(lái)管理Server,并向Client提供查詢(xún)Server接口的能力
4、apk安裝卸載的原理
答:APK安裝可以通過(guò)以下四種方式:
1. 系統(tǒng)應(yīng)用安裝,開(kāi)機(jī)時(shí)完成系統(tǒng)應(yīng)用的檢查,沒(méi)安裝就安裝,安裝就跳過(guò),無(wú)安裝界面。
2. 網(wǎng)絡(luò)下載應(yīng)用安裝,通過(guò)market應(yīng)用完成,無(wú)安裝界面。
3. ADB工具安裝,無(wú)安裝界面
4. 通過(guò)SD卡來(lái)安裝apk,有安裝界面,由packageinstaller.apk應(yīng)用處理安裝及卸載過(guò)程的界面。
應(yīng)用安裝涉及到如下幾個(gè)目錄:
system/app 系統(tǒng)自帶的應(yīng)用程序,無(wú)法刪除
data/app 用戶(hù)程序安裝的目錄,有刪除權(quán)限
data/data 存放應(yīng)用程序的數(shù)據(jù)
Data/dalvik-cache 將apk中的dex文件安裝到dalvik-cache目錄下
(dex文件是dalvik虛擬機(jī)的可執(zhí)行文件,其大小約為原始apk文件大小的四分之一)
安裝過(guò)程:復(fù)制APK安裝包到data/app目錄下,解壓并掃描安裝包,把dex文件(Dalvik字節(jié)碼)保存到dalvik-cache目錄,并data/data目錄下創(chuàng)建對(duì)應(yīng)的應(yīng)用數(shù)據(jù)目錄。
卸載過(guò)程:刪除安裝過(guò)程中在上述三個(gè)目錄下創(chuàng)建的文件及目錄。
5、如何做適配
1)android有H、L、M、X、XX四個(gè)不同的文件夾存放不同分辨率的圖片,系統(tǒng)會(huì)自動(dòng)加載
2) 偏移量d的設(shè)置可以在values-hpdi,values-mdpi,values-ldpi三種文件夾中的dimens.xml文件進(jìn)行設(shè)置
值得一提的是:
40dp
-14dp
這里的負(fù)數(shù)是完全起作用的,系統(tǒng)會(huì)認(rèn)為它是一個(gè)負(fù)值
3)各大手機(jī)廠(chǎng)商對(duì)于Android操作系統(tǒng)都有或多或少的改動(dòng),當(dāng)然這些改動(dòng)會(huì)對(duì)我們應(yīng)用程序產(chǎn)生某些影響
比如:
(1)系統(tǒng)源代碼中連接music服務(wù)的aidl文件所在包名:com.android.music
(2)LG則可能將該aidl文件修改所在的包(例如修改為 com.android.music.player),并且修改其中的文件內(nèi)容(增加一個(gè)方法,或者減少幾個(gè)方法,或者修改方法名稱(chēng))那么我們的應(yīng)用要想在LG的手機(jī)上發(fā)布,那么我們就必須改變所要連接的aidl文件,必須跟LG廠(chǎng)商修改的完全一致。
android面試題-簡(jiǎn)答題篇2
1、是否進(jìn)行過(guò)apk反編譯,如何防止反編譯
反編譯:
Android反編譯工具
· dex2jar + jdgui
· apktool
防止反編譯:
· 代碼加密
這方式,也只能想想,一旦你自己加密了,Android系統(tǒng)都不認(rèn)識(shí)你了,還怎么運(yùn)行?(如果有那估計(jì)就是eoe現(xiàn)在推的愛(ài)加密吧).
· 代碼混淆
這種方式,其實(shí)我不大愿意將他歸類(lèi)于防止反編譯,從Android、Java編譯原理上來(lái)說(shuō),針對(duì)自身代碼做混淆等操作,必然防止不了反編譯這個(gè)事實(shí)。他能做到的就是將字符,函數(shù)等混淆成各種a,b,c,d,1,2,3等。
這種方式一般稱(chēng)為,
妨礙對(duì)反編譯代碼的閱讀、觀(guān)看和理解
Android中主要是針對(duì) proguard.cfg 的配置來(lái)實(shí)現(xiàn)。
具體的實(shí)現(xiàn)網(wǎng)上針對(duì)這部分的解釋已經(jīng)太多,所以這里不詳細(xì)介紹了。
· 動(dòng)態(tài)加載類(lèi)
這種方式的啟發(fā)是根據(jù)web端來(lái)的。Web端你要防止,那就不發(fā)布唄。
所以我們可以將我們重要的源碼,丟在服務(wù)器上,必要的時(shí)候通過(guò)DexClassLoader類(lèi)去加載重要類(lèi)。來(lái)防止核心代碼被反編譯。
具體可看DexClassLoader示例
· 用NDK開(kāi)發(fā)核心代碼
從上面已經(jīng)能知道,C/C++等編譯型語(yǔ)言的反匯編難度。所以我們可以放心的使用NDK去開(kāi)發(fā),生成SO庫(kù)文件再來(lái)調(diào)用。
PS:部分資源文件若十分珍貴,可以通過(guò) #include直接編譯到庫(kù)里(當(dāng)然內(nèi)存可能就大了),這種方式可以自己考慮。
2、Android的動(dòng)畫(huà)分類(lèi)以及兩種動(dòng)畫(huà)的闡述
Tween動(dòng)畫(huà)
又稱(chēng)“補(bǔ)間動(dòng)畫(huà)”、“中間動(dòng)畫(huà)”,最早接觸Tween類(lèi)是在學(xué)習(xí)Flash時(shí)候,使用ActionScript做動(dòng)畫(huà)的時(shí)候,使用過(guò)類(lèi)Tween。
Tween動(dòng)畫(huà)主要的功能是在繪制動(dòng)畫(huà)前設(shè)置動(dòng)畫(huà)繪制的軌跡,包括時(shí)間, 位置 ,等等。但是Tween動(dòng)畫(huà)的缺點(diǎn)是它只能設(shè)置起始點(diǎn)與結(jié)束點(diǎn)的兩幀,中間過(guò)程全部由系統(tǒng)幫我們完成。所以在幀數(shù)比較多的游戲開(kāi)發(fā)中是不太會(huì)用到它的。
Tween一共提供了4中動(dòng)畫(huà)的效果
Scale:縮放動(dòng)畫(huà)
Rotate:旋轉(zhuǎn)動(dòng)畫(huà)
Translate:移動(dòng)動(dòng)畫(huà)
Alpha::透明漸變動(dòng)畫(huà)
Frame動(dòng)畫(huà)
又稱(chēng)幀動(dòng)畫(huà),主要顯示方式是為動(dòng)畫(huà)的總標(biāo)簽,這里面放著幀動(dòng)畫(huà)標(biāo)簽,也就是說(shuō)若干標(biāo)簽的幀 組合在一起就是幀動(dòng)畫(huà)了。 標(biāo)簽中android:oneshot="false"這是一個(gè)非常重要的屬性,默認(rèn)為false 表示 動(dòng)畫(huà)循環(huán)播放, 如果這里寫(xiě)true 則表示動(dòng)畫(huà)只播發(fā)一次。 標(biāo)簽中記錄著每一幀的信息android:drawable="@drawable/a"表示這一幀用的圖片為"a",下面以此類(lèi)推。 android:duration="100" 表示這一幀持續(xù)100毫秒,可以根據(jù)這個(gè)值來(lái)調(diào)節(jié)動(dòng)畫(huà)播放的速度。
3、AIDL全稱(chēng),如何工作,可處理那些數(shù)據(jù)
答:AIDL的英文全稱(chēng)是Android Interface Define Language
當(dāng)A進(jìn)程要去調(diào)用B進(jìn)程中的service時(shí),并實(shí)現(xiàn)通信,我們通常都是通過(guò)AIDL來(lái)操作的
A工程:
首先我們?cè)趎et.blogjava.mobile.aidlservice包中創(chuàng)建一個(gè)RemoteService.aidl文件,在里面我們自定義一個(gè)接口,含有方法get。ADT插件會(huì)在gen目錄下自動(dòng)生成一個(gè)RemoteService.java文件,該類(lèi)中含有一個(gè)名為RemoteService.stub的內(nèi)部類(lèi),該內(nèi)部類(lèi)中含有aidl文件接口的get方法。
說(shuō)明一:aidl文件的位置不固定,可以任意
然后定義自己的MyService類(lèi),在MyService類(lèi)中自定義一個(gè)內(nèi)部類(lèi)去繼承RemoteService.stub這個(gè)內(nèi)部類(lèi),實(shí)現(xiàn)get方法。在onBind方法中返回這個(gè)內(nèi)部類(lèi)的對(duì)象,系統(tǒng)會(huì)自動(dòng)將這個(gè)對(duì)象封裝成IBinder對(duì)象,傳遞給他的調(diào)用者。
其次需要在AndroidManifest.xml文件中配置MyService類(lèi),代碼如下:
為什么要指定調(diào)用AIDL服務(wù)的ID,就是要告訴外界MyService這個(gè)類(lèi)能夠被別的進(jìn)程訪(fǎng)問(wèn),只要?jiǎng)e的進(jìn)程知道這個(gè)ID,正是有了這個(gè)ID,B工程才能找到A工程實(shí)現(xiàn)通信。
說(shuō)明:AIDL并不需要權(quán)限
B工程:
首先我們要將A工程中生成的RemoteService.java文件拷貝到B工程中,在bindService方法中綁定aidl服務(wù)
綁定AIDL服務(wù)就是將RemoteService的ID作為intent的action參數(shù)。
說(shuō)明:如果我們單獨(dú)將RemoteService.aidl文件放在一個(gè)包里,那個(gè)在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl文件和我們的其他類(lèi)存放在一起,那么我們?cè)贐工程中就要建立相應(yīng)的包,以保證RmoteService.java文件的報(bào)名正確,我們不能修改RemoteService.java文件
bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE);
ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service參數(shù)就是A工程中MyService類(lèi)中繼承了RemoteService.stub類(lèi)的內(nèi)部類(lèi)的對(duì)象。
4、Android系統(tǒng)中GC什么情況下不會(huì)出現(xiàn)內(nèi)存泄露
1. 數(shù)據(jù)庫(kù)的cursor沒(méi)有關(guān)閉
2.構(gòu)造adapter時(shí),沒(méi)有使用緩存contentview
衍生listview的優(yōu)化問(wèn)題-----減少創(chuàng)建view的對(duì)象,充分使用contentview,可以使用一靜態(tài)類(lèi)來(lái)優(yōu)化處理getview的過(guò)程/
3.Bitmap對(duì)象不使用時(shí)采用recycle()釋放內(nèi)存
4.activity中的對(duì)象的生命周期大于activity
調(diào)試方法: DDMS==> HEAPSZIE==>dataobject==>[TotalSize]
5、什么情況會(huì)導(dǎo)致Force Close ?如何避免?能否捕獲導(dǎo)致其的異常?
答:一般像空指針啊,可以看起logcat,然后對(duì)應(yīng)到程序中 來(lái)解決錯(cuò)誤
android面試題-簡(jiǎn)答題篇3
1、activity的4種模式,以及不同模式的作用。activity有四種啟動(dòng)模式,分別為standard,singleTop,singleTask,singleInstance。如果要使用這四種啟動(dòng)模式,必須在manifest文件中標(biāo)簽中的launchMode屬性中配置,如:
android:label="@string/interstitial_label"
android:theme="@style/Theme.Dialog"
android:launchMode="singleTask"
standard
標(biāo)準(zhǔn)啟動(dòng)模式,也是activity的默認(rèn)啟動(dòng)模式。在這種模式下啟動(dòng)的activity可以被多次實(shí)例化,即在同一個(gè)任務(wù)中可以存在多個(gè)activity的實(shí)例,每個(gè)實(shí)例都會(huì)處理一個(gè)Intent對(duì)象。如果Activity A的啟動(dòng)模式為standard,并且A已經(jīng)啟動(dòng),在A中再次啟動(dòng)Activity A,即調(diào)用startActivity(new Intent(this,A.class)),會(huì)在A的上面再次啟動(dòng)一個(gè)A的實(shí)例,即當(dāng)前的桟中的狀態(tài)為A-->A。
singleTop
如果一個(gè)以singleTop模式啟動(dòng)的activity的實(shí)例已經(jīng)存在于任務(wù)桟的桟頂,那么再啟動(dòng)這個(gè)Activity時(shí),不會(huì)創(chuàng)建新的實(shí)例,而是重用位于棧頂?shù)哪莻€(gè)實(shí)例,并且會(huì)調(diào)用該實(shí)例的onNewIntent()方法將Intent對(duì)象傳遞到這個(gè)實(shí)例中。舉例來(lái)說(shuō),如果A的啟動(dòng)模式為singleTop,并且A的一個(gè)實(shí)例已經(jīng)存在于棧頂中,那么再調(diào)用startActivity(new Intent(this,A.class))啟動(dòng)A時(shí),不會(huì)再次創(chuàng)建A的實(shí)例,而是重用原來(lái)的實(shí)例,并且調(diào)用原來(lái)實(shí)例的onNewIntent()方法。這是任務(wù)桟中還是這有一個(gè)A的實(shí)例。
如果以singleTop模式啟動(dòng)的activity的一個(gè)實(shí)例已經(jīng)存在與任務(wù)桟中,但是不在桟頂,那么它的行為和standard模式相同,也會(huì)創(chuàng)建多個(gè)實(shí)例。
singleTask
谷歌的官方文檔上稱(chēng),如果一個(gè)activity的啟動(dòng)模式為singleTask,那么系統(tǒng)總會(huì)在一個(gè)新任務(wù)的最底部(root)啟動(dòng)這個(gè)activity,并且被這個(gè)activity啟動(dòng)的其他activity會(huì)和該activity同時(shí)存在于這個(gè)新任務(wù)中。如果系統(tǒng)中已經(jīng)存在這樣的一個(gè)activity則會(huì)重用這個(gè)實(shí)例,并且調(diào)用他的onNewIntent()方法。即,這樣的一個(gè)activity在系統(tǒng)中只會(huì)存在一個(gè)實(shí)例。
其實(shí)官方文檔中的這種說(shuō)法并不準(zhǔn)確,啟動(dòng)模式為singleTask的activity并不會(huì)總是開(kāi)啟一個(gè)新的任務(wù)。詳情請(qǐng)參考 解開(kāi)Android應(yīng)用程序組件Activity的"singleTask"之謎,在本文后面也會(huì)通過(guò)示例來(lái)進(jìn)行驗(yàn)證。
singleInstance
總是在新的任務(wù)中開(kāi)啟,并且這個(gè)新的任務(wù)中有且只有這一個(gè)實(shí)例,也就是說(shuō)被該實(shí)例啟動(dòng)的其他activity會(huì)自動(dòng)運(yùn)行于另一個(gè)任務(wù)中。當(dāng)再次啟動(dòng)該activity的實(shí)例時(shí),會(huì)重用已存在的任務(wù)和實(shí)例。并且會(huì)調(diào)用這個(gè)實(shí)例的onNewIntent()方法,將Intent實(shí)例傳遞到該實(shí)例中。和singleTask相同,同一時(shí)刻在系統(tǒng)中只會(huì)存在一個(gè)這樣的Activity實(shí)例。
2、NDK是什么
NDK:NativeDevelopment Kit
AndroidNDK是一個(gè)讓開(kāi)發(fā)人員在Android應(yīng)用中嵌入使用本地代碼編寫(xiě)的組件的工具集。
Android應(yīng)用運(yùn)行在Dalvik虛擬機(jī)中。NDK允許開(kāi)發(fā)人員使用本地代碼語(yǔ)言(例如C和C++)實(shí)現(xiàn)應(yīng)用的部分功能。這樣以代碼重用的形式能夠給某類(lèi)應(yīng)用提供方便,而且在某些情況下能提高運(yùn)行速度(感謝老婆的幫助)。
3、請(qǐng)解釋下Android程序運(yùn)行時(shí)權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別
答:運(yùn)行時(shí)權(quán)限D(zhuǎn)alvik( android授權(quán))
文件系統(tǒng) linux 內(nèi)核授權(quán)
4、橫豎屏切換時(shí)候activity的生命周期?
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
5、如何設(shè)定Android應(yīng)用為系統(tǒng)應(yīng)用
1 將自己的應(yīng)用方到android源代碼的packages/apps/目錄下,添加Android.mk文件
2 在應(yīng)用程序的AndroidManifest.xml中的manifest節(jié)點(diǎn)中加入android:sharedUserId="android.uid.system"這個(gè)屬性。
3 修改Android.mk文件,加入LOCAL_CERTIFICATE:= platform這一行
4 使用mm命令來(lái)編譯,生成的apk就有同system一樣的權(quán)限了。
5 在android根目錄下用make snod重新生成system.img
6 啟動(dòng)emulator運(yùn)行下應(yīng)用看看是否好了。
6、如何將SQLite數(shù)據(jù)庫(kù)(dictionary.db文件)與apk文件一起發(fā)布?
可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會(huì)被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件復(fù)制到res aw目錄中
7.如何將打開(kāi)res aw目錄中的數(shù)據(jù)庫(kù)文件?
解答:在Android中不能直接打開(kāi)resaw目錄中的數(shù)據(jù)庫(kù)文件,而需要在程序第一次啟動(dòng)時(shí)將該文件復(fù)制到手機(jī)內(nèi)存或SD卡的某個(gè)目錄中,然后再打開(kāi)該數(shù)據(jù)庫(kù)文件。復(fù)制的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對(duì)象,然后將該InputStream對(duì)象中的數(shù)據(jù)寫(xiě)入其他的目錄中相應(yīng)文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來(lái)打開(kāi)任意目錄中的SQLite數(shù)據(jù)庫(kù)文件。
8、線(xiàn)程中wait和sleep的區(qū)別
答:wait釋放線(xiàn)程鎖,sleep不是線(xiàn)程鎖,wait不占用系統(tǒng)資源sleep占用資源
9、兩種方法注冊(cè)broadcaseReceiver,及區(qū)別。
答:動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)一個(gè)BroadcastReceiver的區(qū)別:
動(dòng)態(tài)注冊(cè)較靜態(tài)注冊(cè)靈活。實(shí)驗(yàn)證明:當(dāng)靜態(tài)注冊(cè)一個(gè)BroadcastReceiver時(shí),不論應(yīng)用程序是啟動(dòng)與否。都可以接受對(duì)應(yīng)的廣播。
動(dòng)態(tài)注冊(cè)的時(shí)候,如果不執(zhí)行unregisterReceiver();方法取消注冊(cè),跟靜態(tài)是一樣的。但是如果執(zhí)行該方法,當(dāng)執(zhí)行過(guò)以后,就不能接受廣播了。
10、在android中,請(qǐng)簡(jiǎn)述jni的調(diào)用過(guò)程。
1)安裝和下載Cygwin,下載 Android NDK
2)在ndk項(xiàng)目中JNI接口的設(shè)計(jì)
3)使用C/C++實(shí)現(xiàn)本地方法
4)JNI生成動(dòng)態(tài)鏈接庫(kù).so文件
5)將動(dòng)態(tài)鏈接庫(kù)復(fù)制到j(luò)ava工程,在java工程中調(diào)用,運(yùn)行java工程即可