響應式網(wǎng)站費用中國制造網(wǎng)外貿平臺
目錄
1 Android代碼分層調試
1 打印分層
2 代碼目錄分層,編譯,及替換的so
2 Android java層常用調試手段
1 Java層加打印和打印調用棧
2 sleep
3?打印類名,方法名,文件名和行數(shù)
3 Android cpp層常用調試手段
?1 cpp層加打印和打印調用棧
2 address2line
4 adb調試常用
1 adb shell dumpsys
2 adb shell進入root
3 adb安裝/查找/卸載apk/清除apk緩存
4 adb抓取android圖片
5 安裝adb驅動
6?adb查看進程信息
7 adb push
8 adb fastboot燒機
9 adb remount失敗,顯示"Read-only system?push failed"
10?adb shell getproperty
1 Android代碼分層調試
1 打印分層
1 HYH_SnapdragonCamera:
printDebug.printLine()
2 HYH_frame_base_java:
System.out.println( "HYH_frame_base_java: getPersistedString mKey:" + mKey);
printLine();??
3 HYH_frame_base_jni:
ALOGE("HYH_frame_base_jni: %s (line = %d)", __FUNCTION__, __LINE__);
4 HYH_frame_av:
ALOGE("HYH_frame_av: %s: %d", __FUNCTION__,__LINE__);
5 HYH_hardware_interfaces:
ALOGE("HYH_hardware_interfaces: %s: %d", __FUNCTION__,__LINE__);
6 HYH_vendor_camx:
CAMX_LOG_ERROR(CamxLogGroupHAL, "HYH_vendor_camx:?test");
7 HYH_vendor_chi:
CHX_LOG_ERROR("HYH_vendor_chi:?(thread)%lu",pthread_self());
LOG_ERROR("HYH_vendor_chi:", "XXX");
2 代碼目錄分層,編譯,及替換的so
1 Java層代碼:
caf/packages/apps/SnapdragonCamera
git:caf/packages/apps/SnapdragonCamera
編譯:mm
替換system\priv-app\SnapdragonCamera\SnapdragonCamera.apk
2 Framework層的Java層代碼:
caf/frameworks/base/core/java/android/hardware/camera2
git:caf/frameworks/base/core/java
編譯:make -j48,全編譯
替換system.img
3 Framework層的Jni層代碼:
caf/frameworks/base/core/jni
git: caf/frameworks/base/core/jni
編譯:替換system/lib64/libandroid_runtime.so(64位)
4 Framework層的native層代碼:(aidl的binder)
caf/frameworks/native
git:caf/frameworks/native
編譯:替換libbinder.so
5 Framework層的C層代碼:
caf/frameworks/av
git:caf/frameworks/av
編譯:沒找到部分編譯,先全編譯make -j48
//caf/frameworks/av/services/camera/libcameraservice
替換libcameraservice.so??
//caf/frameworks/av/camera/CameraMetadata.cpp
替換libcamera_client.so(64位)? ?? ??? ?//32位的庫也跑,是其他接口在跑!!!
?? ??
6 Hal層的interfaces層代碼:
caf/hardware/interfaces
git:caf/hardware/interfaces
編譯:沒找到部分編譯,先全編譯make -j48
configureStreams_3_3
替換camera.device@3.3-impl.so
processCaptureRequest?processOneCaptureRequest
替換camera.device@3.2-impl.so??
7 Vendor層的Camx層代碼:
caf/vendor/qcom/proprietary/camx
git:caf/vendor/qcom/proprietary/camx
編譯:mm
替換camera.qcom.so
8 Vendor層的Chi層代碼:
caf/vendor/qcom/proprietary/chi-cdk
git:caf/vendor/qcom/proprietary/chi-cdk
編譯:mm
替換com.qti.chi.override.so
2 Android java層常用調試手段
1 Java層加打印和打印調用棧
Slog.e(TAG,"freeformWindowManagement: " + freeformWindowManagement);Log.e(TAG,"mHasFreeformWorkspaceSupport:" + mHasFreeformWorkspaceSupport);import android.os.Debug;Debug.getCallers(10);
2 sleep
try{Thread.sleep(2000);}catch (Exception e ){}
3?打印類名,方法名,文件名和行數(shù)
public class printDebug {public static void printLine(){StackTraceElement[] trace = new Throwable().getStackTrace();//下標為0的元素是上一行語句的信息, 下標為1的才是調用printLine的地方的信息StackTraceElement tmp = trace[1];System.out.println( "XXX:?"+tmp.getClassName() + "." + tmp.getMethodName()+ "(" + tmp.getFileName() + ":" + tmp.getLineNumber() + ")");}public static void printLine(String content){StackTraceElement[] trace = new Throwable().getStackTrace();//下標為0的元素是上一行語句的信息, 下標為1的才是調用printLine的地方的信息StackTraceElement tmp = trace[1];System.out.println( "XXX:?"+tmp.getClassName() + "." + tmp.getMethodName()+ "(" + tmp.getFileName() + ":" + tmp.getLineNumber() + ")??"+ content);}
}
3 Android cpp層常用調試手段
?1 cpp層加打印和打印調用棧
#include <log/log.h>
ALOGE("xxx.\n");
ALOGE("%s:%s:%d tag:%d", __FILE__,__FUNCTION__,__LINE__,command);#include <utils/CallStack.h>
android::CallStack stack;
stack.update();
stack.log("getStack:", ANDROID_LOG_ERROR, "pre");Android.mk:
LOCAL_SHARED_LIBRARIES += libutils
// 注意:Android P是LOCAL_SHARED_LIBRARIES += libutilscallstack
// 否則如下錯誤 error: undefined reference to 'android::CallStack::update(int, int)'
2 address2line
案例:
4 adb調試常用
1 adb shell dumpsys
[1]?adb shell dumpsys meminfo
adb shell dumpsys meminfo <package_name>
其中,package_name 也可以換成程序的pid,pid可以通過 adb shell ps 來查找
下圖是某個程序的內存使用情況:
重點關注如下幾個字段:
(1)Native/Dalvik 的 Heap 信息
具體在上面的第一行和第二行,它分別給出的是JNI層和Java層的內存分配情況,如果發(fā)現(xiàn)這個值一直增長,則代表程序可能出現(xiàn)了內存泄漏。
Java Heap:Java層內存
Native Heap:JNI層內存
(2)Total 的 PSS 信息
這個值就是你的應用真正占據(jù)的內存大小,通過這個信息,你可以輕松判別手機中哪些程序占內存比較大了。
TOTAL:占用內存總量
最常見內存泄漏的是調用流程問題,如:
在選擇不同jpg時會調用Native_Uninit,但是同一個jpg選擇不同模式時沒有調用Native_Uninit(只調用Native_Process,Native_Process里alloc了內存卻沒有釋放),最終導致內存泄漏。
[2] adb shell dumpsys activity top?????????
顯示當前Activity和View Hierarchy
[3] adb shell dumpsys package com.pingan.smt
查看包的信息
2 adb shell進入root
adb root?? ?? ? //adb root失敗:需要打開USB調試模式!!!
adb remount
adb shell
exit? ? ? ? ?? ??? ?//退出adb shell
3 adb安裝/查找/卸載apk/清除apk緩存
adb install -r -d ishenzhen.apk
adb shell pm list packages -3? ? ??? ? ?//-3 查找apk,不包含預置apk
adb unintall com.pingan.smt
adb shell pm clear com.pingan.smt
4 adb抓取android圖片
adb shell screencap -p /sdcard/DCIM/1.png
adb pull /sdcard/DCIM/1.png ./
5 安裝adb驅動
如何安裝adb驅動 安裝adb驅動的方法_手機-百度經(jīng)驗
adbdriver.zip
重啟電腦,adb shell,檢查adb驅動是否安裝成功
6?adb查看進程信息
adb shell ps
VSZ:虛擬內存
RSS:實際常駐內存
adb shell ps | findstr "portraitlightingeditor"
window下"grep"用的是findstr
7 adb push
adb push C:\Users\xxx\Desktop\camera.sdm660.so /vendor/lib/hw/
注意:adb push so后需要adb reboot!!!
8 adb fastboot燒機
1 adb reboot bootloader
2 運行平臺相關的flash.bat腳本
flash.bat:
echo Start flashing......
fastboot flash abl abl.elffastboot flash system system.img
fastboot flash boot boot.img
fastboot flash vendor vendor.img
fastboot flash userdata userdata.img
fastboot flash persist persist.imgecho Press "enter" to exit
pause
9 adb remount失敗,顯示"Read-only system?push failed"
1. adb root
2. adb remount
3. adb disable-verity
4. adb reboot
5. adb root
6. adb remount
10?adb shell getproperty
adb shell getproperty前需要adb shell setenforce 0