【原理】
成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),先為龍鳳等服務(wù)建站,龍鳳等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為龍鳳企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
當(dāng)Android系統(tǒng)完成BOOT階段之后,就會(huì)發(fā)送一條名為 ACTION_BOOT_COMPLETED 的廣播,我們便可在一個(gè)BroadcastReceiver中捕獲這條廣播,然后啟動(dòng)我們的Activity或者Service,當(dāng)然要注意的是,我們的application必須具有捕獲該廣播的權(quán)限,下面請(qǐng)看具體步驟:
【步驟一】首先要有一個(gè)用于開(kāi)機(jī)啟動(dòng)的Activity或者Service,這里以系統(tǒng)自己創(chuàng)建的最簡(jiǎn)單的Activity為例進(jìn)行講解。
package com.billhoo.study;
import android.app.Activity;
import android.os.Bundle;
public class BootTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
【步驟二】我們要編寫(xiě)一個(gè)BroadcastReceiver用以捕獲ACTION_BOOT_COMPLETED這條廣播,并在捕獲之后啟動(dòng)我們要啟動(dòng)的Activity。
注意:必須在intent中添加Intent.FLAG_ACTIVITY_NEW_TASK標(biāo)記,這就是我之前老是啟動(dòng)失敗的原因。至于為什么,我還在研究SDK doc,明白了之后就回來(lái)補(bǔ)上。
package com.billhoo.study;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
{
Intent newIntent = new Intent(context, BootTestActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);? //注意,必須添加這個(gè)標(biāo)記,否則啟動(dòng)會(huì)失敗
context.startActivity(newIntent);
}
}
}
【步驟三】在AndroidManifest.xml配置文件中注冊(cè)我們的BroadcastReceiver
receiver android:name=".BootCompletedReceiver"
intent-filter
action android:name="android.intent.action.BOOT_COMPLETED" /
/intent-filter
/receiver
【步驟四】在AndroidManifest.xml配置文件中添加允許我們捕獲該廣播的權(quán)限
!-- permissions --
uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /
之前把uses-permission 打錯(cuò)成permission ,結(jié)果一直提示下面這個(gè)錯(cuò)誤:
Permission Denial: receiving Intent { act=android.intent.action.BOOT_COMPLETED flg=0x8000010 (has extras) } to com.example.boottest/.BootCompletedReceiver requires android.permission.RECEIVE_BOOT_COMPLETED due to sender null (uid 1000)
重啟虛擬機(jī),大功告成。
下面附上完成的AndroidManifest.xml,以便大家理解參考
?xml version="1.0" encoding="utf-8"?
manifest xmlns:android=""
package="com.billhoo.study" android:versionCode="1"
android:versionName="1.0"
uses-sdk android:minSdkVersion="4" /
!-- permissions --
uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /
application android:icon="@drawable/icon" android:label="@string/app_name"
!-- activities --
activity android:name=".BootTestActivity" android:label="@string/app_name"
intent-filter
action android:name="android.intent.action.MAIN" /
category android:name="android.intent.category.LAUNCHER" /
/intent-filter
/activity
!-- receivers --
receiver android:name=".BootCompletedReceiver"
intent-filter
action android:name="android.intent.action.BOOT_COMPLETED" /
/intent-filter
/receiver
/application
/manifest
大概有10G的源代碼,一Byte一個(gè)字符,也就是說(shuō)有超過(guò)100億個(gè)字符,每行按標(biāo)準(zhǔn)80字符來(lái)算的話,超過(guò)1億行。開(kāi)放的WinXP系統(tǒng)有2億行,從數(shù)量級(jí)上來(lái)看的話,應(yīng)該差不多。Android 4.4,是由Google公司制作和研發(fā)的代號(hào)為KitKat的手機(jī)操作系統(tǒng),于北京時(shí)間2013年9月4日凌晨對(duì)外公布了該Android新版本的名稱,為Android 4.4(代號(hào) KitKat 奇巧)。據(jù)悉,該代號(hào)來(lái)自雀巢的KitKat巧克力。"Kit Kat"原本是雀巢公司的一款巧克力名稱。谷歌表示,他們非常感謝雀巢授權(quán)使用該名稱,但使用的時(shí)候會(huì)將中間的空格去掉。Android 4.4 KitKat針對(duì)RAM占用進(jìn)行了優(yōu)化,甚至可以在一些僅有512MB RAM的老款手機(jī)上流暢運(yùn)行。它也進(jìn)一步優(yōu)化了系統(tǒng)在低配硬件上的運(yùn)行效果, 支持內(nèi)核同頁(yè)合并 KSM,zRAM 交換,似乎是為了更好地在眾多智能穿戴設(shè)備上運(yùn)行。
是指sdk的源碼,還是android操作系統(tǒng)的源碼,不過(guò)都有10G左右,另外sdk的源碼是用git管理的,一次下載后,用git check就可以切換到各個(gè)版本。Android SDK是用于開(kāi)發(fā)Android上JAVA應(yīng)用程序的,另外發(fā)布Android NDK,可以添加一些C語(yǔ)言寫(xiě)的鏈接庫(kù),至于Linux代碼,可以在Android源代碼中找到(SDK程序中只有編譯好的測(cè)試映像)。應(yīng)用程序開(kāi)發(fā)用不到Linux代碼(搞嵌入式開(kāi)發(fā)才會(huì)用到,而SDK不負(fù)責(zé)底層開(kāi)發(fā))。
將apk文件拷貝至sdcard上。
命令順序如下:
進(jìn)入Android sdk文件夾/tools目錄下
輸入adb shell
輸入su
輸入cd data
輸入cd app
這時(shí)就可以看到你安裝的所有的apk文件。輸入cp 空格 對(duì)應(yīng)的apk 空格 /sdcard/
這樣就將apk文件拷貝出來(lái)了。
將apk文件后綴直接變成rar格式,可以看到熟悉的目錄結(jié)構(gòu)了,
其中xml文件打開(kāi)后都是二進(jìn)制的,無(wú)法查看。
這時(shí)就用到了一個(gè)android4me的AXMLPrinter2工具。(請(qǐng)自行百度搜索)
輸入以下命令,將xml文件解析出來(lái)
java -jar AXMLPrinter2.jar showtimes_list.xml
此命令是在命令行中查看此showtimes_list.xml
將showtimes_list.xml生成xml文件,則輸入以下命令:
java -jar AXMLPrinter2.jar showtimes_list.xml h.xml
目前進(jìn)行到這一步,只能看到xml文件的內(nèi)容,其工程中的java源文件還是看不到,看目錄結(jié)構(gòu)下有一個(gè)classes.dex文件,我們需要將dex文件變?yōu)閖ar文件。
這里用到了另一個(gè)工具dex2jar。(自行搜索下載)
在Windows下解壓之后的目錄如下圖所示:
在命令行中,進(jìn)入到此目錄下:
在Windows下,輸入以下命令:
dex2jar.bat c:\classes.dex
運(yùn)行完之后,在C盤會(huì)多一個(gè)classes.dex.dex2jar.jar文件,此文件就是我們需要的jar文件。
利用jd-gui,將jar文件反向工程為java代碼。(請(qǐng)自行搜索下載)
它分為Windows、Linux、和max三個(gè)版本,這里我下載的是Windows版本的。
解壓之后,雙擊運(yùn)行exe文件,選擇classes.dex.dex2jar.jar文件,相應(yīng)的jar文件中的Java文件就被反向工程顯示出來(lái)了!
Android是一種基于Linux的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。尚未有統(tǒng)一中文名稱,中國(guó)大陸地區(qū)較多人使用“安卓”或“安致”。Android操作系統(tǒng)最初由Andy Rubin開(kāi)發(fā),主要支持手機(jī)。2005年8月由Google收購(gòu)注資。2007年11月,Google與84家硬件制造商、軟件開(kāi)發(fā)商及電信營(yíng)運(yùn)商組建開(kāi)放手機(jī)聯(lián)盟共同研發(fā)改良Android系統(tǒng)。隨后Google以Apache開(kāi)源許可證的授權(quán)方式,發(fā)布了Android的源代碼。第一部Android智能手機(jī)發(fā)布于2008年10月。Android逐漸擴(kuò)展到平板電腦及其他領(lǐng)域上,如電視、數(shù)碼相機(jī)、游戲機(jī)等。2011年第一季度,Android在全球的市場(chǎng)份額首次超過(guò)塞班系統(tǒng),躍居全球第一。 2013年的第四季度,Android平臺(tái)手機(jī)的全球市場(chǎng)份額已經(jīng)達(dá)到78.1%。?[1]??2013年09月24日谷歌開(kāi)發(fā)的操作系統(tǒng)Android在迎來(lái)了5歲生日,全世界采用這款系統(tǒng)的設(shè)備數(shù)量已經(jīng)達(dá)到10億臺(tái)。
Android一詞最早出現(xiàn)于法國(guó)作家利爾亞當(dāng)(Auguste Villiers de l'Isle-Adam)在1886年發(fā)表的科幻小說(shuō)《未來(lái)夏娃》(L'ève future)中。他將外表像人的機(jī)器起名為Android。
Android的Logo是由Ascender公司設(shè)計(jì)的,誕生于2010年,其設(shè)計(jì)靈感源于男女廁所門上的圖形符號(hào), [1]? 于是布洛克繪制了一個(gè)簡(jiǎn)單的機(jī)器人,它的軀干就像錫罐的形狀,頭上還有兩根天線,Android小機(jī)器人便誕生了。其中的文字使用了Ascender公司專門制作的稱之為“Droid ” 的字體。Android是一個(gè)全身綠色的機(jī)器人,綠色也是Android的標(biāo)志。顏色采用了PMS 376C和RGB中十六進(jìn)制的#A4C639來(lái)繪制,這是Android操作系統(tǒng)的品牌象徵。有時(shí)候,它們還會(huì)使用純文字的Logo。
Android系統(tǒng)源碼都在網(wǎng)址下,其中那個(gè)系統(tǒng)app都在platform/packages/apps結(jié)構(gòu)下。
在剛才的Git的shell命名行窗口中輸入下面的命名:
git clone git://android.git.kernel.org/platform/packages/apps/Luancher2.git
你就可以在你的msysGit安裝目錄的git下(~\msysgit\msysgit\git)看到Luancher工程文件夾了。
然后打開(kāi)~\msysgit\msysgit\git\Luancher2文件夾,就可以看到Android的Luancher系統(tǒng)源碼工程了。
對(duì)于其他的app系統(tǒng)源碼的獲取方法和上述的Luancher相同,只是命名行后的參數(shù)不同。
git clone git://android.git.kernel.org/需下載源碼的app所在的位置。
將開(kāi)發(fā)過(guò)程常用的內(nèi)容段做個(gè)收藏,下邊資料是關(guān)于Android系統(tǒng)下監(jiān)聽(tīng)SD卡的插入并讀取內(nèi)容的內(nèi)容。
private final BroadcastReceiver broadcastRec =? new BroadcastReceiver() {
? ? @Override
? ? public void onReceive(Context context, Intent intent) {
? ? ? ? {? ? ? ? ? ? ? ?
? ? ? ? ? ? }
? ? ? ? ? ? ? ||intent.getAction().equals("android.intent.action.ACTION_MEDIA_UNMOUNTED")
? ? ? ? ? ? ? ? ||intent.getAction().equals("android.intent.action.ACTION_MEDIA_BAD_REMOVAL"))
? ? ? ? {
? ? ? ? }
? ? }
};
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
? ? intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
? ? intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
? ? intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
? ? intentFilter.addDataScheme("file");