重寫onDestroy方法,在里面不實(shí)現(xiàn)系統(tǒng)的,換成自己的方法。 步驟: 查看系統(tǒng)onDestroy方法的書寫方法 在自定義類中重寫該方法 定義自定義的方法 在onDestroy中調(diào)用該方法
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站制作、陳倉(cāng)網(wǎng)絡(luò)推廣、微信小程序開發(fā)、陳倉(cāng)網(wǎng)絡(luò)營(yíng)銷、陳倉(cāng)企業(yè)策劃、陳倉(cāng)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供陳倉(cāng)建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
Commands:命令
Actions: 動(dòng)作
Triggers: 觸發(fā)條件
Services: 服務(wù)
Options: 選項(xiàng)
Propertise: 屬性
(1) Commands是一些基本的操作,例如:
mkdir /sdcard 0000 system system mkdir /system
mkdir /data 0771 system system
mkdir /cache 0770 system cache
mkdir /config 0500 root root
mkdir /sqlite_stmt_journals 01777 root root
mount tmpfs tmpfs /sqlite_stmt_journals size=4m
這些命令在init可執(zhí)行程序中被解析,然后調(diào)用相關(guān)的函數(shù)來(lái)實(shí)現(xiàn)。
(2) Actions(動(dòng)作)表示一系列的命令,通常在Triggers(觸發(fā)條件)中調(diào)用,動(dòng)作和觸發(fā)條件的形式為:
on
動(dòng)作的使用示例如下:
on init
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
mkdir /system
init表示一個(gè)觸發(fā)條件,這個(gè)觸發(fā)事件發(fā)生后,進(jìn)行設(shè)置環(huán)境變量和建立目錄的操作稱為一個(gè)“動(dòng)作”
(3) Services(服務(wù))通常表示啟動(dòng)一個(gè)可執(zhí)行程序,Options(選項(xiàng))是服務(wù)的附加內(nèi)容,用于配合服務(wù)使用。
service vold /system/bin/vold
socket vold stream 0660 root mount
service bootsound /system/bin/playmp3
user media
group audio
oneshot
vold和bootsound分別是兩個(gè)服務(wù)的名稱,/system/bin/vold和/system /bin/playmp3分別是他們所對(duì)應(yīng)的可執(zhí)行程序。
socket、user、group、oneshot就是配合服務(wù)使用的選項(xiàng)。其中oneshot選項(xiàng)表示該服務(wù)只啟動(dòng)一次,而如果沒有oneshot選項(xiàng),
這個(gè)可執(zhí)行程序會(huì)一直存在--如果可執(zhí)行程序被殺死,則會(huì)重新啟動(dòng)。
(4) Properties(屬性)是系統(tǒng)中使用的一些值,可以進(jìn)行設(shè)置和讀取。
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
on property:ro.kernel.qemu=1
start adbd
setprop 用于設(shè)置屬性,on property可以用于判斷屬性,這里的屬性在整個(gè)Android系統(tǒng)運(yùn)行中都是一致的。
init腳本的關(guān)鍵字可以參考init進(jìn)程的system/core/init/keyword.h文件。
init.rc的使用方法,可以參考說(shuō)明文件system/core/init/readme.txt
如果想要修改啟動(dòng)過(guò)程只需要修改init.c(system/core/init)或者init.rc里的內(nèi)容即可.
如何去寫
Android init.rc (Android init language)
Android 初始化語(yǔ)言由四大類聲明組成 : 行為類 (Actions), 命令類 (Commands) ,服務(wù)類 (Services), 選項(xiàng)類 (Options).
* 初始化語(yǔ)言以行為單位,由以空格間隔的語(yǔ)言符號(hào)組成。 C 風(fēng)格的反斜杠轉(zhuǎn)義符可以用來(lái)插入空白到語(yǔ)言符號(hào)。雙引號(hào)也可以用來(lái)防止文本被空格分成多個(gè)語(yǔ)言符號(hào)。當(dāng)反斜杠在行末時(shí),作為折行符。
* 以 # 開始 ( 前面允許有空格 ) 的行為注釋行。
* Actions 和 Services 隱含聲明一個(gè)新的段落。所有該段落下 Commands 或 Options 的聲明屬于該段落。第一段落前的 Commands 或Options 被忽略。
* Actions 和 Services 擁有獨(dú)一無(wú)二的命名。在它們之后聲明相同命名的類將被當(dāng)作錯(cuò)誤并忽略。
Actions
-------
Actions 是一系列命令的命名。 Actions 擁有一個(gè)觸發(fā)器 (trigger) 用來(lái)決定 action 何時(shí)執(zhí)行。當(dāng)一個(gè) action 在符合觸發(fā)條件被執(zhí)行時(shí),如果它還沒被加入到待執(zhí)行隊(duì)列中的話,則加入到隊(duì)列最后。
隊(duì)列中的 action 依次執(zhí)行, action 中的命令也依次執(zhí)行。 Init 在執(zhí)行命令的中間處理其它活動(dòng) ( 設(shè)備創(chuàng)建 / 銷毀 ,property 設(shè)置,進(jìn)程重啟) 。
Actions 表現(xiàn)形式為:
on
Services
--------
Services 是由 init 啟動(dòng),在它們退出時(shí)重啟 ( 可選 ) 。 Service 表現(xiàn)形式為 :
service [ ]*
...
Options
-------
Options 是 Services 的修飾,它們影響 init 何時(shí)、如何運(yùn)行 service.
critical
這是一個(gè)設(shè)備關(guān)鍵服務(wù) (device-critical service) . 如果它在 4 分鐘內(nèi)退出超過(guò) 4 次,設(shè)備將重啟并進(jìn)入恢復(fù)模式。
disabled
這個(gè)服務(wù)的級(jí)別將不會(huì)自動(dòng)啟動(dòng),它必須被依照服務(wù)名指定啟動(dòng)才可以啟動(dòng)。
setenv
設(shè)置已啟動(dòng)的進(jìn)程的環(huán)境變量 的值
socket [ [ ] ]
創(chuàng)建一個(gè)名為 /dev/socket/ 的 unix domin socket ,并傳送它的 fd 到已啟動(dòng)的進(jìn)程。 必須為 "dgram" 或 "stream". 用戶和組默認(rèn)為 0.
user
在執(zhí)行服務(wù)前改變用戶名。當(dāng)前默認(rèn)為 root. 如果你的進(jìn)程需要 linux 能力,你不能使用這個(gè)命令。你必須在還是 root 時(shí)請(qǐng)求能力,并下降到你需要的 uid.
group [ ]*
在執(zhí)行服務(wù)前改變組。在第一個(gè)組后的組將設(shè)為進(jìn)程附加組 ( 通過(guò) setgroups()). 當(dāng)前默認(rèn)為 root.
oneshot
在服務(wù)退出后不重啟。
class
為 service 指定一個(gè)類別名。同樣類名的所有的服務(wù)可以一起啟動(dòng)或停止。如果沒有指定類別的服務(wù)默認(rèn)為 "default" 類。
onrestart
當(dāng)服務(wù)重啟時(shí)執(zhí)行一個(gè)命令。
Triggers
--------
Triggers( 觸發(fā)器 ) 是一個(gè)字符串,可以用來(lái)匹配某種類型的事件并執(zhí)行一個(gè) action 。
boot
這是當(dāng) init 開始后執(zhí)行的第一個(gè)觸發(fā)器 ( 當(dāng) /init.conf 被加載 )
=
當(dāng) property 被設(shè)為指定的值 時(shí)觸發(fā)。
device-added-
device-removed-
當(dāng)設(shè)備節(jié)點(diǎn)被添加或移除時(shí)觸發(fā)。
service-exited-
當(dāng)指定的服務(wù)存在時(shí)觸發(fā)
Commands
--------
exec [ ]*
Fork 并執(zhí)行一個(gè)程序 (). 這將被 block 直到程序執(zhí)行完畢。最好避免執(zhí)行例如內(nèi)建命令以外的程序,它可能會(huì)導(dǎo)致 init 被阻塞不動(dòng)。
export
設(shè)定全局環(huán)境變量 的值 ,當(dāng)這個(gè)命令執(zhí)行后所有的進(jìn)程都可以取得。
ifup
使網(wǎng)絡(luò)接口 聯(lián)機(jī)。
import
解析一個(gè) init 配置文件,擴(kuò)展當(dāng)前配置文件。
hostname
設(shè)置主機(jī)名
chmod
改變文件訪問權(quán)限
chown
改變文件所屬和組
class_start
當(dāng)指定類別的服務(wù)沒有運(yùn)行,啟動(dòng)該類別所有的服務(wù)。
class_stop
當(dāng)指定類別的服務(wù)正在運(yùn)行,停止該類別所有的服務(wù)。
domainname
設(shè)置域名。
insmod
加載該路徑 的模塊
mkdir [mode] [owner] [group]
在 創(chuàng)建一個(gè)目錄 , 可選選項(xiàng) :mod,owner,group. 如果沒有指定,目錄以 755 權(quán)限, owner 為 root,group 為 root 創(chuàng)建 .
mount
[ ]*
嘗試 mount 到目錄
. 可以用 mtd@name 格式以命名指定一個(gè) mtd 塊設(shè)備。 包含"ro","rw","remount","noatime".
例如:
mount -t vfat -o fmask=0000,dmask=0000,rw,flush,noatime,nodiratime /dev/block/mmcblk1p1 /SD1
chown system system /SD1
chmod 0777 /SD1
mount -t vfat -o fmask=0000,dmask=0000,rw,flush,noatime,nodiratime /dev/block/mmcblk1p6 /SD3
chown system system /SD3
chmod 0777 /SD3
setkey
暫時(shí)沒有
setprop
設(shè)置系統(tǒng) property 的值 .
setrlimit
設(shè)置 resource 的 rlimit.
start
啟動(dòng)一個(gè)沒有運(yùn)行的服務(wù)。
stop
停止一個(gè)正在運(yùn)行的服務(wù)。
symlink
創(chuàng)建一個(gè) 的符號(hào)鏈接到
sysclktz
設(shè)置系統(tǒng)時(shí)區(qū) (GMT 為 0)
trigger
觸發(fā)一個(gè)事件。用于調(diào)用其它 action 。
write [ ]*
打開 的文件并寫入一個(gè)或多個(gè)字符串。
Properties
----------
Init 會(huì)更新一些系統(tǒng) property 以提供查看它正在干嘛。
init.action
當(dāng)前正在執(zhí)行的 action, 如果沒有則為 ""
init.command
被執(zhí)行的命令,如果沒有則為 ""
init.svc.
命名為 的服務(wù)的狀態(tài) ("stopped", "running", "restarting")
init.rc 示例 :
-----------------
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd
調(diào)試
---------------
默認(rèn)情況下, init 執(zhí)行的程序輸出的信息和錯(cuò)誤到 /dev/null. 為了 debug ,你可以通過(guò) Android 程序 logwrapper 執(zhí)行你的程序。這將復(fù)位向輸出 / 錯(cuò)誤輸出到 Android logging 系統(tǒng) ( 通過(guò) logcat 訪問 ) 。
===============================================================
Android——init.rc腳本
在Android中使用啟動(dòng)腳本init.rc,可以在系統(tǒng)的初始化中進(jìn)行簡(jiǎn)單的操作。
init.rc啟動(dòng)腳本路徑:system/core/rootdir/init.rc
內(nèi)容:
Commands:命令
Actions:動(dòng)作
Triggers:觸發(fā)條件
Services:服務(wù)
Options:選項(xiàng)
Properties:屬性
Commands是一些基本操作。如:
mkdir /system
mkdir /data 0771 system system
mkdir /persist 0771 system system
devwait /dev/block/mmcblk0p12
mount ext3 /dev/block/mmcblk0p
Action表示一系列命令,通常在Triggers中調(diào)用,如:
on init //表示一個(gè)觸發(fā)條件
sysclktz 0
loglevel 3
# setup the global environment
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
export LD_LIBRARY_PATH /system/lib
export ANDROID_BOOTLOGO 1
Services通常表示啟動(dòng)一個(gè)可執(zhí)行程序,Options是服務(wù)的附加內(nèi)容,用于配合服務(wù)使用。
service vold /system/bin/vold //vold是服務(wù)名稱,/system/bin/vold是所對(duì)應(yīng)的可執(zhí)行程序。
socket vold stream 0660 root mount //socket是配合服務(wù)使用的選項(xiàng)
ioprio be 2
service netd /system/bin/netd
socket netd stream 0660 root system
配合服務(wù)使用的選項(xiàng)有socket,user,group,oneshot。
oneshot表示該服務(wù)只啟動(dòng)一次,而如果沒有oneshot選項(xiàng),這個(gè)可執(zhí)行程序?qū)⒁恢贝嬖凇绻蓤?zhí)行程序被殺死,則會(huì)重新啟動(dòng)。
Properties是系統(tǒng)中使用的一些值,可以進(jìn)行設(shè)置和讀寫。
setprop ro.HIDDEN_APP_MEM 5120 //setprop用于設(shè)置屬性
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
...
on property:ro.kernel.qemu=1 //on property用于判斷屬性
start adbd
這里的屬性在整個(gè)android系統(tǒng)運(yùn)行中都是一致的。
init腳本的關(guān)鍵字可以參考init進(jìn)程中的system/core/init/keyword.h文件。如:
KEYWORD(chroot, COMMAND, 1, do_chroot) //chroot是命令,do_chroot()是調(diào)用的函數(shù),這個(gè)函數(shù)在init進(jìn)程中的system/core/init/builtins.c文件中定義。
例如:
service akmd /system/bin/logwrapper /sbin/akmd
android大的著名的blog,我知道的是洪洋的,csdn博客有很多的,還有簡(jiǎn)書
1.袁輝輝
Android系統(tǒng)工程師,曾就職于IBM、Lenovo,目前就職于小米MIUI系統(tǒng)組,對(duì)Android系統(tǒng)源碼研究的比較透徹,畢竟是系統(tǒng)工程師。博客中有很多高質(zhì)量的源碼分析文章.
博客地址:Gityuan
2.羅升陽(yáng)
江湖人稱老羅(其實(shí)挺年輕的),對(duì)Android系統(tǒng)源碼有頗深的研究,著有《Android系統(tǒng)源代碼情景分析》一書,并且在CSDN上分享了出來(lái),文章內(nèi)容的質(zhì)量也是非常高,非常值得研讀一番,聽說(shuō)他最近在oppo供職。
博客地址:老羅的Android之旅
3.鄧凡平
《深入理解Android 卷》一書的作者,早年是做C++開發(fā)的,后來(lái)轉(zhuǎn)到Android開發(fā),對(duì)Android源碼研究的也比較透徹,也有自己的博客:
博客地址:Innost的專欄
4.郭霖
《第一行代碼》一書的作者,主要分析應(yīng)用層的代碼,將一些開源庫(kù)的分析比較透徹。
博客地址:郭霖的專欄
5.尼古拉斯_趙四
此人擅長(zhǎng)于Android逆向,對(duì)于APK的加固破解有較深入的研究,擅長(zhǎng)從反編譯已經(jīng)被混淆的代碼中尋找線速,再結(jié)合Xposed工具修復(fù)已經(jīng)按照的應(yīng)用的功能
博客地址:尼古拉斯.趙四
GITHUB:尼古拉斯.趙四
6.Weishu
真名可能是叫田維術(shù),博客行文不錯(cuò),很容易讓人明白,也有不少實(shí)實(shí)在在的干貨。
博客地址:Weishu’s Notes
7.zjutkz
對(duì)于Android熱修復(fù),逆向以及RN Weex開發(fā)有一些的研究,博客文章數(shù)量不多,但有些文章寫的還可以。
博客地址:zjutkz’s blog
8.任玉剛