① 如何在電腦上運行安卓程序
搞安卓的程序開發,其中很重要的一環就是測試軟體,而我們不可能時常把手機連接到電腦上,那麼如何在電腦上運行安卓程序呢?下文我就分享了在電腦上運行安卓程序的 方法 ,希望對大家有所幫助。
在電腦上運行安卓程序方法
一、安裝java環境
進Java官方網站里下載JDK,雙擊運行jdk-6u20-windows-i586.exe,假設選擇安裝到C:Javajdk1.6.0_20目錄下(當然,安裝到默認路徑下也沒有問題)。安裝完畢後,就是配置環境變數。步驟如下:
(1)設置JAVA路徑
在“我的電腦”上點右鍵,選“屬性”,打開“系統屬性”對話框,點“高級”選項卡,再點“環境變數”按鈕,在打開的對話框中的“系統變數”下方,點“新建”,然後在對話框中的“變數名”中填JAVA_HOME,在“變數值”中填C:Javajdk1.6.0_20,點“確定”。
(2)設置CLASS路徑
再“新建”一個系統變數,在“變數名”中填CLASSPATH,在“變數值”中填.;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar。
說明:最開始的.;中的.(點)表示當前路徑,;(分號)是路徑分隔符。接下來的%JAVA_HOME%引用的是前面剛創建的JAVA安裝路徑。
(3)設置PATH路徑
PATH變數一般都有了,因此選中點“編輯”,然後在“變數值”後面加上;%JAVA_HOME%in;%JAVA_HOME%jrein,注意前面的分號。
這樣,JDK就安裝好。“開始->運行”,輸入cmd,然後在命令行提示符中輸入:java -version,應該能夠看到java version “1.6.0_20″信息;JDK安裝成功。
二、安裝android環境
下載Android SDK 1.5(android-sdk-windows-1.6_r1.zip),解壓縮到C:android-sdk-windows-1.6_r1目錄中(解壓到哪個目錄都沒有問題)。然後,配置環境變數。步驟如下:
(1)設置Android路徑
重復第一步的(1),新建一個“系統變數”,在“變數名”中填Android_Home(大小寫沒有問題),在“變數值”加填C:android-sdk-windows-1.6_r1。
(2)設置PATH路徑
“編輯”PATH變數,在“變數值”後面加上;%Android_Home% ools,注意前面的分號。
這樣,Android SDK 1.6就安裝好了。“開始->運行”,輸入cmd,然後在命令行提示符中輸入:android -help,應該能夠看到幫助信息;Android SDK 1.6安裝成功。
三、安裝Android模擬器
下載Android SDK Setup ,解壓縮到C:android-sdk-windows,然後進入這個文件夾,雙擊SDK Setup.exe,啟動Android SDK and AVD Manager,選中左側Settings項,然後在右側面板選中Force https://… sources to be fetched using http://,然後選擇Save & Apply
選擇”installed package”,安裝相應的Android版本:安裝時間可能較長,可以選擇合適的Android版本就可以了,比如2.2
然後進入virtual devices新建模擬器,選擇對應的Android版本,然後尺寸一般選擇HVGA即可。
點擊Create AVD即創建模擬器成功,然後返回模擬器列表選擇start啟動模擬器
四、安裝軟體
下面就是重頭戲了,也就是在模擬器上安裝apk軟體。
點擊電腦“開始”菜單裡面的“運行”輸入cmd,如果是 windows7 則直接在開始菜單里的搜索框中輸入cmd並回車。
把下載好的APK文件復制到模擬器的安裝地址中的Tools目錄下,例如:“D:android-sdk-windows ools”。下載後的APK文件可以改個簡短好記的名字,例如:game.apk
然後點擊Tools目錄下的emulator.exe,點擊後看到程序運行一閃而過,ok,這就行了。
在cmd命令窗口中輸入cd d:回車(同理,如果你模擬器安裝在E盤或別的硬碟根目錄下,這里d就更換成e或別的硬碟名。這個就不再提醒了。)
再輸入d:回車
繼續輸入cd D:android-sdk-windows ools回車(寫到這里時,我自己電腦上的模擬器安裝目錄變了,變成android了。大家湊合看看圖吧,把圖片中的“android”換成你自己模擬器的安裝目錄就ok,這個就不用我再多說了吧?)
最後輸入adb install game.apk回車(這里game.apk就是我們下載並復制到tools目錄下的apk文件名)
Ok,,這樣我們就成功的在模擬器上安裝好了軟體。切換回模擬器,就能找到該軟體了。簡單吧?你也趕緊來試試吧。
如何在電腦上運行安卓程序相關 文章 :
1. 在電腦上安裝安卓系統的方法
2. 電腦如何安裝安卓系統
3. 如何在電腦上安裝安卓系統
4. 怎麼在Win7電腦玩安卓游戲
5. 安卓程序員必備的開發工具
6. Win10電腦怎樣使用安卓模擬器
② Android 10.0 ActivityManagerService的啟動流程
我們講完了SystemServer的啟動過程,本節主要來講解ActivityManagerService的啟動過程。ActivityManagerService簡稱AMS,管理Activity行為,控制Activity的生命周期,派發消息事件,內存管理等功能。
ActivityManagerService啟動由SystemServer中startBootstrapService啟動
ATM啟動最終調用的是ActivityTaskManagerService.Lifecycle.onStart()來啟動ATM服務的
源碼:ActivityTaskManagerService.java#Lifecycle.class
將ActivityTaskManagerInternal添加到本地服務的全局注冊表中。
ActivityTaskManagerInternal為抽象類,其實現類為ActivityTaskManagerService#LocalService.class
構造函數初始化主要工作就是初始化一些變數,供之後的service,broadcast,provider的管理和調度
start中做了兩件事
AMS的systemReady處理分為三個階段
同時獲取一些配置參數。 需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺死的進程是Java進程。
主要是調用一些關鍵服務的初始化函數,然後殺死那些沒有FLAG_PERSISTENT 卻在AMS啟動完成前已經存在的進程,同時獲取一些配置參數。需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺手的進程是Java進程。
執行goingCallback的處理,主要的工作就是通知一些服務可以進行systemReady相關的工作,並進行啟動服務或應用進程的工作
監控Native的crash,啟動WebView,執行一些服務的systemReady和systemRunning方法
啟動Home Activity,當啟動結束,發送ACTION_BOOT_COMPLETED廣播時,AMS的啟動過程告一段落
啟動Home Activity
AMS的啟動主要經歷了如下幾個階段:
③ 求講解一下安卓運行一個APP的詳細過程
android運行app的過程:
1、用戶打開一個app。
2、系統分配程序預設要求的最低內存,並創建activity進程。
3、進程創建完畢後,app程序被轉移至虛擬機中。
4、app程序到達虛擬機後運行第一條啟動指令,一般為顯示啟動logo。
5、啟動後依據用戶的操作來完成程序。
6、用戶關閉app。
7、系統將程序移除虛擬機,並結束activity進程。
8、釋放佔用的內存。
④ Android應用程序啟動流程總結
AMS主要功能:
AMS是Android中最核心的服務,主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作。還負責啟動或殺死應用程序的進程。
WMS主要功能:
為所有窗口分配Surface。
管理Surface的顯示順序、尺寸、位置。
管理窗口動畫。
輸入系統相關:WMS是派發系統按鍵和觸摸消息的最佳人選,當接收到一個觸摸事件,它需要尋找一個最合適的窗口來處理消息。
PWS主要功能:
PMS 用來管理跟蹤所有應用APK,包括安裝,卸載,解析,控制許可權等。
SystemServer也是一個進程,包括AMS、PMS、WMS等等。
zygote意為「受精卵「。Android是基於Linux系統的,而在Linux中,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。
App進程是用戶點擊桌面icon時,通過Launcher進程請求SystemServer,再調用Zygote孵化的。
①點擊啟動一個App,Launcher進程採用Binder IPC向ActivityManagerService發起startActivity請求;
②ActivityManagerService接收到請求後,向zygote進程發送創建進程的請求;
③Zygote進程fork出新的子進程,即App進程;
④App進程通過Binder IPC向sytem_server進程發起綁定Application請求;
⑤system_server進程在收到請求後,進行一系列准備工作後,再通過binder IPC向App進程發送scheleLaunchActivity請求;
⑥App進程的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送LAUNCH_ACTIVITY消息;
⑦主線程在收到Message後,通過發射機制創建目標Activity,並回調Activity.onCreate()等方法。
⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束後便可以看到App的主界面。
備註:
Launcher,PMS,Zygote,App進程是三個獨立的進程,相互通信就需要使用進程間通信機制。與Zygote通信是使用的socket通信,Launcher,PMS,App進程間使用的是Binder機制。
⑤ Android 10.0 Activity的啟動流程
本文主要學習記錄,基於Android 10的源碼,有錯誤歡迎指正,主要目的是梳理流程圖。
以進程為單位的調用棧圖如下:
1.activity中的startActivity方法最終都會通過拿到ATSM的代理IActivityTaskManager調用的startActivity;
2.之後進入system server進程中的ATMS startActivity,ATMS 經過收集Intent信息,然後使用ActivityStackSupervisor.startSpecificActivityLocked,如果進程已經存在,則直接使用realStartActivityLocked,通過App的binder客戶端的代理ApplicationThread調用回到bindApplication,走入Activity的啟動流程;如果進程不存在則通過socket鏈接Zygote,請求fork新的進程;
3.App進程創建完成後,進程啟動會調用ActivityThread.main方法,初始化主線程Handler,接著走入attach方法,然後通過AMS的代理調用AMS的attachApplication方法,並將App進程的通信代理ApplicationThread傳入AMS;
4.AMS獲取到ATMS調用ApplicationThread的bindApplication回到App進程的ActivityThread.ApplicationThread.bindApplication方法中,然後使用Handler切換到主線程執行handleBindApplication,這里初始化了App的進程名字、時間,用戶的硬體配置,包括App的文件系統,創建了App的Context實例,Instrumentation實例,調用App的onCreate回調方法,同時告訴AMS APP初始化工作完畢;
5.AMS接著會調用ATMS的attachApplication,最後調用ClientLifecycleManager的scheleTransaction方法,通過App的Binder代理ApplicationThread回到ActivityThread;
6.進入ActivityThread.ApplicationThread.scheleTransaction方法之後就進入了Activity的onStart、onResume回調
創建進程之前的過程主要是AMS的內部信息收集的判斷的過程,下面主要看一下App進程啟動的源碼流程
從應用進程被創建開始,ActivityThread.main被執行
調用ActivityThread的attach方法,然後將activity和AMS通信的Binder代理IApplicationThread實例傳入AMS
接著進入AMS進程,ActivityManagerService.attachApplicationLocked
1.thread.bindApplication :該方法主要講App進程的配置信息通過IApplicationThread Binder通信回傳到ActivityThread中
2.mAtmInternal.attachApplication :mAtmInternal實際就是ActivityTaskManager的實例,通過LocalServices載入
那麼這里相當於走到了ActivityTaskManagerServer的attachApplication中
先看第一條:
注意:ActivityThread中存在於Binder通信的代理--》ApplicationThread extends IApplicationThread.Stub
ActivityThread--》ApplicationThread--》bindApplication
這里的bindApplication主要初始化了AppBindData,然後發送BIND_APPLICATION給APP的主線程BIND_APPLICATION,最後執行了handleBindApplication
handleBindApplication如下:
ActivityThread--》class H extends Handler
該方法主要在App進程中對App的一些硬體資源配置申請的屬性、App的文件夾等完成App基本信息的初始化
接著看第二條:mAtmInternal.attachApplication
mAtmInternal.attachApplication最終會調用mRootActivityContainer.attachApplication(wpc)
RootActivityContainer.attachApplication
接著調用ActivityStackSupervisor.realStartActivityLocked開始創建Activity
ActivityStackSupervisor.realStartActivityLocked
創建ClientLifecycleManager和ClientTransactionHandler來輔助管理Activity的生命周期
注意
clientTransaction.addCallback是LaunchActivityItem
lifecycleItem是ResumeActivityItem
ClientLifecycleManager.scheleTransaction最終會調用ClientTransaction的schele方法
那麼這個mClient是IApplicationThread的實例,那麼此時也就回到了ActivityThread的ApplicationThread中
ActivityThread的ApplicationThread中
因為ActivityThread繼承ClientTransactionHandler,所以到了ClientTransactionHandler中
通過Handler發送消息EXECUTE_TRANSACTION到H中
接著TransactionExecutor的execute方法
LaunchActivityItem.execute方法
client其實是在ActivityThread的實例,那麼就回到了ActivityThread的handleLaunchActivity
接著調用performLaunchActivity
在performLaunchActivity中,主要是載入App的資源包,然後創建了Activity的context實例,並創建了Activity的實例,接著調用activity.attach方法,attach執行完之後調用了onCreate方法。
activity.attach
activity.attach中主要
1.創建了PhoneWindow實例
2.設置了Window介面的監聽
3.初始化了成員變數,包括線程和WindowManager
到此Oncreate已經完成,那麼OnStart和OnResume去哪了?
TransactionExecutor的execute方法
之前們只分析了executeCallbacks,接著executeLifecycleState方法
TransactionExecutor的executeLifecycleState方法
cycleToPath:lifecycleItem即為ResumeActivityItem
第一點:
int finish = lifecycleItem.getTargetState()
lifecycleItem對應ResumeActivityItem,如下:
ResumeActivityItem的getTargetState方法
對應ActivityLifecycleItem中的枚舉類型:
第二點:ActivityClientRecord中的mLifecycleState,由於在前面已經執行了handleLaunchActivity所以mLifecycleState=1
對應ActivityLifecycleItem中的枚舉類型:
PRE_ON_CREATE = 0
所以final int star = 1
接著看getLifecyclePath,此時start=1,finish=3
那麼返回的IntArray就是2
接著看performLifecycleSequence
最終執行的是handleStartActivity所以最終走到了ActivityThread的handleResumeActivity
兩點:
調用activity.performStart
調用Instrumetation.callActivityOnPostCreate
performStart方法:
調用了Instrumentation.callActivityOnStart方法:
最終到了activity的onStart方法
第二點:Instrumentation.callActivityOnPostCreate
上面主要走了cycleToPath,接著ResumeActivityItem.execute
調用了handleResumeActivity方法
handleResumeActivity最終調用performResumeActivity
調用了Instrumentation.callActivityOnResume,
到了activity.onResume()方法
參考文章: https://blog.csdn.net/u011386173/article/details/87802765
⑥ Android App安裝以及啟動流程
Android App的安裝可以分為有界面的安裝和無界面的安裝。
有界面的安裝其實就是調用系統App(PackageInstaller)咐碼去安裝apk,打開安裝apk應用之後,點擊安裝按鈕執行startInstall方法,然後就進入安裝中界面開始安裝,安裝成功或者衡族哪失敗都會有對應的回調。內部其實也是使用PackageManager的installExistingPackage方法,通過binder機制,調用到PackageManagerService的installExistingPackage方法,最終調用到installExistingPackageAsUser方法安裝,而 安裝的核心原理其實就是將apk文件拷貝到系統可識別的重要的文件目錄 :
無界面安裝是調用adb命令,執行到一個c寫的commandline腳本,調用 install_app 方法,然後再調用 pm_command ,然後執行到pm腳本,執行 run 方法,調用 runinstall ,然後調用 installPackageAsUser 通過AMS執行安裝。
說到App的啟動,就需要從穗則開機開始說起,Android開機會先把所有應用安裝一遍就是把apk拷貝到對應的目錄(這也是Android開機慢的原因)。
整個流程如下:
其實App的啟動,除了剛開機是不一樣之外,正常時候基本與Activity的啟動非常接近。