年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

yilian發表於2020-01-07

本篇文章主要介紹  Android 開發中的部分知識點,透過閱讀本篇文章,您將收穫以下內容:

一、檢視CPU溫度
二、開機嚮導除錯相關方法
三、檢視APP啟動時間
四、判斷 user,userdebug 版本的方法
五、修改截圖預設儲存路徑
六、解析 kernel dump 方法
七、SPRD 預設開啟 Ylog 以及dumpsys enable方法
八、判斷是否正在 monkey 測試的方法
九、修改MTK log 模式的方法
十、MTK平臺只開Mobile log方法
十一、SPRD平臺 只開Android log方法
十二、SPRD平臺功耗 Log 注意事項
十三、獲取Top Activity 包名
十四、 修改Google 開機嚮導歡迎語
十五、修改狀態列 時間顯示秒
十六、判斷多使用者方法
十七、低RAM(1G)下的模糊效果去除
十八、螢幕四周圓角方案

想看以往學習內容的朋友
可以看我的GitHub:

一、檢視CPU 溫度

  • 1.使用ADB 檢視CPU溫度(debug版本)

檢視CPU命令如下:

adb shell cat /sys/class/thermal/thermal_zone*/temp
  • 2.檢視CPU 返回內容對應分類資訊
adb shell cat /sys/class/thermal/thermal_zone*/type
年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

CPU 溫度檢視命令方法

由此檢視的 CPU 溫度包含小數點後三位,小數點省去,此方法適用於MTK 平臺。

  • 3.MTK log 中檢視CPU 溫度

kernel log中 搜尋關鍵字 T_AP 檢視CPU 溫度。

年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

二、 開機嚮導除錯相關方法

1.debug 版本跳過開機嚮導方案

  • 1.點選四次快捷操作
    連續點選螢幕四角(左上-->右上-->右下-->左下),既可跳過開機嚮導。

  • 2.adb 命令disable 開機嚮導

adb shell settings put secure user_setup_complete 1adb shell settings put global device_provisioned 1adb shell pm disable com.google.android.setupwizard/.SetupWizardActivity

2.debug 重啟 開機嚮導方案

跳過開機嚮導 後 又想重新走開機嚮導,可以嘗試以下命令。

  • 1.將開機嚮導 完成後設定的值復位

命令如下:

adb shell settings put secure user_setup_complete 0adb shell settings put global device_provisioned 0
  • 2.設定開機嚮導可用,並啟動

過完開機嚮導後,會設定開機嚮導 apk不可用。
此時我們應該設定開機嚮導為 enble狀態。

adb shell pm enable com.google.android.setupwizard/.SetupWizardActivityadb shell am start -n com.google.android.setupwizard/.SetupWizardActivity

3. 開機嚮導 log 除錯

開啟開機嚮導除錯 Log方式如下:

adb shell setprop log.tag.SetupWizard VERBOSE

4. 程式碼中跳過開機嚮導的方法

在程式碼中跳過開機嚮導的方法如下:

        private  void  SkipSetupwizard(){            ActivityManager activityAanager = (ActivityManager) mContext                .getSystemService(Context.ACTIVITY_SERVICE);            ComponentName cn = activityAanager.getRunningTasks(1).get(0).topActivity;            String pName = cn.getPackageName();            if("com.google.android.setupwizard".equals(pName))            {                Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);                Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);                activityAanager.forceStopPackage("com.google.android.setupwizard");                Log.i("wjwj","----------skip com.google.android.setupwizard--------");            }               }

三、檢視APP啟動時間

1.使用adb 命令抓log 檢視

adb logcat | findstr Displayed
或者直接抓取 adb Log, 然後搜尋關鍵字 Displayed

年終小盤點:這十八個Android開發必備知識點,你都知道嗎?


APP 冷啟動時間統計

年終小盤點:這十八個Android開發必備知識點,你都知道嗎?


adb Log 中搜尋關鍵字Display

2.檢視多次 app 冷啟動的方法

測試 10次 Chrome 冷啟動的方法如下:
adb shell am start -S -R10 -W com.android.chrome/com.google.android.apps.chrome.Main

測試結果如下:

C:\Users\Administrator>adb shell am start -S -R10 -W com.android.chrome/com.google.android.apps.chrome.MainStopping: com.android.chromeStarting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.chrome/com.google.android.apps.chrome.Main }Status: okActivity: com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivityTotalTime: 1514WaitTime: 1525CompleteStopping: com.android.chromeStarting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.android.chrome/com.google.android.apps.chrome.Main }Status: okActivity: com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivityTotalTime: 534WaitTime: 549Complete

四、判斷 user ,userdebug 版本的方法

private static final boolean USER_BUILD = android.os.Build.IS_USER;

檢視 Build.java 發現,這些是對外部apk 隱藏的方法,只有系統平臺 簽名的應用才可以使用。

    /** {@hide} */    public static final boolean IS_ENG = "eng".equals(TYPE);    /** {@hide} */    public static final boolean IS_USERDEBUG = "userdebug".equals(TYPE);    /** {@hide} */    public static final boolean IS_USER = "user".equals(TYPE);

五、修改截圖預設儲存路徑

/frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java

       // import com.mediatek.storage.StorageManagerEx;       String defaultWritePath = StorageManagerEx.getDefaultPath()+File.separator+"Pictures";        mScreenshotDir = new File(defaultWritePath, SCREENSHOTS_DIR_NAME);

六、解析 kernel dump 方法

1.將所有的systemdump 檔案追加到一個檔案中

首先我們需要抓到dumpsys log,然後將所有的systemcore* 檔案 追加到一個檔案中。

cat systemcore* > all
年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

將sysdump 所有檔案 追加到一個檔案中

2. 使用對應版本的vmlinux 解析dump檔案

使用 crash_arm 命令對 dump 檔案進行解析

  • 32位系統使用如下:
    ./crash_arm vmlinux all -m phys_base=0x80000000

  • 64位系統使用如下命令:
    ./crash_arm64 vmlinux all -m phys_offset=0x80000000

3.解析成功後進行除錯

成功解析dump後解析log方法
log > log.txt

年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

使用 log 命令 讀取log 到指定檔案

七、SPRD 預設開啟 Ylog 以及dumpsys enable方法

修改  device\sprd\xxxx\common\rootdir\root\init.common.rc
on post-fs-data 中新增如下內容:

on post-fs-data     .....       setprop persist.ylog.enabled 1//增加這一句用於開啟ylog       setprop  debug.sysdump.enabled  true //增加這一句用於開啟sysdump       setprop   persist.sys.eng.reset 1 //再增加這一句       start ylog

八、判斷是否正在 monkey 測試的方法

    public boolean isMonkeyRunning() {        return ActivityManager.isUserAMonkey();    }

九、修改MTK log 模式的方法

修改以下路徑下配置的屬性值既可 alps\device\mediatek\common\mtklog
false 改為 true就可以開啟對應的log

mtklog_path = internal_sdcom.mediatek.log.mobile.enabled = falsecom.mediatek.log.mobile.maxsize = 500com.mediatek.log.mobile.totalmaxsize = 1000com.mediatek.log.modem.enabled = falsecom.mediatek.log.modem.maxsize = 2000com.mediatek.log.net.enabled = falsecom.mediatek.log.net.maxsize = 600com.mediatek.log.gps.enabled = false

十、MTK平臺 只開Mobile log方法

輸入暗碼  *#*#3646633#*#*,進入 MTK Logger 介面,右上角開啟 Logger Setting,手動關閉除 Moblie Log之外的開關。

關閉方法請看下圖:

年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

mtk 平臺開啟 Mobile log 參考圖

十一、SPRD平臺 只開Android log方法

輸入暗碼  *#*#83781#*#*,進入 SPRD Logger 介面,右上角開啟 Settings, 點選 Custom scene,關閉除 Android log之外的開關,關閉方法請看下圖。

年終小盤點:這十八個Android開發必備知識點,你都知道嗎?

SPRD 平臺開啟 Android log 參考圖

十二、SPRD 平臺功耗 Log 注意事項

  1. 只開 Android Log( 參考十一、SPRD平臺 只開Android log方法

  2. 進入 DEBUG&Log介面, system info->  Power Log;

  3. 開啟 PowerGuru logwakelock log

  4. 重啟裝置。

  5. 使用下面命令,復位一下 battery history

adb shell dumpsys batterystats --enable full-wake-historyadb shell dumpsys batterystats --reset
  1. 測試完成後,使用下面命令,抓取 bugreport
adb rootadb bugreport > bugreport.zip
  1. 最後將 andorid logbugreport.zip 都提供出來。

十三、獲取Top Activity 包名

獲取Activity Top的方法如下:

//import android.app.ActivityManager;//import android.app.ActivityManager.RunningTaskInfo;//import android.content.ComponentName;//import java.util.List;// 獲取top Activity apk        public String getTopActivityPackageName(Context context) {            String topActivityPackage = null;            ActivityManager activityManager = (ActivityManager) (context                    .getSystemService(android.content.Context.ACTIVITY_SERVICE));            List<RunningTaskInfo> runningTaskInfos = activityManager                    .getRunningTasks(1);            if (runningTaskInfos != null) {                ComponentName f = runningTaskInfos.get(0).topActivity;                topActivityPackage = f.getPackageName();                 //Slog.e("wangjie", "------topActivityPackage---------"+topActivityPackage);            }            return topActivityPackage;        }

十四、 修改Google 開機嚮導歡迎語

孟加拉語開機嚮導歡迎語不對,客戶要求去掉開機嚮導介面歡迎語方法。

idh.code/frameworks/base/core/java/android/widget/TextView.java

public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {... ...     public void setTextLocale(@NonNull Locale locale) {+        // add for  Bangla language+        if (getContext().getClass().getName().equals("com.google.android.setupwizard.user.WelcomeActivity") &&+                locale.getLanguage().equals("bn") && locale.getCountry().equals("BD"))+        {+            Log.i(LOG_TAG, "find text:" + getText());+            if (!getText().equals("") && !getText().toString().contains("("))+            Log.i(LOG_TAG, "set text:" + getText());+            setText("");+        }+        // add for  Bangla language         mLocalesChanged = true;         mTextPaint.setTextLocale(locale);         ... ...          }... ...}

十五、修改狀態列 時間顯示秒

展訊平臺修改狀態列 時間顯示秒方法如下

adb shell pm enable com.android.systemui/com.android.systemui.tuner.TunerActivityadb shell am start -n com.android.systemui/com.android.systemui.tuner.TunerActivity

進入設定--系統--介面介面調諧器--狀態列--時間--顯示時分秒。

十六、判斷多使用者方法

判斷多使用者方法如下:

// import android.os.UserHandle;if(UserHandle.myUserId() != UserHandle.USER_OWNER){   // 給管理員使用者 進行操作}

十七、低RAM(1G)下的模糊效果去除

Android GO 版本下,為了相容系統效能,犧牲部分UI體驗,比如 最近任務列表模糊,Settings 介面載入由模糊到清晰,Launcher 圖示載入由模糊到清晰,但是這個很影響使用者體驗,個人認為不太好,去掉模糊效果的方案如下:

1.需要修改的檔案如下:

 frameworks/base/services/core/java/com/android/server/wm/AppWindowContainerController.java  frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java     frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
  • 1.AppWindowContainerController 修改方法

在AppWindowContainerController.java 類中,請註釋掉scheduleAddStartingWindow方法實現。

public class AppWindowContainerController        extends WindowContainerController<AppWindowToken, AppWindowContainerListener> {... ...// 註釋掉該方法    void scheduleAddStartingWindow() {        // Note: we really want to do sendMessageAtFrontOfQueue() because we        // want to process the message ASAP, before any other queued        // messages.        /***        if (!mService.mAnimationHandler.hasCallbacks(mAddStartingWindow)) {            mContainer.startingAdding = true;            if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING");            mService.mAnimationHandler.postAtFrontOfQueue(mAddStartingWindow);        } ***/    }... ...}
  • 2.TaskSnapshotController 修改方法

將系統手動設定為非低記憶體裝置,比如將isLowRamDevice =false狀態。

class TaskSnapshotController {... ...// 將系統手動設定為非低記憶體裝置  final boolean isLowRamDevice = false; //final boolean isLowRamDevice = ActivityManager.isLowRamDeviceStatic();... ...
  • 3.TaskSnapshotPersister 修改方法

在TaskSnapshotPersister 類中,將DISABLE_FULL_SIZED_BITMAPS狀態設定為false。

class TaskSnapshotPersister {... ...// 將DISABLE_FULL_SIZED_BITMAPS狀態設定為false。 static final boolean DISABLE_FULL_SIZED_BITMAPS = false;//static final boolean DISABLE_FULL_SIZED_BITMAPS = ActivityManager.isLowRamDeviceStatic();... ...}

十八、螢幕四周圓角方案

SPRD螢幕四周圓角方案需要修改***.dtsi 檔案。
以sc7731e.dtsi 為例,需要修改的檔案路徑為 kernel4.4/arch/arm/boot/dts/sc7731e.dtsi,其中 15 表示圓角的弧度,預設直角90度
修改方法如下:

soc: soc {        ap-ahb {            dispc0: dispc@20800000 {                ... ...                sprd,ip = "dpu-lite-r1p0";                sprd,soc = "pike2";                                // 15 表示圓角的弧度                sprd,corner-radius = <15>;                /* output port */                port {                    dispc0_out: endpoint@0 {                        remote-endpoint = <&dsi0_in>;                    };                };            };... ...}

最後

第一次看文章的朋友可以關注我和我的專欄,會不定期釋出大廠面試題、Android架構技術知識點及解析等內容,還有學習PDF+原始碼筆記+面試文件+進階影片分享

更多精彩學習內容就在  Android架構師學習資料大全


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2672365/,如需轉載,請註明出處,否則將追究法律責任。

相關文章