年终小盘点:这十八个Android开发必备知识点,你都知道吗?
本文旨在重点阐述 Android 相关知识,并帮助掌握其核心开发要点。
一、获取CPU温度信息
二、与开机向导相关的调试方法
三、获取应用启动时间信息
四、检测user和userdebug版本的方法
五、设置截屏默认存储路径
六、解析kernel dump文件的方法
七、SPRD平台默认打开Ylog日志并启用dumpsys方法
八、在低内存环境(如剩余1G内存)下消除模糊效果的技术手段
九、配置MTK日志模式的方法
十、在MTK平台上仅启用Mobile log的方法
十一、在SPRD平台上仅启用Android log的方法
十二、SPRD平台功耗日志注意事项
十三、获取Top Activity组件的包名
十四、调整Google开机向导欢迎界面的文字内容
十五、在状态栏中显示时间秒数的操作
十六、判断多用户配置是否生效的方法
十七、“low RAM (1G)”模糊效果去除方案
十八、“屏幕四周圆角”的解决方案
如需回顾往期学习资料,请访问我的个人GitHub链接:https://github.com/Meng997998/AndroidJX
一、查看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

CPU 温度查看命令方法
通过查看 CPU 温度数据时发现其数值表示为小数点后三位的位置,在实际应用中选择将小数点省略以简化计算过程,则此方法特别适用于MTK 平台
- 3.MTK log 中查看CPU 温度
kernel log中 搜索关键字 T_AP 查看CPU 温度。

二、 开机向导调试相关方法
1.debug 版本跳过开机向导方案
依次执行四个快捷操作
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不可用。此时应该将开机向导的状态启用为enable状态。
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 | search "Displayed" 来快速获取显示内容。另一种方法是快速获取 adb Log 文件后接着查找所需的关键字。

APP 冷启动时间统计

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);
五、修改截屏默认存储路径
该类提供一个静态方法main用于输出全局屏幕快照功能
// 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

将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

使用 log 命令 读取log 到指定文件
七、SPRD 默认打开 Ylog 以及dumpsys enable方法
在 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这一属性进行设置既可
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方法
通过输入暗码 ## # # # # # # ## 登录至 MTK LOGGER 界面,在右侧顶部区域点击打开了 LOGGER SETTING,在此之后手动禁用了所有的设备日志记录开关并开启了(Mobile Log)记录功能
关闭方法请看下图:

mtk 平台开启 Mobile log 参考图
十一、SPRD平台 只开Android log方法
##83781##
Settings
Custom Scene
请输入暗码【##83781##

SPRD 平台开启 Android log 参考图
十二、SPRD 平台功耗 Log 注意事项
只开 Android Log(参考十一、SPRD平台 只开Android log方法)
进入DEBUG&Log界面,system info-> Power Log;
打开PowerGuru log和wakelock log;
重启设备。
使用下面命令,复位一下battery history
adb shell dumpsys batterystats --enable full-wake-historyadb shell dumpsys batterystats --reset
- 测试完成后,使用下面命令,抓取
bugreport
adb rootadb bugreport > bugreport.zip
- 最后将
andorid log和bugreport.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版本中,为了确保系统的性能不受影响略微降低了用户界面的整体体验,例如最近的任务列表呈现模糊状态,设置界面的加载过程从模糊状态逐渐变为清晰显示,主图标加载过程同样经历了从模糊到清晰的状态变化。然而,这种权衡虽然合理但确实对用户体验造成了较大负面影响,个人认为这样的设计存在明显问题,建议采取以下措施:
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 目录下,具体位置为 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架构师学习资料大全
