Android开发概要记录
1..o文件、 .ko和.so文件的路徑
\kernel\out\mediatek---------------.o文件
.c/.cpp文件編譯生成的目標文件
\out\target\product\hsimobile77_ics2\system\lib\modules----.ko文件
?
.ko是整個模塊生成的驅動文件(內核模塊),其中可以包括了.so,如果編譯進 kernel??只可以看到.o?不會生成ko
?
\out\target\product\hsimobile77_ics2\system\lib------------.so文件
?
?.so?是部分文件編譯成庫文件,芯片原廠不希望你看到源碼,可以已這樣的方式提供,相當于WINCE下的.dll文件(動態鏈接庫文件)
?
?
2.用Ctrl+C停止正在進行的編譯操作
?
3.如何快速編譯單個驅動和調試?
?
4.adb logcat > logo.txt可以抓取調試信息
adb shell
cat /proc/kmsg也可以抓調試信息。
5./dev下通過ls -l可以查看設備文件更多詳細的信息,比如主設備號和次設備號。
?
6.adb shell setprop service.adb.root 1 設置權限。
7.linux下fastboot使用
adb reboot bootloader
fastboot flash boot \out\target\product\msm8909\boot.img
fastboot reboot
?
8.svn一些常用的命令
svn status查看有更新的文件
svn log查看更新記錄
?
?
svn co svn://192.168.XX.XXX/源代碼目錄
獲取指定版本
svn checkout?http://siphon.googlecode.com/svn/trunk/siphon -r r791
?
svn up獲取新版本代碼
svn commit -m "解決DC無法充電及顯示問題"
?
svn status可知道修改的文件、和增加的文件。
svn add file提交增加的文件
?
提交某些指定的文件
svn commit kernel/drivers/input/keyboard/A.c kernel/drivers/input/keyboard/A.h -m "1.優化按鍵驅動 2提交按鍵代碼"
?
刪除文件
svn delete?path -m?“delete test fle“
?
修改文件名svn move xxx yyy
將xxx文件重命名為yyy,類似于Linux的mv命令。
?
svn info獲取當前版本信息
?
svn?update?-r10030-------更新到指定版本,也可以用于回退到哪個版本做測試驗證,這只是回退到指定版本,但服務器上還是最新版本。
如果要恢復服務器代碼到指定版本,用svn merge -r 29:28 .//回退29版本到28版本,.表示當前路徑,回退后需要svn commit提交。
r后面緊跟版本號
svn add --no-ignore *------我們提交的時候,svn可能識別不到有些類型文件,比如so,增加這個可以提交
遞歸刪除目錄下.svn文件
find和xargs結合
? find . -name "*.svn" | xargs rm -rf
?
svn創建補丁
(1)創建當前目錄下補丁svn diff -r 39:390 > 39_390.patch
(2) 創建指定目錄補丁svn diff minui -r 39:390 > 39_3902.patch
(3)創建指定文件補丁:svn diff graphics_fbdev.cpp -r 39:390 > 39_3902.patch
svn創建命令http://embed.21ic.com/software/linuxos/201403/31527.html
svn add之后撤銷命令svn revert --recursive example_folder。
9.Android 性能分析工具dumpsys的使用
?Android提供的dumpsys工具可以用于查看感興趣的系統服務信息與狀態,手機連接電腦后可以直接命令行執行adb shell dumpsys 查看所有支持的Service但是這樣輸出的太多,可以通過dumpsys | grep "DUMP OF SERVICE" 僅顯示主要的Service的信息
?
也可以單獨列出某個系統服務的,比如battery,命令:dumpsys battery,如果想知道具體可以做哪些操作可:dumpsys battery -h來查看,比如我們想設置電量百分比,可以
dumpsys battery set level 5。
?
10. /sys/kernel/debug/msm_otg
調試路徑
11.編譯和替換framework部分
比如修改\frameworks\base\services\core\java\com\android\server\BatterySevice.java
編譯命令,編譯命令mmm frameworks/base/services/
?
user版本。Jar中的部分被編譯程序優化成了odex文件和jar文件,請看log最后一行。
但是user你們應該沒有權限push進去的。
?
如果你們要調試,請編譯eng版本的jar,這樣jar應該就是完整的2m大小了。
?
?
?
adb remount
adb push services.jar /system/framework/
adb reboot
?
11.手動設置電池容量
echo 50 > sys/modules/qpnp_bms/parameters/bms_fake_battery
?
13.linux主要目錄的一樣
/proc/devices文件可以獲知系統中注冊的設備,第1列為主設備號,第2列為從設備名
?
14.快遞定位問題
(1) 通過logo定位具體的地方
看日志,在差不多的地方加個dump_stack() 就很容易看出來調用關系
15.系統屬性
(1) msm8909系統屬性文件
device/qcom/msm8909/system.prop
?
16.測試模式
?
從2016.0115日開始系統,默認關閉測試模式,相對之前默認打開測試默認,有以下變化:
(1) 接入USB線,需要選擇才能打開USB debug模式
(2) USB模式默認為MTP,之前為charging模式
(3) 開機后,我們刷機軟件QFIL識別不到端口(但關機狀態下同時按下兩個側按鍵+power按鍵,還是可以正常刷機)
?
?
17.vmlinux
位于\out\target\product\msm8909\obj\KERNEL_OBJ文件夾下,
vmlinux是未壓縮的內核,vmlinux 是ELF文件,即編譯出來的最原始的文件。用于kernel-debug,產生system.map符號表,不能用于直接加載,不可以作為啟動內核。只是啟動過程中的中間媒體
vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制
以是我在CSDN中看到的,可以使用反匯編查看這個文件:
arm-eabi-objdump -d kernel/vmlinux > 1.S
18. 關機充電部分編譯
比如修改system\core\healthd文件夾的代碼,用make bootimage編譯即可,此文件夾生成的healthd在out\target\product\msm8909\symbols\sbin文件夾下
?
19.adb shell top看看資源占用情況
?adb?shell?top看看資源占用情況
?adb?shell?top看看資源占用情況
20.ROM助手可編輯img文件
?
21. 設備樹dt.img中的entry數量由dts和dtsi文件的"compatible"條目數量決定
點擊打開鏈接
?
22.編譯命令
- m: ? ? ? Makes from the top of the tree.
- mm: ? ? ?Builds all of the modules in the current directory, but not their dependencies.
- mmm: ? ? Builds all of the modules in the supplied directories, but not their dependencies.
? ? ? ? ? ?To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma: ? ? Builds all of the modules in the current directory, and their dependencies.
- mmma: ? ?Builds all of the modules in the supplied directories, and their dependencies.
?
23.croot命令可直接回到代碼根目錄
?
24.system\core\init打印調試信息
比如init.c下main():
KLOG_ERROR(LOG_TAG,"main() test --->error\n");//串口打印出來
KLOG_DEBUG(LOG_TAG,"main() test --->DEBUG\n");//串口打印不出來
編譯boot.img即可
?
26./proc/cpuinfo、cmdline對應硬件信息和內核啟動參數
27.獲取屬性值,比如getprop ro.build.product
28.系統屬性文件,在\bionic\libc\include\sys\_system_properties.h定義
#define PROP_PATH_RAMDISK_DEFAULT ?"/default.prop"
#define PROP_PATH_SYSTEM_BUILD ? ? "/system/build.prop"
#define PROP_PATH_SYSTEM_DEFAULT ? "/system/default.prop"
#define PROP_PATH_VENDOR_BUILD ? ? "/vendor/build.prop"
#define PROP_PATH_LOCAL_OVERRIDE ? "/data/local.prop"
#define PROP_PATH_FACTORY ? ? ? ? ?"/factory/factory.prop"
?
29.查找代碼
技巧:
? 在調試或理解系統的工作原理的時候,我們經常要去找服務程序對應的源碼。
? 尋找c或c++程序的源碼文件:
? 例如:以尋找init程序對應的源碼為例。
? ?find ./ -name Android.mk -exec grep -l init {} \;
? 注:通過find命令查找所有的Android.mk, 通過grep從中查找程序字符串,得到其路徑,然后去路徑下找源碼即可,這么做的原因是,c或c++代碼都是通過Android.mk來指導編譯的。
? ?尋找java源碼文件:
? ?java源碼的特點是和類名一致,所以如果我們知道一個類名,找其java源碼就直接加上java后綴即可。
? 例如:尋找com.android.internal.os.ZygoteInit類的代碼。
? ?find ./ -name ZygoteInit.java
?
30.system\core\rootdir\init.rc
需要注意的是,各個trigger的加載順序,先加入的先執行,后加入的后執行,要特別注意,尤其是要修改init.rc文件的時候,不了解這個容易因為前后依賴關系造成問題。
31.Android屬性服務
Android為了存儲全局系統設置信息,提供了一個系統屬性共享內存區,這個共享內存區的內容是一些鍵值對的列表,對外提供get和set方法讀寫屬性。系統啟動時由init初始化并開啟屬性服務。
?
32.system/build.prop
build.prop和上節說得根文件系統中的default.prop文件格式一樣,都稱為屬性配置文件。它們都定義了一些屬性值,代碼可以讀取或者修改這些屬性值。屬性值有一些命名規范:
ro開頭的表示只讀屬性,即這些屬性的值代碼是無法修改的。
persist開頭的表示這些屬性值會保存在文件中,這樣重新啟動之后這些值還保留。
其它的屬性一般以所屬的類別開頭,這些屬性是可讀可寫的,但是對它們的修改重啟之后不會保留。
?
33.MPSS和APSS
APSS指應用子系統,Application subsystem
MPSS是指modem應用子系統,Modem Application susbsystem
?
34.策略文件,比如init.te,te是指TypeEnforcement Access Control(簡稱TEAC,一般用TE表示)
35?frameworks\base\packages\SettingsProvider\res\values\defaults.xml
有很多開機默認的設置,比如開機不鎖屏<bool name="def_lockscreen_disabled">false</bool>
?
36.framework層的JNI源代碼:frameworks\base\core\jni
frameworks\base\services\core\jni
?
37.編譯so并快速打包到system.img中
用mmm命令編譯,用make snod打包到system.img中。
?
38.Android studio官網:點擊打開鏈接
39. init.rc
mkdir /data/misc 01771 system misc
命令 ?文件路徑 ?權限 所有者 所有組
?
40. adb shell service list查看系統中注冊了哪些service
41.?adb shell
getprop可以查看一系列系統屬性值
getprop |grep xxx.xxx.xx 過濾查看特定系統屬性值
42.?默認預置apk到system/app/目錄(普通系統apk,不可卸載),預置apk到system/priv-app/目錄(系統核心apk,不可卸載),app對應的Android.mk下增加LOCAL_PRIVILEGED_MODULE := true,表示生成的apk放在system/priv-app/目錄下。
?
43. 編譯服務器編譯不同版本android的方法,比如android5.1用openjdk-7-jdk,android7.1用openjdk-8-jdk,可以用不同的用戶安裝不同版本來編譯,或是同一個用戶手動切換Java版本:?sudo update-alternatives --config java ? ? ? ?sudo update-alternatives --config javac
44.監測內存及CPU情況,可用安兔兔測評軟件
45.dumpsys telephony.registry可獲取telephony狀態,可以看網絡注冊狀態,數據鏈接狀態,是否漫游,信號強度,等等,參數我就不一一解毒了,跟android系統版本也有關系
46 jdk版本選擇
比如ubuntu系統中安裝了openjdk-7-jdk和openjdk-8-jdk,通過下面的命令可以切換
sudo update-alternatives --config java
sudo update-alternatives --config javac
?
47updatezip升級設置目錄和文件權限
android7.1set_metadata_recursive和set_metadata命令,主要是修改文件或目錄權限和屬組等信息
比如:set_metadata("/system/bin/login","uid", 0, "gid", 0, "mode", 0755,"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");---
第1個0表示ROOT,上帝用戶: ROOT, 他的UID= 0; 上帝用戶永遠屬于任何UID
Uid和gid的值system\core\include\private\android_filesystem_config.h定義,比如:
?
48.?adb的adb shell pm list packages命令用來查看當前設備app應用包
49.android8.1設備數中可設置要掛載的分區
kernel\msm-3.18\arch\arm\boot\dts\qcom\tps950\sim8950-msm8953.dtsi
50.通過AT命令撥打電話:echo -e "ATD123456789;\r" > /dev/smd11,撥打123456789的號碼,smd11這里是modem串口
51.android手動修改density(dpi)的方法
adb shell getprop ro.sf.lcd_density
52. 查看版本信息dumpsys package com.alipay.zoloz.smile | grep version
53?通過adb命令獲取apk的安裝路徑:adb shell pm path +apk包名
54. 通過包名查看正在運行的進程ID(PID)
adb shell pidof 包名
總結
以上是生活随笔為你收集整理的Android开发概要记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OV5640全景模式预览倒180度,拍照
- 下一篇: linux设备和驱动加载的先后顺序