在我身边将近 80% 的朋友都是做 Android 的,他们都期望自己可以成为一名优秀的架构师。但从一名普通的程序员成长为架构师,需要付出的辛苦和努力远超过我们的想象。
我从拉勾网的调研结果发现:97% 的 Android 技术人都会面临这些困境(或许也是你的困惑):
- 缺乏技术广度和深度:如果你长期在小型软件公司或外包工作工作,是很难有机会经历完整且大型项目的开发,整个技术视野会比较窄,导致薪资长期处于停滞不前;
- 长期无法突破:长期重复同样的编码工作,项目对你的技术要求就是那些,不会让你按照自己的期望去发展,导致很长时间自己的能力都无法突破,企业更是难以接受新技术;
- 自学困难:白天要工作,晚上下班又晚,学习只能依靠碎片化的时间,但自控力差,三天打鱼两天晒网,无法系统性学习,无法沉淀成技术实力;
- 想进大厂无背书无通道:现有的技术能力、项目经验不足以通过大厂简历初筛,更别说拿到大厂的高薪 Offer。
不解决这些问题,如果你仅靠工作经验或者自学,想成为架构师简直太难了,等你到 35 岁的时候焦虑会像一块巨石,压在你身上。
所以接下来本篇文章主要介绍 Android 开发中的部分知识点,文末还有 高级架构技术进阶脑图、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)下的模糊效果去除
十八、屏幕四周圆角方案
一、查看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 温度。
kernel log中 搜索 T_AP查看CPU 温度二、 开机向导调试相关方法
1.debug 版本跳过开机向导方案
-
1.点击四次快捷操作
连续点击屏幕四角(左上-->右上-->右下-->左下),既可跳过开机向导。 -
2.adb 命令disable 开机向导
adb shell settings put secure user_setup_complete 1
adb shell settings put global device_provisioned 1
adb shell pm disable com.google.android.setupwizard/.SetupWizardActivity
2.debug 重启 开机向导方案
跳过开机向导 后 又想重新走开机向导,可以尝试以下命令。
- 1.将开机向导 完成后设置的值复位
命令如下:
adb shell settings put secure user_setup_complete 0
adb shell settings put global device_provisioned 0
- 2.设置开机向导可用,并启动
过完开机向导后,会设置开机向导apk
不可用。
此时我们应该设置开机向导为enble
状态。
adb shell pm enable com.google.android.setupwizard/.SetupWizardActivity
adb 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
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.Main
Stopping: com.android.chrome
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.chrome/com.google.android.apps.chrome.Main }
Status: ok
Activity: com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity
TotalTime: 1514
WaitTime: 1525
Complete
Stopping: com.android.chrome
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.android.chrome/com.google.android.apps.chrome.Main }
Status: ok
Activity: com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity
TotalTime: 534
WaitTime: 549
Complete
四、判断 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
将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
七、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_sd
com.mediatek.log.mobile.enabled = false
com.mediatek.log.mobile.maxsize = 500
com.mediatek.log.mobile.totalmaxsize = 1000
com.mediatek.log.modem.enabled = false
com.mediatek.log.modem.maxsize = 2000
com.mediatek.log.net.enabled = false
com.mediatek.log.net.maxsize = 600
com.mediatek.log.gps.enabled = false
十、MTK平台 只开Mobile log方法
输入暗码 *#*#3646633#*#*
,进入MTK Logger
界面,右上角打开Logger Setting
,手动关闭除Moblie Log
之外的开关。
关闭方法请看下图:
mtk 平台开启 Mobile log 参考图十一、SPRD平台 只开Android log方法
输入暗码 *#*#83781#*#*
,进入SPRD Logger
界面,右上角打开Settings
, 点击Custom scene
,关闭除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-history
adb shell dumpsys batterystats --reset
- 测试完成后,使用下面命令,抓取
bugreport
adb root
adb 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.TunerActivity
adb 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高级进阶知识点总结
在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android开发核心知识点笔记】
【Android思维脑图(技能树)】
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【Android高级架构视频学习资源】
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
【Android进阶学习视频】、【全套Android面试秘籍】关注我【主页简介】或者【简信我】查看免费领取方式!
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
网友评论