我的私人博客:www.mrloveqin.top 可以免费查看
1.更新代码方式: repo sync -c --no-tags -r YB
c 或者–current-branch表示只拉取当前分支代码,坑爹啊,我在init指定了分支,同步的时候,你却悄悄给我拉些没用的。
–no-tags 不拉取tags,tag虽然不大,但架不住多
–no-clone-bundle 不使用clone.bundle,clone.bundle是git bundle一样的打包文件,使用bundle文件可以做cdn下载的分流,cdn听上去不错,但是如果cdn到google的服务器,或者clone.bundle本来就占空间,不是很划算,所以不使用clone.bundle
-f 如果sync失败,继续同步(想想当年LZ写了一个while循环解决同步失败终止问题的)
–force-sync 如果文件目录有差异,强制覆盖掉
原文:https://blog.youkuaiyun.com/counsellor/article/details/86591081
2.截屏:shift + prtscn
==3.编译脚本: ==
#!/bin/bash
cd android
./build/tinno_script/tinno_build.sh k510 userdebug clean
#./build/tinno_script/tinno_build.sh p160an userdebug clean myos
myos 是南京的apk仓库,不加这个参数的话就会使用本地的apk
运行build.bash脚本命令:chmod a+x build.sh
bash build.sh
4.预装apk:
第一步:在 /home/android/work/6739/android/vendor/tinno/product/k510/trunk/packages下创建kuaiya文件夹
kuaiya文件夹内把apk拷贝进去,然后新建Android.mk
Android.mk内容如下
LOCAL_PATH:= $(call my-dir)
#Add kuaiya
include $(CLEAR_VARS)
LOCAL_MODULE := kuaiya //生成应用文件夹名
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk //应用名称
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_PATH := $(TARGET_OUT)/preloadapp //应用生成路径
include $(BUILD_PREBUILT)
第二步在qmb_pk.mk文件里面的PRODUCT_PACKAGES内添加kuaiya
第三步编译环境: source build/envsetup.sh → lunch → mmm <要编译文件夹>
如:mmm vendor/tinno/product/k510/trunk/packages/kuaiya
等待编译成功
5.源码覆盖方式:
①:在项目的Android文件夹内新建覆盖文件夹
然后在文件内包含res文件夹,Android.mk ,AndroidManifest.xml
Res文件夹内创建要覆盖内容文件夹如:values文件夹内的strings.xml
Strings.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">kuaiya2</string>
</resources>
这里是覆盖app的名称
String.xml格式在apk反编译源码里面找
Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := kuaiyaOverlay
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
LOCAL_CERTIFICATE := shared
LOCAL_AAPT_FLAGS := --auto-add-overlay
include $(BUILD_PACKAGE)
AndroidManifest.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dewmobile.kuaiya.apps.messagingoverlay">
<overlay
android:targetPackage="com.dewmobile.kuaiya.apps.messaging"
android:priority="1" android:isStatic="true"/>
</manifest>
高亮内容需要到apk反编译源码里面找对应的包名替换
②编译环境: source build/envsetup.sh → lunch → mmm <要编译文件夹>
如:mmm kuaiyaOverlay/
等待编译成功
6.ubuntu下使用evince README.pdf命令可以直接在命令行中打开pdf文件
7.在AndroidManifest.xml中没有注册layout文件,会造成页面闪退
8.Android系统所有可声明的权限。
访问 http://developer.android.com/reference/android/Manifest.permission.html 可以查看
9.自定义广播无法弹出提示问题
Android8.0加intent.setPackage(getPackageName());可以解决
10.Android WebView net::ERR_CLEARTEXT_NOT_PERMITTED问题:
解决方法: 在Application中加入android:usesCleartextTraffic=“true”
https://blog.youkuaiyun.com/weixin_34362875/article/details/91442507
11.项目流程
SPM VPM 软件工程师
- 跟SPM沟通项目配置 , 新建提货单和 TSDS 编译配置
- 本地提货单下拉代码 (如果跟随主干的分支走, 则不需要合并原型)
- 客户需求导入jira
- 找spm 和 modem 硬件工程师沟通 参数配置, 还有新建对应订单的 仓库
- 按照jira 上面的问题号, 修改需求
- 需求本地验证OK 之后提交 代码
- 需求改完之后, 进入tsds 编译版本
- 版本出完了之后 ,项目订单工程师下载验证,提供自检表 和 SVN版本路径给测试 进行全面测试验证。
- 内部验证OK之后, VPM 把版本提交给客户验证。
- 客户确认版本, 内部要进行一轮GMS认证, 等到内部认证全部PASS之后, 提交给代理, 最后拿到google的 approve, 最后内部DCC
SMR
- 主要是谷歌的安全patch
- GMS VERSION 不能修改,base_os 属性值 你必须和你 DCC版本的fingerprint 一致
12.动态注册广播
private DynamicBroadcast dynamicBroadcast;
private String BROADCAST_ACTION = "android.intent.action.BROADCAST_ACTION";
dynamicBroadcast = new DynamicBroadcast();
IntentFilter intentFilter = new IntentFilter(BROADCAST_ACTION);
registerReceiver(dynamicBroadcast, intentFilter);
public class DynamicBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
//todo
}
}
13.更改开机动画、开机铃声
- zip -r -0 bootanimation.zip ./
第一步 制作动画压缩包 - adb root
- adb remount
- adb push bootanimation.zip /system/media/
- adb reboot 看效果
14.跳过开机引导:*89#
15.反编译软件使用
./apktool.sh <反编译pk>
16.更改开机,关机logo:
在vendor/tinno/k210/qmb_pk/logo 文件夹下覆盖开机,关机logo就行
注意:logo文件必须要用256色也即位深为8位的bmp格式文件
17.更改内置应用字符串
第一步在vendor/tinno/k210/qmb_pk/rroOverlay文件夹下新建要覆盖应用文件夹如DeskClockOverlay
接着按覆盖应用DeskClock中String.xml目录路径新建文件夹
第二步:在原应用String.xml中找到要覆盖字符串位置,然后在自己的String.xml中覆盖
如:把Start week on 该为 Start myweek on
String.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"
xmlns:tools="http://schemas.android.com/tools">
<string name="week_start_title">Start myweek on</string>
</resources>
第三步:在DeskClockOverlay目录下新建Android.xml、AndroidManifest.xml两个文件
① Android.xml修改LOCAL_PACKAGE_NAME为覆盖文件夹名如DeskClockOverlay。(Android.xml原始内容格式可以在原覆盖应用内复制,AndroidManifest.xml同理一样)
Android.xml内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := DeskClockOverlay
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, res)
LOCAL_SDK_VERSION := current
LOCAL_IS_RUNTIME_RESOURCE_OVERLAY := true
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
LOCAL_AAPT_FLAGS := --auto-add-overlay
include $(BUILD_PACKAGE)
② AndroidManifest.xml修改对应的包名,报名在原应用AndroidManifest内找
AndroidManifest.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 Google Inc. All Rights Reserved. -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.deskclock.overlay">
<overlay android:targetPackage="com.android.deskclock" android:priority="1" android:isStatic="true" />
</manifest>
(如果系统应用没有Android.xml、AndroidManifest.xml可以不需要,如Settings)
最后用mmm 部分编译,再增量编译
18.文件夹内查找指定内容:
grep -rni “关键字”
19.安装apk命令
adb install -r <apk文件>
20.Settings内置选项在一级菜单activity方式
① 在AndroidManifest.xml 添加如下代码
<activity android:name=".HardKey"
android:label="Mrlove"
android:icon="@drawable/ic_home_wikofeatures"
android:taskAffinity="">
<intent-filter android:priority="1">
<action android:name="com.android.settings.HARDKEY" />
<action android:name="android.settings.HARDKEY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
<!--在category中的物理位置(按优先级排序时用到,并不是指第9个位置,数越大优先级越大越靠前)-->
<intent-filter android:priority="9">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
<!--此项在主setting位置(ia.homepage)-->
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.homepage" />
<meta-data android:name="com.android.settings.ACTIVITY_ACTION"
android:value="com.android.settings.HardKey" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
② 实现HardKey这个activity代码如下
package com.android.settings;
import android.app.Activity;
import android.os.Bundle;
public class HardKey extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hardkey);
}
}
③ 创建hardkey.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="hello world" />
</LinearLayout>
21.Settings内置选项在一级菜单fragment方式
① 在AndroidManifest.xml 添加如下代码
<!-- 这样写,然后在Settings中声明成Settings的内部类,从而不需要单独再写FlashSettingsActivity的实现类 -->
<activity android:name="Settings$FlashSettingActivity"
android:label="MrloveFragment"
android:icon="@drawable/ic_home_wikofeatures"
android:taskAffinity="">
<intent-filter android:priority="1">
<action android:name="com.android.settings.FLASH_SETTING" />
<action android:name="android.settings.FLASH_SETTING" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
<intent-filter android:priority="9">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.homepage" />
<!-- FRAGMENT_CLASS 表明value指定的类是fragment -->
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.FlashSetting" /><!--FlashSettings实现类 -->
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
②自己实现FlashSetting 这个fragment代码如下:
package com.android.settings;
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class FlashSetting extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.right_fragment);
}
}
③在xml文件夹实现right_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="set_local"
android:title="我的位置" />
<CheckBoxPreference
android:defaultValue="true"
android:key="apply_wireless"
android:summary="使用无线网络在应用程序(比如Google地图)中查看位置"
android:title="使用无线网络"></CheckBoxPreference>
</PreferenceScreen>
④在Settings.java中添加
public static class FlashSettingActivity extends SettingsActivity { /* empty */ }
⑤在package com.android.settings.core.gateway;的SettingsGateway.java文件中添加如下代码
一,引入包
import com.android.settings.FlashSetting;
二, 在public static final String[] ENTRY_FRAGMENTS方法中添加:
FlashSetting.class.getName(),
三,在public static final String[] SETTINGS_FOR_RESTRICTED方法中添加:
Settings.FlashSettingActivity.class.getName(),
https://www.jianshu.com/p/2e644c08646d
https://blog.youkuaiyun.com/fsc_fantexi/article/details/90668122
22.以窗口的形式打开当前目录:
nautilus $PWD
https://blog.youkuaiyun.com/chenwenxin/article/details/44174563
23.通过gerrit 打补丁
一、直接搜索ID或者commit信息,然后cherry-pick到自己项目上 并add 一个 Reviewers
二、如果失败就下载 cherry-pick 包 到需要打补丁的目录
手动解决冲突后
1.git add
2.git cherry pick continue
3.git push tinno HEAD: refs/for/地址 //提交到git服务器待审核
然后在gerrit add 一个 Reviewers
如果手动解决冲突有不可修改文件,直接添加不可修改内容
1.git add
2.git commit -m <信息>
3.git push tinno HEAD: refs/for/地址 //提交到git服务器待审核
三、如果没有找到ID或者commit信息
git branch -a //查看所有分支
git checkout -b <补丁所在分支> //在本地切换到补丁所在分支
gitk. //搜索commit信息 找到要修改的内容
git checkout -b <当前分支> //切换回当前分支
找到修改目录手动修改内容
git add
git commit -m <信息>
git push tinno HEAD: refs/for/地址
24.如何使用TSDS构建项目
25.2018以前旧项目debug 软件编译前修改点(用于gms的debug)
1、fingerprint属性与用于同次gms的user版本要一致,除了ro.build.type字段值不同
如:user版:Mobicel/X4/X4:8.1.0/OPM2.171019.012/1568094378:user/release-keys
则debug版: Mobicel/X4/X4:8.1.0/OPM2.171019.012/1568094378:userdebug/release-keys
2、incremental属性值修改—与user软件的值要一致,且与fingerprint中incremental字段值一致
基于上一次举例,要设置 ro.build.version.incremental=1568094378
3、tag属性值要与fingerprint中tag字段一致
基于上一次举例,要设置 ro.build.tags=release-keys
具体操作
①先在对应订单目录的buildinfo.sh查找fingerprint属性值的组成方式
②从buildinfo.sh和configs.mk文件中查找对应的宏赋值的地方,如果找不到去device目录grep搜索,没有结果则从build/make/core/Makefile文件中查找本订单fingerprint赋值的位置
如在订单目录(Y400AG_MTN/vendor/tinno/y400/mcl_mtn_za)执行
grep -rniw fingerprint
buildinfo.sh:74: echo "ro.build.fingerprint=$BUILD_FINGERPRINT"
在device目录执行
grep -rniw BUILD_FINGERPRINT
无结果
在build/make/core/Makefile目录执行
grep -rniw BUILD_FINGERPRINT
Makefile:238: BUILD_FINGERPRINT := Mobicel/X4/X4:$(PLATFORM_VERSION)/ $(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TA GS)
在订单目录(Y400AG_MTN/vendor/tinno/y400/mcl_mtn_za)执行
grep -rniw ro.build.version.incremental
buildinfo.sh:8:echo "ro.build.version.incremental=$BUILD_NUMBER"
在build/make/core/Makefile目录执行
grep -rniw BUILD_NUMBER
Makefile:202: BF_BUILD_NUMBER := $(BUILD_NUMBER)
(可以看到红色的BF_BUILD_NUMBER := $(BUILD_NUMBER) = ro.build.version.incremental
而上文第二点要修改的ro.build.version.incremental=1568094378其实修改BUILD_NUMBER
就可以了,但是 BUILD_NUMBER 是个变化的值需要固定,可以直接在手机里面查看具体的值)
连接手机执行
adb shell getprop ro.build.version.incremental
1568104533
在config.mk中修改即可
在订单目录(Y400AG_MTN/vendor/tinno/y400/mcl_mtn_za)执行
grep -rniw ro.build.tags
buildinfo.sh:34:echo “ro.build.tags=$BUILD_VERSION_TAGS”
连接手机执行
adb shell getprop | grep ro.build.tags
[ro.build.tags]: [release-keys]
在buildinfo.sh,Makefile修改即可
修改的具体位置:
①/home/android/work/Y400AG_MTN/vendor/tinno/y400/mcl_mtn_za 下
configs.mk
+ifeq ($(TARGET_BUILD_VARIANT), userdebug)
+BUILD_NUMBER := 1568104533 //具体值通过
+endif adb shell getprop
buildinfo.sh ro.build.version.incremental
-echo "ro.build.tags=$BUILD_VERSION_TAGS" 查看手机的值
+echo "ro.build.tags=release-keys"
②/home/android/work/Y400AG_MTN/build/make/core下
Makefile
- BUILD_FINGERPRINT := Mobicel/V4/V4:$(PLATFORM_VERSION)/$(BUILD_ID)/
$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS)
+BUILD_FINGERPRINT := Mobicel/V4/V4:$(PLATFORM_VERSION)/$(BUILD_ID)/
$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/release-keys
补充:
旧版本修改方式:(李进总结)
先在对应订单目录的buildinfo.sh查找fingerprint属性值的组成方式
,从本文件和configs.mk文件中查找对应的宏,如果找不到去device目录grep搜索
没有结果则从build/make/core/Makefile文件中查找本订单fingerprint赋值的位置,对
BUILD_NUMBER、TAGERT_BUILD_VARIANT和release-keys 进行修改,如果是取宏则在订单目录修改,
release-keys可直接在buildinfo强改,并且/build/make/core/Makefile文件对应fingerprint也要修改。
注:如果TARGET_BUILD_VARIANT值是编译脚本中定义为直接从输入编译命令取值则不用修改。
26.订单目录简介
配置文件:作用、路径
Android.mk: include all subdir makefile
apps/: 预置客户APP
bootanimation: 开关机动画资源
buildinfo.sh: 项目相关定义的ro属性配置文档
configs.mk: 控制device的宏定义,等订单项目配置makefile文件
etc: 手机网络频段信息设置等相关信息
gms.mk: gms相关配置信息makefile文件
logo: 手机开机第一帧图片和电池电量低图片
overlay: 相关资源替换目录
sound: 手机铃声、通知、闹钟等音频文件配置信息
platformConfigs: 手机系统属性值配置文件
分单项目目录补充
reorder_config:翻单定制文件夹
27.Google规范暗码讲解
暗码:各常用暗码,及所进页面的作用(apk),常用测试或验证情景(Google规范暗码:##暗码##)
0661 :查看设备信息(LCD物料信息、TP物料信息、设备有的sensors、camera物料信息等)
86436 :查看版本号(客户版本号,内部版本号,基线版本号等)
8 :开机下的工厂测试(或称ftm测试,整机测试)
Ps :关机下ftm测试–power+音量下键
84666364:工程模式–ylog,log level switch等…
*#06# :手机国际识别码(IMEI)
28.jack编译报错的问题
错误信息:
ERROR: Communication error with Jack server (52) make
解决方法:
工程根目录内执行以下三句
export JACK_JAR=./out/host/linux-x86/framework/jack.jar
./out/host/linux-x86/bin/jack-admin stop-server
./out/host/linux-x86/bin/jack-admin start-server
http://www.mamicode.com/info-detail-2162318.html
29.出现Try increasing heap size with java option '-Xmx’错误解决方案
出现这个错误是由于电脑内存不足,在命令行分别执行以下三条语句,然后继续编译
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
https://blog.youkuaiyun.com/csdn_zyp2015/article/details/56277765
30.ota包上传服务器失败后,进入后台手动上传图解
①进入后台后,在项目管理中,搜索当前项目名,项目名获取方式如下:
②搜索页面如下:
③看发布日期选择正确的项目,点击配置按钮
④进入配置页面后,按照图示操作
⑤点击测试IMEI管理,在搜索栏搜索对应项目,再点击重置所有
31.翻单项目如何初始化
①首先在要进行翻单的定制化项目下新建reorder_config文件夹,如下图所示:
②文件夹内复制qmb_pk翻单项目里面需要覆盖的文件,一般是如下图所示这些文件:
(各文件作用参考:26.订单目录简介)
③修改编译脚本,首先复制当前项目编译脚本进行定制化修改,如下图所示
④erverbuild_k210_pk.sh文件内修改内容可以参考其他同基线翻单项目修改,注意脚本中①②两处修改为自己翻单文件夹,修改内容如下:
代码原文:
######### TINNO REORDER PROJECT #########
echo -e "TEST IF REORDER PROJECT EXIST"
if [ -d "$SRC_DIR/vendor/tinno/$BUILD_PROJECT_NATIVE/$BUILD_PROJECT_CUSTOM/reorder_config/" ]
then
echo -e "REORDER PROJECT, COPY CONFIGS"
cp -rf $SRC_DIR/vendor/tinno/$BUILD_PROJECT_NATIVE/$BUILD_PROJECT_CUSTOM/reorder_config/* $SRC_DIR/vendor/tinno/$BUILD_PROJECT_NATIVE/$BUILD_PROJECT_CUSTOM
fi
######### TINNO REORDER PROJECT #########
添加代码含义:
把翻单文件夹的内容覆盖定制项目下相同内容,从而达到编译后的项目属于订单项目,注意,当运行翻单脚本后,原始项目文件会被覆盖掉,注意git checkout . 当前项目,查看原始项目数据
32.验证翻单项目GMS,security安全补丁,以及修改点部分操作
首先还原翻单定制化脚本覆盖掉的内容
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/qmb_pk$ git checkout .
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/qmb_pk$ git status .
连接手机查看修改点
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/qmb_pk$ adb shell getprop |grep 2020
查看手机gms更新时间是否为最新时间
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/qmb_pk$ adb shell getprop |grep gms
查看项目中的gms时间
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/trunk$ ls
bootanimation build_fingerprint.mk buildinfo.sh configs_env.sh configs.mk configs_version.mk etc gms.mk kernel_config logo overlay PlatformConfigs sounds vendor_buildinfo.sh
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/trunk$ cat gms.mk |grep version
ro.com.google.gmsversion=9_201902.go
查看git提交有没有最新修改
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/trunk$ gitk gms.mk &
[1] 6007
查看项目代码中security安全补丁时间
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/trunk$ cat gms.mk |grep security
[1]+ 已完成 gitk gms.mk
查看手机中security安全补丁时间
android@Precision-T1700-c0508:~/work/K210/vendor/tinno/k210/trunk$ adb shell getprop |grep security