1. 程式人生 > >Android開發概要記錄

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-------更新到指定版本,也可以用於回退到哪個版本做測試驗證

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 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應用包