當前位置:首頁 » 安卓系統 » androidlunch

androidlunch

發布時間: 2022-09-02 12:53:14

⑴ android源碼編譯,lunch時出錯

重新 repo sync

⑵ android編譯源碼後怎樣運行

編譯:
1. 初始化:
source build/envsetup.sh
2. 選擇target
lunch
然後選擇aosp_arm

3.
make -j4

等待大概2個小時,就可以順利編譯完成。

模擬器運行
直接運行emulator,會出現如下錯誤:

emulator: ERROR: You did not specify a virtual device name, and the system

directory could not be found.

原因是文件路徑沒有設置,解決辦法添加絕對路徑:

out/host/linux-x86/bin/emulator -kernel prebuilts/qemu-kernel/arm/kernel-qemu -sysdir out/target/proct/generic/ -system out/target/proct/generic/system.img -ramdisk out/target/proct/generic/ramdisk.img -data out/target/proct/generic/userdata.img -sdcard sdcard.img -scale 0.7 -memory 512 -partition-size 1024

然後運行模擬器

⑶ 編譯a20 lunch後面應該選擇哪個

Android的優勢就在於其開源,手機和平板生產商可以根據自己的硬體進行個性定製自己的手機產品,
如小米,LePhone,M9等,因此,在我們在對Android的源碼進行定製的時候,很有必要了解下,Android的編譯過程。
如果你從來沒有做過Android代碼的編譯,那麼最官方的編譯過程就是查看Android的官方網站:
http://source.android.com/source/building.html
但是,這兒只是告訴你了如何去編譯一個通用的系統,並沒有詳細告訴你細節,我們跟著編譯過程來了解下

+-------------------------------------------------------------------------------------------------------------+
本文使用Android版本為2.1,採用開發板為華清遠見研發的FS_S5PC100 A8開發板。
+-------------------------------------------------------------------------------------------------------------+

按照google給出的編譯步驟如下:

1> source build/envsetup.sh:載入命令
2> lunch:選擇平台編譯選項
3> make:執行編譯

我們按照編譯步驟來分析編譯過程的細節,最終添加自己的平台編譯選項。

1. source build/envsetup.sh
這個命令是用來將envsetup.sh里的所有用到的命令載入到環境變數里去,我們來分析下它。

envsetup.sh里的主要命令如下:

function help() # 顯示幫助信息
function get_abs_build_var()# 獲取絕對變數
function get_build_var()# 獲取絕對變數
function check_proct()# 檢查proct
function check_variant()# 檢查變數
function setpaths() # 設置文件路徑
function printconfig()# 列印配置
function set_stuff_for_environment() # 設置環境變數
function set_sequence_number() # 設置序號
function settitle() # 設置標題
function choosetype() # 設置type
function chooseproct() # 設置proct
function choosevariant() # 設置variant
function tapas() # 功能同choosecombo
function choosecombo() # 設置編譯參數
function add_lunch_combo() # 添加lunch項目
function print_lunch_menu() # 列印lunch列表
function lunch()# 配置lunch
function m()# make from top
function findmakefile() # 查找makefile
function mm() # make from current directory
function mmm() # make the supplied directories
function croot()# 回到根目錄
function cproj()
function pid()
function systemstack()
function gdbclient()
function jgrep()# 查找java文件
function cgrep() # 查找c/cpp文件
function resgrep()
function tracedmmp()
function runhat()
function getbugreports()
function startviewserver()
function stopviewserver()
function isviewserverstarted()
function smoketest()
function runtest()
function godir () # 跳到指定目錄 405

# add_lunch_combo函數被多次調用,就是它來添加Android編譯選項
# Clear this variable. It will be built up again when the vendorsetup.sh
406 # files are included at the end of this file.
# 清空LUNCH_MENU_CHOICES變數,用來存在編譯選項
407 unset LUNCH_MENU_CHOICES
408 function add_lunch_combo()
409 {
410 local new_combo=$1 # 獲得add_lunch_combo被調用時的參數
411 local c # 依次遍歷LUNCH_MENU_CHOICES里的值,其實該函數第一次調用時,該值為空
412 for c in ${LUNCH_MENU_CHOICES[@]} ; do
413 if [ "$new_combo" = "$c" ] ; then # 如果參數里的值已經存在於LUNCH_MENU_CHOICES變數里,則返回
414 return
415 fi
416 done # 如果參數的值不存在,則添加到LUNCH_MENU_CHOICES變數里
417 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
418 }

# 這是系統自動增加了一個默認的編譯項 generic-eng
420 # add the default one here
421 add_lunch_combo generic-eng # 調用上面的add_lunch_combo函數,將generic-eng作為參數傳遞過去
422
423 # if we're on linux, add the simulator. There is a special case
424 # in lunch to deal with the simulator
425 if [ "$(uname)" = "Linux" ] ; then
426 add_lunch_combo simulator
427 fi

# 下面的代碼很重要,它要從vendor目錄下查找vendorsetup.sh文件,如果查到了,就載入它
1037 # Execute the contents of any vendorsetup.sh files we can find.
1038 for f in `/bin/ls vendorbuild/vendorsetup.sh 2> /dev/null`
1039 do
1040 echo "including $f"
1041 . $f # 執行找到的腳本,其實裡面就是廠商自己定義的編譯選項
1042 done
1043 unset f

envsetup.sh其主要作用如下:

1. 載入了編譯時使用到的函數命令,如:help,lunch,m,mm,mmm等
2. 添加了兩個編譯選項:generic-eng和simulator,這兩個選項是系統默認選項
3. 查找vendor/<-廠商目錄>/和vendor/<廠商目錄>/build/目錄下的vendorsetup.sh,如果存在的話,載入執行它,添加廠商自己定義產品的編譯選項


其實,上述第3條是向編譯系統添加了廠商自己定義產品的編譯選項,裡面的代碼就是:add_lunch_combo xxx-xxx。

根據上面的內容,可以推測出,如果要想定義自己的產品編譯項,簡單的辦法是直接在envsetup.sh最後,

添加上add_lunch_combo myProct-eng,當然這么做,不太符合上面代碼最後的本意,
我們還是老實的在vendor目錄下創建自己公司名字,然後在公司目錄下創建一個新的vendorsetup.sh,在裡面添加上自己的產品編譯項

#mkdir vendor/farsight/
#touch vendor/farsight/vendorsetup.sh
#echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh

這樣,當我們在執行source build/envsetup.sh命令的時候,可以在shell上看到下面的信息:
including vendor/farsight/vendorsetup.sh

2. 按照android官網的步驟,開始執行lunch full-eng

當然如果你按上述命令執行,它編譯的還是通用的eng版本系統,不是我們個性系統,我們可以執行lunch命令,它會列印出一個選擇菜單,列出可用的編譯選項
如果你按照第一步中添加了vendorsetup.sh那麼,你的選項中會出現:

You're building on Linux

generic-eng simulator fs100-eng
Lunch menu... pick a combo:
1. generic-eng
2. simulator
3. fs100-eng

其中第3項是我們自己添加的編譯項。

lunch命令是envsetup.sh里定義的一個命令,用來讓用戶選擇編譯項,來定義Proct和編譯過程中用到的全局變數。

我們一直沒有說明前面的fs100-eng是什麼意思,現在來說明下,fs100是我定義的產品的名字,eng是產品的編譯類型,除了eng外,還有user, userdebug,分別表示:

eng: 工程機,
user:最終用戶機
userdebug:調試測試機
tests:測試機

由此可見,除了eng和user外,另外兩個一般不能交給最終用戶的,記得m8出來的時候,先放出了一部分eng工程機,然後出來了user機之後,可以用工程機換。

那麼這四個類型是干什麼用的呢?其實,在main.mk里有說明,在Android的源碼里,每一個目標(也可以看成工程)目錄都有一個Android.mk的makefile,每個目標的Android.mk中有一個類型聲明:

LOCAL_MODULE_TAGS,這個TAGS就是用來指定,當前的目標編譯完了屬於哪個分類里。

PS:Android.mk和Linux里的makefile不太一樣,它是Android編譯系統自己定義的一個makefile來方便編譯成:c,c++的動態、靜態庫或可執行程序,或java庫或android的程序,好了,我們來分析下lunch命令幹了什麼?

function lunch()
{
local answer

if [ "$1" ] ; then
# lunch後面直接帶參數
answer=$1
else
# lunch後面不帶參數,則列印處所有的target proct和variant菜單提供用戶選擇
print_lunch_menu
echo -n "Which would you like? [generic-eng] "
read answer
fi

local selection=

if [ -z "$answer" ]
then
# 如果用戶在菜單中沒有選擇,直接回車,則為系統預設的generic-eng
selection=generic-eng
elif [ "$answer" = "simulator" ]
then
# 如果是模擬器
selection=simulator
elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
then
# 如果answer是選擇菜單的數字,則獲取該數字對應的字元串
if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
then
selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
fi
# 如果 answer字元串匹配 *-*模式(*的開頭不能為-)
elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
then
selection=$answer
fi

if [ -z "$selection" ]
then
echo
echo "Invalid lunch combo: $answer"
return 1
fi

# special case the simulator
if [ "$selection" = "simulator" ]
then
# 模擬器模式
export TARGET_PRODUCT=sim
export TARGET_BUILD_VARIANT=eng
export TARGET_SIMULATOR=true
export TARGET_BUILD_TYPE=debug
else

# 將 proct-variant模式中的proct分離出來
local proct=$(echo -n $selection | sed -e "s/-.*$//")

# 檢查之,調用關系 check_proct()->get_build_var()->build/core/config.mk比較羅嗦,不展開了
check_proct $proct
if [ $? -ne 0 ]
then
echo
echo "** Don't have a proct spec for: '$proct'"
echo "** Do you have the right repo manifest?"
proct=
fi

# 將 proct-variant模式中的variant分離出來
local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")

# 檢查之,看看是否在 (user userdebug eng) 范圍內
check_variant $variant
if [ $? -ne 0 ]
then
echo
echo "** Invalid variant: '$variant'"
echo "** Must be one of ${VARIANT_CHOICES[@]}"
variant=
fi

if [ -z "$proct" -o -z "$variant" ]
then
echo
return 1
fi
# 導出環境變數,這里很重要,因為後面的編譯系統都是依賴於這里定義的幾個變數的
export TARGET_PRODUCT=$proct
export TARGET_BUILD_VARIANT=$variant
export TARGET_SIMULATOR=false
export TARGET_BUILD_TYPE=release
fi # !simulator

echo

# 設置到環境變數,比較多,不再一一列出,最簡單的方法 set >env.txt 可獲得
set_stuff_for_environment
# 列印一些主要的變數, 調用關系 printconfig()->get_build_var()->build/core/config.mk-

>build/core/envsetup.mk 比較羅嗦,不展開了
printconfig
}

由上面分析可知,lunch命令可以帶參數和不帶參數,最終導出一些重要的環境變數,從而影響編譯系統的編譯結果。導出的變數如下(以實際運行情況為例)

TARGET_PRODUCT=fs100
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false

TARGET_BUILD_TYPE=release
執行完上述兩個步驟,就該執行:make命令了

⑷ Android中的Activity詳解--啟動模式與任務棧

目錄

activity的簡單介紹就不寫了,作為最常用的四大組件之一,肯定都很熟悉其基本用法了。

首先,是都很熟悉的一張圖,即官方介紹的Activity生命周期圖.

情景:打開某個應用的的FirstActivity調用方法如下:
由於之前已經很熟悉了,這里就簡單貼一些圖。

按下返回鍵:

重新打開並按下home鍵:

再重新打開:

在其中打開一個DialogActivity(SecondActivity)

按下返回:

修改SecondAcitvity為普通Activity,依舊是上述操作:

這里強調一下 onSaveInstanceState(Bundle outState) 方法的調用時機:
當Activity有可能被系統殺掉時調用,注意,一定是被系統殺掉,自己調用finish是不行的。
測試如下:FirstActivity啟動SecondActivity:

一個App會包含很多個Activity,多個Activity之間通過intent進行跳轉,那麼原始的Activity就是使用棧這個數據結構來保存的。
Task
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.
即若干個Activity的集合的棧表示一個Task。
當App啟動時如果不存在當前App的任務棧就會自動創建一個,默認情況下一個App中的所有Activity都是放在一個Task中的,但是如果指定了特殊的啟動模式,那麼就會出現同一個App的Activity出現在不同的任務棧中的情況,即會有任務棧中包含來自於不同App的Activity。

標准模式,在不指定啟動模式的情況下都是以此種方式啟動的。每次啟動都會創建一個新的Activity實例,覆蓋在原有的Activity上,原有的Activity入棧。
測試如下:在FirstActivity中啟動FirstActivity:

當只有一個FirstActivity時堆棧情況:

此種模式下,Activity在啟動時會進行判斷,如果當前的App的棧頂的Activity即正在活動的Activity就是將要啟動的Activity,那麼就不會創建新的實例,直接使用棧頂的實例。
測試,設置FirstActivity為此啟動模式,多次點擊FirstActivity中的啟動FirstActivity的按鈕查看堆棧情況:
(其實點擊按鈕沒有啟動新Activity的動畫就可以看出並沒有啟動新Activity)

大意就是:
對於使用singleTop啟動或Intent.FLAG_ACTIVITY_SINGLE_TOP啟動的Activity,當該Activity被重復啟動(注意一定是re-launched,第一次啟動時不會調用)時就會調用此方法。
且調用此方法之前會先暫停Activity也就是先調用onPause方法。
而且,即使是在新的調用產生後此方法被調用,但是通過getIntent方法獲取到的依舊是以前的Intent,可以通過setIntent方法設置新的Intent。
方法參數就是新傳遞的Intent.

1.如果是同一個App中啟動某個設置了此模式的Activity的話,如果棧中已經存在該Activity的實例,那麼就會將該Activity上面的Activity清空,並將此實例放在棧頂。
測試:SecondActivity啟動模式設為singleTask,啟動三個Activity:

這個模式就很好記,以此模式啟動的Activity會存放在一個單獨的任務棧中,且只會有一個實例。
測試:SecondActivity啟動模式設為singleInstance

結果:

顯然,啟動了兩次ThirdActivity任務棧中就有兩個實例,而SecondActivity在另外一個任務棧中,且只有一個。

在使用Intent啟動一個Activity時可以設置啟動該Activity的啟動模式:
這個屬性有很多,大致列出幾個:

每個啟動的Activity都在一個新的任務棧中

singleTop

singleTask

用此種方式啟動的Activity,在它啟動了其他Activity後,會自動finish.

官方文檔介紹如下:

這樣看來的話,通俗易懂的講,就是給每一個任務棧起個名,給每個Activity也起個名,在Activity以singleTask模式啟動時,就檢查有沒有跟此Activity的名相同的任務棧,有的話就將其加入其中。沒有的話就按照這個Activity的名創建一個任務棧。
測試:在App1中設置SecondActivity的taskAffinity為「gsq.test」,App2中的ActivityX的taskAffinity也設為「gsq.test」

任務棧信息如下:

結果很顯然了。
測試:在上述基礎上,在ActivityX中進行跳轉到ActivityY,ActivityY不指定啟動模式和taskAffinity。結果如下:

這樣就沒問題了,ActivityY在一個新的任務棧中,名稱為包名。
這時從ActivityY跳轉到SecondActivity,那應該是gsq.test任務棧只有SecondActivity,ActivityX已經沒有了。因為其啟動模式是singleTask,在啟動它時發現已經有一個實例存在,就把它所在的任務棧上面的Activity都清空了並將其置於棧頂。

還有一點需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由於SecondActivity並沒有指定MAIN和LAUNCHER過濾器,故在FirstActivity跳轉到SecondActivity時,按下home鍵,再點開App1,回到的是FirstActivity。

大致就先寫這么多吧,好像有點長,廢話有點多,估計也有錯別字,不要太在意~~~

⑸ 如何通過lunch選擇驅動編譯

先把的列印機的所有連線都練接到電腦上,然後開啟驅動精靈,他會自動搜索哪些硬體沒有驅動,讓後辨別,下載,安裝! 很簡單的

⑹ 自己可以編譯安卓源碼嗎

用最新的Ubuntu 16.04,請首先確保自己已經安裝了Git.沒安裝的同學可以通過以下命令進行安裝:

sudo apt-get install git git config –global user.email 「[email protected]」 git config –global user.name 「test」

其中[email protected]為你自己的郵箱.

簡要說明

android源碼編譯的四個流程:1.源碼下載;2.構建編譯環境;3.編譯源碼;4運行.下文也將按照該流程講述.

源碼下載

由於某牆的原因,這里我們採用國內的鏡像源進行下載.
目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學鏡像進行說明.(參考:科大源,清華源)

repo工具下載及安裝

通過執行以下命令實現repo工具的下載和安裝

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

補充說明
這里,我來簡單的介紹下repo工具,我們知道AOSP項目由不同的子項目組成,為了方便進行管理,Google採用Git對AOSP項目進行多倉庫管理.在聊repo工具之前,我先帶你來聊聊多倉庫項目:

我們有個非常龐大的項目Pre,該項目由很多個子項目R1,R2,...Rn等組成,為了方便管理和協同開發,我們為每個子項目創立自己的倉庫,整個項目的結構如下:


這里寫圖片描述

執行完該命令後,再使用make命令繼續編譯.某些情況下,當你執行jack-admin kill-server時可能提示你命令不存在,此時去你去out/host/linux-x86/bin/目錄下會發現不存在jack-admin文件.如果我是你,我就會重新repo sync下,然後從頭來過.

錯誤三:使用emulator時,虛擬機停在黑屏界面,點擊無任何響應.此時,可能是kerner內核問題,解決方法如下:
執行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通過使用kernel-qemu-armv7內核 解決模擬器等待黑屏問題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一開始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問題時,不妨編譯aosp_arm64-eng試試.

    結束吧

    到現在為止,你已經了解了整個android編譯的流程.除此之外,我也簡單的說明android源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.

    ⑺ android中如何編譯出64位so文件

    如果是在Linux下編譯Android源碼,有可能是兩個原因:
    1. lunch命令有32位和64位的區別,注意選能夠編譯64位so的命令

    2. mk文件中有LOCAL_MODULE_PATH的值比如為$(TARGET_OUT_SHARED_LIBRARIES)/hw的改為LOCAL_MODULE_RELATIVE_PATH := hw,後一種可以分別在lib和lib64下分別生成32位和64位的so文件,這個看看編譯後的信息就知道了.

    ⑻ 泰克思達平板電腦10.1寸四核心16gb開機後只顯示安卓啟動什麼原因

    我的也是,昂達的普遍問題

    ⑼ Android源碼編譯是干什麼

    編譯Android系統。

    ⑽ android怎麼在launcher前啟動一個應用程序

    如果你要定製一個Android系統,你想用你自己的Launcher(Home)作主界面來替換Android自帶的Home,而且不希望用戶安裝的Launcher來替換掉你的Launcher,應該如何來實現呢?
    我們可以通過修改Framework層來實現這樣的功能。

    1) 首先了解一下Android的啟動過程。
    Android系統的啟動先從Zygote開始啟動,然後......(中間的過程就不說了).....一直到了SystemServer(framework)這個地方,看到這段代碼:

    /**
    * This method is called from Zygote to initialize the system. This willcause the native
    * services (SurfaceFlinger, AudioFlinger, etc..) to be started. Afterthat it will call back
    * up into init2() to start the Android services.
    */
    native public static void init1(String[] args);

    public static void main(String[] args) {
    if (SamplingProfilerIntegration.isEnabled()) {
    SamplingProfilerIntegration.start();
    timer = new Timer();
    timer.schele(new TimerTask() {
    @Override
    public void run() {
    SamplingProfilerIntegration.writeSnapshot("system_server");
    }
    }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
    }

    // The system server has to run all of the time, so it needs to be
    // as efficient as possible with its memory usage.
    VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

    System.loadLibrary("android_servers");
    init1(args);
    }

    public static final void init2() {
    Log.i(TAG, "Entered the Android system server!");
    Thread thr = new ServerThread();
    thr.setName("android.server.ServerThread");
    thr.start();
    }
    }

    從SystemServer的main函數開始啟動各種服務:
    首先啟動init1,然後啟動init2.從上面的注釋可以看到:init1這個方法時被Zygote調用來初始化系統的,init1會啟動native的服務如SurfaceFlinger,AudioFlinger等等,這些工作做完以後會回調init2來啟動Android的service。

    這里我們主要來關注init2的過程。init2中啟動ServerThread線程,ServerThread中啟動了一系列的服務,比如這些:

    ActivityManagerService
    EntropyService
    PowerManagerService
    TelephonyRegistry
    PackageManagerService
    AccountManagerService
    BatteryService
    HardwareService
    Watchdog
    SensorService
    BluetoothService
    StatusBarService
    ClipboardService
    InputMethodManagerService
    NetStatService
    ConnectivityService
    AccessibilityManagerService
    NotificationManagerService
    MountService
    DeviceStorageMonitorService
    LocationManagerService
    SearchManagerService
    FallbackCheckinService
    WallpaperManagerService
    AudioService
    BackupManagerService
    AppWidgetService

    這些大大小小的服務起來以後,開始
    ((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady()
    在systemReady後開始開始啟動Launcher。在尋找Launcher的時候是根據HOME的filter(在Manifest中定義的<categoryandroid:name="android.intent.category.HOME" />)來過濾。
    然後根據filter出來的HOME來啟動,如果只有一個HOME,則啟動這個HOME,如果用戶自己裝了HOME,那就會彈出來一個列表供用戶選擇。

    我們現在希望從這里彈出我們自己定製的Launcher,同時也不希望彈出選擇HOME的界面,我們不希望用戶修改我們的home,比如我們的home上放了好多廣告,以及強制安裝的程序,不希望用戶把它幹掉。

    我們可以通過這樣來實現:

    2) 定義一個私有的filter選項,然後用這個選項來過濾HOME.
    一般情況下我們使用Manifest中定義的<categoryandroid:name="android.intent.category.HOME"來過濾的,我們現在增加一個私有的HOME_FIRST過濾。

    在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加兩行代碼

    //lixinso:添加CATEGORY_FS_HOME
    @SdkConstant(SdkConstantType.INTENT_CATEGORY)
    public static final String CATEGORY_FS_HOME= "android.intent.category.FS_HOME";

    3)修改和CATEGORY_HOME相關的所有的地方,都改成CATEGORY_FS_HOME,主要是framework中的這幾個地方:使用grep命令查找要修改的地方:

    grep CATEGORY_HOME -l * -R

    將上述文件中和CATEGORY_HOME相關的所有的地方,都改成CATEGORY_FS_HOME。
    4) 寫一個自己的Launcher.
    可以參考android sample中的Launcher,或者android源代碼中的 /packages/apps/Launcher 來寫。
    在Launcher中標記其是不是Launcher的最關鍵的代碼時Manifest中的filter:android:name="android.intent.category.HOME"
    現在我們定義了自己的filter,那麼,我們在我們自己寫的Launcher中將Manifest改為:
    <application android:process="android.process.acore3"android:icon="@drawable/icon"android:label="@string/app_name">
    <activity android:name=".FirstAppActivity"
    android:label="@string/app_name">
    <intent-filter>
    <actionandroid:name="android.intent.action.MAIN" />
    <categoryandroid:name="android.intent.category. FS_HOME" />
    <categoryandroid:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.MONKEY"/>
    </intent-filter>
    </activity>
    </application>

    然後將編譯好的apk放到方式fs100_root/system/app目錄下。

    5)將Android自帶的Launcher刪除掉
    包括源代碼(packages/apps/Launcher)和apk(/out/target/proct/generic/system/app/Launcher.apk)。

    6) 重新編譯Android
    做完這些工作,就可以重新編譯Android了,我們可以編譯修改過的幾個相關的包,可以用mmm命令來編譯部分的改動。這里需要這樣編譯:

    $ source build/envsetup.sh
    $ lunch
    $ mmm frameworks/base
    $ mmm frameworks/base/services/java
    $ mmm frameworks/policies/base/mid
    $ mmm frameworks/policies/base/phone

    重新啟動開發板,從開發板上就可以看到啟動的Launcher是我們自己的Launcher,不會出現默認的Launcher了,也不會出現選擇界面。

    9)我們再驗證一下,如果用戶裝上了一個其他的Launcher(Home)會怎麼樣。
    從網上找一個一般的Launcher或者自己寫一個一般的Launcher裝上去,重新啟動,不會出現選擇界面。
    按HOME鍵也不會出來兩個HOME來選擇。

    這樣我們就牢牢控制了用戶的桌面。
    只有我們自己定製的HOME才能裝上。這對於定製Android設備的廠商很有用處。

    熱點內容
    手機怎樣給程序加密軟體 發布:2025-01-12 06:47:11 瀏覽:824
    地平線最高畫質筆記本要什麼配置才能玩 發布:2025-01-12 06:47:10 瀏覽:369
    原神過主線任務腳本 發布:2025-01-12 06:34:51 瀏覽:514
    醫保電子密碼在哪裡找到 發布:2025-01-12 06:34:38 瀏覽:349
    安卓手機有網卻不能使用怎麼辦 發布:2025-01-12 06:25:20 瀏覽:213
    arm存儲器映射 發布:2025-01-12 06:25:12 瀏覽:250
    安卓系統個人字典有什麼用 發布:2025-01-12 06:13:37 瀏覽:929
    geventpython安裝 發布:2025-01-12 06:13:34 瀏覽:339
    放鬆解壓助睡眠直播 發布:2025-01-12 06:13:00 瀏覽:829
    車載wince和安卓哪個好用 發布:2025-01-12 05:58:18 瀏覽:840