1. 程式人生 > >android_qqApk反編譯/android小工具/ddms截圖

android_qqApk反編譯/android小工具/ddms截圖


  qqApk反編譯:
  android,開一個QQ,後臺顯示執行3個QQ程式:QQ的執行元件;配置檔案780行;12個service;15個receiver;309個activity;
  <manifest **>
    <permission android:name="com.tencent.msf.service.permission" android:protectionLevel="signature" />
    <permission android:name="com.tencent.msf.permission.account.sync" android:protectionLevel="normal" android:permissionGroup="android.permission-group.SYSTEM_TOOLS" />
    <permission android:name="com.tencent.mobileqq.activity.starterreceiver.permission.OWNER" android:protectionLevel="signature" />
    <service android:name="com.tencent.mobileqq.msf.service.MsfService" android:exported="true" android:process=":MSF">
      <intent-filter><action android:name="com.tencent.qphone.base.subservice" /></intent-filter>
    </service>
    <service android:name="com.tencent.mobileqq.msf.core.wtlogin.WtLoginService" android:process=":MSF" />
    <service android:name=".app.CoreService" />
    <receiver android:name="com.tencent.mobileqq.msf.core.NetConnInfoCenter" android:process=":MSF"> ***** </receiver>
    <service android:name="com.tencent.mobileqq.emosm.web.MessengerService" android:exported="false" />
    <service android:name="com.tencent.av.service.QQServiceForAV" />
    <service android:name="com.tencent.av.service.AVServiceForQQ" android:process=":video" />
    <service android:name="com.tencent.securemodule.impl.SecureService" android:process=":remote" />
    <service android:name="com.tencent.imageservice.ImageProcessService" android:process=":imageservice" />
    <service android:name="cooperation.qzone.QzonePluginProxyService" android:process=":qzone" />
    <service android:name="cooperation.qzone.QzonePictureViewerProxyService" android:exported="true" android:process=":picture" />
    <service android:name="com.tencent.tmassistantsdk.downloadservice.TMAssistantDownloadSDKService" android:exported="false" android:process=":TMAssistantDownloadSDKService" />
    <service android:name="com.tencent.mobileqq.service.QQPlayerService" />
  </manifest>
 


  android開發小工具:
  HierarchyView,弄處正在現實view的結構;
  MemoryAnalyzer,記憶體分析;
  AllocationTracker,記憶體分配跟蹤;
  Heap,堆記憶體資訊;
  DdmsTrace:分析方法呼叫的次數,呼叫時間等;
  SystemInformation:(CpuLoad,MemoryUsage,FrameRenderTime);
  eclipse截圖:Ddms中ScreenCapture;   eclipse手機UI資訊:Ddms中DumpViewHierarchyForUiAutomator;
  測試分析:monkey,monekyrunner,uiautomator,Robotium(同一簽名許可權),單元測試,啟動效能;

  啟動過程:Init程序->Zygote程序->SystemServer程序->SurfaceFlinger服務; Init是linux啟動的第一個程序,Zygote就是由Init程序fork出來的;
  SurfaceFlinger直譯就是surface的投遞者;每個應用在它自己的surface完成各種圖形操作後,請求SurfaceFlinger顯示到螢幕,surfaceflinger就會將所有的surface疊加起來,並且反映到framebuffer;
  SurfaceFlinger服務執行在Android系統的System程序中,它負責管理Android系統的幀緩衝區(FrameBuffer);
  SurfaceFlinger.cpp繼承了BinderService<SurfaceFlinger>/BnSufaceComposer/IBinder::DeadthRecipient/Thread/HWComposer::EventHandler;
  ListView優化:convertView的重複利用(item量大),利用WeakRefference(item量小);   scrap,廢料;
  convertView是在AbsListView類中的obtainView方法中取出來的,mRecycleBin.getScrapView(position);同一個View物件不能同時被展示多次;

  除錯工具traceView的使用:
  內部通過android.os包下,public final class Debug{ *** }實現;//生成的檔案儲存在/sdcard/dmtrace.trace;
  可檢視說明,每行下面粗的線段標註了ProfilePanel中被選中函式呼叫所消耗的時間段,每個線段對應一次函式的執行; Calls+RecurCalls/Total:非遞迴呼叫和遞迴呼叫的次數;    time/calls:表示平均的呼叫時間;

  tcpdump和wireshark使用:
  安裝tcpdump,$adb root;  $adb push tcpdump /data/local/tcpdump;  $adb shell chmod 6755 /data/local/tcpdump;
  啟動tcpdump,$adb shell /data/local/tcpdump -n -s 0;  $adb shell /data/local/tcpdump -i any -p -s 0 -w /sdcard/netCapture.pcap;  $adb pull /sdcard/netCapture.pcap
  wireshark,安裝$sudo apt-get install wireshark;  $wireshark netCapture.pcap;

  DDMS截圖:
  DDMS通過adb呼叫裝置端的adbd(ADB daemon)提供的framebuffer service進行截圖(原始碼在system/core/adb/framebuffer_service.c),在較早版本的Android中,framebuffer service通過直接讀framebuffer裝置(/dev/graphics/fb0)來截圖,在較新版本的Android中,framebuffer service則呼叫截圖工具screencap來截圖;
  screencap是Android原生自帶的工具,是一個C寫的可執行檔案,在裝置上的/system/bin/下面可以找到它,screencap截圖後可儲存為PNG格式檔案或RGB RAW檔案.
  screencap的原始碼在frameworks/base/cmds/screencap/,它呼叫SurfaceFlinger提供的截圖介面ScreenshotClient,其原始碼在frameworks/native/include/gui/SurfaceComposerClient.h; ScreenshotClient通過程序間通訊呼叫SurfaceFlinger service的截圖功能,原始碼在frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp中的函式SurfaceFlinger::captureScreen(*);
  在各種截圖方法中,讀framebuffer裝置(/dev/graphics/fb0)在某些使用硬體overlay顯示時可能無法擷取到某些畫面(例如video playback和camera preview畫面),但是SurfaceFlinger提供的上述截圖介面則可以完美擷取任何螢幕畫面;
  截圖操作方法:同時按下電源鍵和"音量-"鍵1秒,原始碼在frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java,呼叫hide類SurfaceControl的screenshot方法;
   SurfaceControl.screenshot(*);//android.view包下hide類;  內部調jni的nativeScreenshot(*);  內部調SurfaceComposerClient.h的,ScreenshotClient::capture(*);