用NFS作為rootfs來(lái)啟動(dòng)內(nèi)核在開(kāi)發(fā)中的必備的,用nfs啟動(dòng)android,也就免去頻繁的對(duì)nand燒寫(xiě)操作。網(wǎng)上有很多文章,可惜都是互相copy,參考性不強(qiáng)。下面來(lái)說(shuō)明如何用NFS來(lái)啟動(dòng)android,具體的操作就不細(xì)說(shuō)了。通常的嵌入式linux使用NFS啟動(dòng),需要啟動(dòng)NFS的文件系統(tǒng)和相關(guān)網(wǎng)絡(luò)支持,這是第一步,至少內(nèi)核在最后階段能mount到FS,而mount之前網(wǎng)絡(luò)協(xié)議也必須是支持的。
創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),梅江網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:梅江等地區(qū)。梅江做網(wǎng)站價(jià)格咨詢:028-86922220
內(nèi)核啟用NFS文件系統(tǒng)支持,網(wǎng)絡(luò)里面支持IP_PNP下的BOOTP,DHCP,RARP
android內(nèi)核在最后階段,是執(zhí)行RAMDISK中的init進(jìn)程來(lái)remount分區(qū),system和data也是在這個(gè)時(shí)候才掛載上的。使用NFS啟動(dòng)時(shí),要關(guān)閉內(nèi)核中的ramdisk功能。這樣,內(nèi)核啟動(dòng)后,mount到NFS的目錄,然后直接執(zhí)行NFS目錄下的init進(jìn)程
準(zhǔn)備android的文件系統(tǒng)。編譯aosp代碼,最終生成system, data, root目錄,分別copy到NFS目錄下,配置NFS允許網(wǎng)絡(luò)訪問(wèn)該目錄。在nfsroot目錄下,需要修改init.rc文件。里面會(huì)對(duì)system重新掛載,可以注釋掉該內(nèi)容,修改如下:
#on fs
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to save a checkpoint
#mount yaffs2 mtd@system /system
#mount yaffs2 mtd@system /system ro remount
#mount yaffs2 mtd@userdata /data nosuid nodev
#mount yaffs2 mtd@cache /cache nosuid nodev
on post-fs
# once everything is setup, no need to modify /
mount rootfs rootfs / rw remount
這里,關(guān)閉也on fs的action操作,記得把on fs也注釋掉
因?yàn)樾枨笥凶鲩_(kāi)機(jī)引導(dǎo),所以簡(jiǎn)單的學(xué)習(xí)下這塊功能的流程,并簡(jiǎn)單的做個(gè)總結(jié)
主要參考文章:
做開(kāi)機(jī)引導(dǎo),主要要做到的效果就是 只有第一次使用的時(shí)候會(huì)打開(kāi),只打開(kāi)一次,當(dāng)執(zhí)行完開(kāi)機(jī)引導(dǎo)的流程之后,之后開(kāi)機(jī)都不會(huì)再展示
要實(shí)現(xiàn)開(kāi)機(jī)引導(dǎo),那么就一定是系統(tǒng)應(yīng)用,按照原理來(lái)說(shuō),需要兩個(gè)步驟,第一,需要引導(dǎo)頁(yè)的優(yōu)先級(jí)比LAUNCHER高。第二,需要流程完畢之后執(zhí)行某些操作讓?xiě)?yīng)用下次不會(huì)啟動(dòng)。
可以設(shè)置android:priority屬性,系統(tǒng)會(huì)判斷啟動(dòng)priority優(yōu)先級(jí)高的。
這樣配置之后,其它應(yīng)用的優(yōu)先級(jí)如果沒(méi)有設(shè)置的話默認(rèn)就是0,這樣就會(huì)優(yōu)先打開(kāi)引導(dǎo)頁(yè)。
自己可以在引導(dǎo)頁(yè)中寫(xiě)自己想要做的邏輯。當(dāng)執(zhí)行完所有邏輯之后,需要配置
這里主要做了設(shè)置Settings.Global.DEVICE_PROVISIONED和Settings.Secure.USER_SETUP_COMPLETE兩個(gè)參數(shù),還有PackageManager.setComponentEnabledSetting方法禁用組件
第一個(gè)參數(shù)是組件名
第二個(gè)參數(shù)是狀態(tài)
不可用狀態(tài):COMPONENT_ENABLED_STATE_DISABLED
可用狀態(tài):COMPONENT_ENABLED_STATE_ENABLED
默認(rèn)狀態(tài):COMPONENT_ENABLED_STATE_DEFAULT
第三個(gè)參數(shù)flags
DONT_KILL_APP或者0,0表示殺死包含該組件的app
運(yùn)行時(shí)會(huì)發(fā)現(xiàn)設(shè)置priority優(yōu)先級(jí)比LAUNCHER高,在開(kāi)機(jī)之后也會(huì)提示讓你選擇打開(kāi)應(yīng)用,而不是默認(rèn)打開(kāi)優(yōu)先級(jí)高的,關(guān)于這個(gè)問(wèn)題,可以參考這篇文章
只需要把應(yīng)用安裝到system/priv-app中,就能解決這個(gè)問(wèn)題。正常來(lái)說(shuō)一般系統(tǒng)應(yīng)用也是安裝在這么文件夾中,只是平時(shí)調(diào)試的時(shí)候會(huì)為了方便直接run,所以可能出現(xiàn)這個(gè)問(wèn)題。
將應(yīng)用安裝到該文件夾中可以使用這個(gè)命令,然后重啟
看了很多文章,都沒(méi)有講到為什么要設(shè)置這兩屬性,因?yàn)橐_(dá)成目的,我們只需要設(shè)置priority和調(diào)用setComponentEnabledSetting方法就行,為什么要設(shè)置這兩個(gè)參數(shù)?不設(shè)置會(huì)有什么影響。
其實(shí)簡(jiǎn)單來(lái)說(shuō),系統(tǒng)在其他地方有用到這兩個(gè)參數(shù),舉個(gè)簡(jiǎn)單的例子,我直接
去運(yùn)行程序,能夠很明顯的測(cè)出這種情況下按Home鍵沒(méi)反應(yīng),除此之外屏保也會(huì)不顯示。
所以這兩個(gè)參數(shù)還是需要在這個(gè)地方設(shè)為1的。
不知道樓主要做什么效果,如果只為判斷何時(shí)顯示的話,在引導(dǎo)頁(yè)定義一個(gè)/**
* 進(jìn)入下一頁(yè)
*/
private void goNextPage() {
// 是否是第一次加載
String isFirestLoad = Util.getSharePersistent(
activity.getApplicationContext(), FIREST_LOAD);
if (isFirestLoad != null isFirestLoad.equals("true")) {
Intent intent = new Intent();
intent.setClass(this, welcome.class);
startActivityForResult(intent, 0);
}
}
在oncreat中判斷goNextPage();
/**
* 關(guān)閉引導(dǎo)頁(yè)的操作
*/
close = (ImageButton) findViewById(R.id.close);
close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Util.saveSharePersistent(activity.getApplicationContext(),
FIREST_LOAD, "true");
goNextPage();
}
1、第一階段:加在首頁(yè)的PopupWindow上面
private void addFeatureGuide() {
LayoutInflater layoutInflater = LayoutInflater.from(this);
LinearLayout popContentView = (LinearLayout) layoutInflater.inflate(R.layout.popup, null);
PopupWindow popupWindow = new PopupWindow(popContentView, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
popupWindow.showAtLocation(this.findViewById(R.id.main_root), Gravity.CENTER, 0, 0);
}
在onResume的時(shí)候調(diào)用addFeatureGuide()方法。
這樣應(yīng)該OK了吧?不!Run的時(shí)候報(bào)錯(cuò)了:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {com.example/com.example.MyActivity}: android.view.WindowManager$BadTokenException: Unable to add window — token null is not valid; is your activity running?
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
Android 手機(jī)在刷了 Gapps 之后,在開(kāi)機(jī)進(jìn)入系統(tǒng)時(shí)會(huì)進(jìn)入 Gapps 的開(kāi)機(jī)引導(dǎo)(也就是設(shè)置 Google 帳號(hào)神馬的)。但是這需要連 Google 進(jìn)行驗(yàn)證,于是。。。。。。。。
對(duì)于這種情況,可以通過(guò)以下方法解決:
這個(gè)方法就不多說(shuō)了,只要能連上 Google ,就不會(huì)卡在這里了。至于怎么連 Google ,請(qǐng)自行尋找科學(xué)上網(wǎng)。
這個(gè)Gapps的開(kāi)機(jī)引導(dǎo)是需要連網(wǎng)進(jìn)行的,默認(rèn)的情況下如果不連網(wǎng)的情況下是會(huì)自動(dòng)跳過(guò)的。但是許多系統(tǒng)在默認(rèn)情況下 Wifi 和數(shù)據(jù)是會(huì)自動(dòng)打開(kāi),就算把卡取了,也還會(huì)有 Wifi ,一樣無(wú)法跳過(guò)。對(duì)此,可選擇先不刷 Gapps ,進(jìn)入系統(tǒng)后將 Wifi 的數(shù)據(jù)關(guān)閉,再刷 Gapps ,此方法有一定弊端,有可能會(huì)導(dǎo)致 Gapps 某些應(yīng)用發(fā)生某些玄學(xué)問(wèn)題。。。。。
在設(shè)置時(shí),可點(diǎn)擊 復(fù)制數(shù)據(jù) ,而后拉到最底,點(diǎn)擊 離線設(shè)置 后再進(jìn)行一些設(shè)置就可進(jìn)入系統(tǒng)。(但同樣玄學(xué)的是,有時(shí)在 復(fù)制數(shù)據(jù) 里,并沒(méi)有離線設(shè)置或使用本地設(shè)置這一選項(xiàng)╮( ̄▽?zhuān)?╭)
這可能是最玄學(xué)的一個(gè)方法了,據(jù)傳連點(diǎn)屏幕四角就可跳過(guò)此引導(dǎo)( 順時(shí)針 方向,從左上角開(kāi)始)。但是?。?!但是?。?!這是檢驗(yàn)血統(tǒng)的時(shí)刻,時(shí)靈時(shí)不靈。別問(wèn)我是怎么知道的。 (╯‵□′)╯︵┻━┻
敲黑板?。?! 這是我所試過(guò)最科學(xué)的方法。在開(kāi)機(jī)情況下,將手機(jī)連上電腦,使用 adb 工具來(lái)修改 USER_SETUP_COMPLETE 和 DEVICE_PROVISIONED 的值。具體操作如下:
最后附上測(cè)試環(huán)境:
PC: Windwos 10
Android: LineageOS 15.0 for Xiaomi Mi 5
Gapps: open_gapps-arm64-8.0-aroma-20171021
adb: 1.0.39
當(dāng)前名稱:android引導(dǎo),安卓設(shè)置向?qū)?/a>
分享鏈接:http://aaarwkj.com/article48/dssjghp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、電子商務(wù)、云服務(wù)器、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)