美文网首页Android进阶之路Android开发Android技术知识
Android年终盘点:阿里程序员必备技能知识点,程序员必须收藏

Android年终盘点:阿里程序员必备技能知识点,程序员必须收藏

作者: Z_萧晓 | 来源:发表于2019-12-26 16:06 被阅读0次

    在我身边将近 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

    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.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

    使用 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_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 平台开启 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-history
    adb shell dumpsys batterystats --reset
    
    1. 测试完成后,使用下面命令,抓取bugreport
    adb root
    adb 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.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学习PDF+架构视频+面试文档+源码笔记

    【Android开发核心知识点笔记】

    【Android思维脑图(技能树)】

    【Android核心高级技术PDF文档,BAT大厂面试真题解析】

    【Android高级架构视频学习资源】

    Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

    【Android进阶学习视频】、【全套Android面试秘籍】关注我【主页简介】或者【简信我】查看免费领取方式!

    至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    相关文章

      网友评论

        本文标题:Android年终盘点:阿里程序员必备技能知识点,程序员必须收藏

        本文链接:https://www.haomeiwen.com/subject/vqfloctx.html