参考文档,有些内容需要根据具体的情况做修改,请知悉
项目准备工作
1)提前浏览一下需求,确认是否有功能性需求以及一些疑难杂症。
跟项目经理确认清楚每一条需求,不可似是而非。
需跟项目经理确认该需求是之前的需求还是新增需求,如果是之前的需求,需要找到之前的负责人,询问该需求进度,如未处理,需跟项目经理说明具体情况,并给出开发周期,看能否接受,同时咨询一下大概的量产时间,做到心中有数。
2)不定时的看看公版是否增加了新功能,客户项目同步公版代码。
更新公版代码后须告知驱动,否则驱动调试编译的时候可能会报错,这样不仅浪费驱动的时间,也延误了自己出版本的时间。
3)如果是GMS项目,如果确认客户需求是否有违背GMS要求的,及时跟客户沟通。
4)如果需求较多,建议在晚上下班时间编一个debug的版本,第二天来作为调试使用,能节约大量的修改调试时间。
CTS相关失败项
juejin.im/post/5cf60e…
创建主板
使用脚本
source build/envsetup.sh
clone_project A B
A是base版本,B是new版本
创建新项目的步骤
1)新建一个客户基本都在droi目录下配置
2)根据邮件信息来参考copy那个项目,例如参考A,建B
3)copy A to B
4)修改copy出来的项目里面的所有客户名字
3.1,进入B文件夹;
3.2,grep -r A *,修改所有A为B;
3.3,Ctrl + f 查找A,出来的文件的名字A改为B;
3.4,打开ProjectConfig.mk;
3.5,查看CUSTOM_MODEM=?
3.6,查看TYD_MMI_FLASH_TYPE = ?
3.7,查看google的gms包是否是要求的:TYD_MMI_GOOGLE_APPS_VERSION = R8
3.8,其他的按客户需求修改;
复制代码
5)如果没有参考的,直接copy一个相同配置的项目(最好是公版的,如果没有自行参考),去掉others文件夹
6)这样一个客户就基本完成,可以提交了
创建新项目需要提交的文件
1)ProjectConfig.mk : 从device/droi/主板目录/ProjectConfig.mk
拷贝并修改相应的宏
2)debug_defconfig/defconfig : 从kernel-3.18/arch/arm{arm64}/configs/主板名_debug_defconfig和主板名_defconfig
拷贝修改文件名字并修改相关配置
3)lk.mk : 从vendor/mediatek/proprietary/bootable/bootloader/lk/project/主板名.mk
拷贝修改文件名字并修改相关配置
编译modem
参考凌春光的文档《modem编译流程》
配置Modem
1)根据项目的配置表,确认modem的配置
2)如果相对应配置的modem在vendor/mediatek/proprietary/modem
目录下是否存在,如果不存在则需要编译modem,并将编译好的modem放到vendor/mediatek/proprietary/modem
目录。
3)在ProjectConfig.mk
文件中配置CUSTOM_MODEM宏: CUSTOM_MODEM = pwd3_125
配置FlASH
1)根据项目的配置表,确认flash的配置
2)根据配置在vendor/mediatek/proprietary/bootable/bootloader/preloader/freeme_flash_type
目录下找相对应的文件夹,并将名字赋给ProjectConfig.mk
文件中的FREEME_FLASH_TYPE
。
3)online.mediatek.com/FAQ#/SW/FAQ…
版本号如何设置
《TYZN-PCBA软件版本命名规范及项目命名规则V3.2.pdf》
链接:pan.baidu.com/s/1yypCsn_v…
MTK_CLEARMOTION_SUPPORT
添加以下两个宏的时候可能会导致开机异常,如铃声不响、开机流程异常等,需要确认清楚
MTK_CLEARMOTION_SUPPORT = yes
MTK_MIRAVISION_SETTING_SUPPORT = yes
遇到无法解决的问题,如何提eservice给MTK?
www.jianshu.com/p/72ab3dd82…
如何兼容新的flash
www.jianshu.com/p/ab14fb772…
如何编译分离式Flash 工厂软件
www.jianshu.com/p/d6dfc4e77…
屏幕亮度设置
SettingsProvider/res/values/defaults.xml
中设置 def_screen_brightness
多媒体,闹钟,来电铃声,通话声音音量调整
P0: AudioService.java 中:
AudioSystem.STREAM_VOICE_CALL
AudioSystem.STREAM_MUSIC
AudioSystem.STREAM_ALARM
AudioSystem.STREAM_RING
AudioSystem.STREAM_SYSTEM
复制代码
桌面菜单全透明
- http://10.20.40.17:8080/#/c/86151/
override/packages/apps/Launcher3/quickstep/src/com/android/quickstep/views/ShelfScrimView.java
override/packages/apps/Launcher3/res/values-v21/styles.xml
override/packages/apps/Launcher3/src/com/android/launcher3/BaseDraggingActivity.java
override/packages/apps/Launcher3/src/com/android/launcher3/folder/FolderPagedView.java
override/packages/apps/Launcher3/src/com/android/launcher3/views/ScrimView.java
复制代码
客制化桌面图标
juejin.im/post/5cd8e3…
默认可以旋转桌面
def_accelerometer_rotation 设置为 true
allow_rotation 设置为 true
桌面壁纸缩放的问题
将提供的壁纸文件,右键选择更改大小,选择像素,根据屏幕尺寸大小修改后,将改好的壁纸放在frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
系统第一次启动时没有wallpaper_info.xml
信息规定大小,就会已显示屏分辨率长宽的最大值最为壁纸的长和框,举个例子:屏幕分辨率为480*800
,则生成的wallpaper_info.xml
信息为800*800
,若壁纸长宽皆大于800,则会取0-480和0-800的长宽作为默认壁纸,若壁纸为480*800
,则左右个补全160,生成为800*800
的壁纸,因此也导致壁纸产生偏移,若是长宽皆小于800,好像会设置失败,延用之前的壁纸,这里没搞太懂。 那如何设置正确的默认壁纸,我的做法是将480*800
的壁纸做成800*800
的大小,前480*800
为默认壁纸,后320为底色,这样就不会被裁剪或生成偏移了。
桌面左右滑动
去掉二级菜单,只保留一级菜单,左右滑动:
http://10.20.40.21:8081/#/c/TYD/platforms/android-28/ALPS-P0-MP1-6739/project/droi_a9/+/1956/
freeme相机增加美颜
freemeCamConfig.xml: CAMERA_FACE_BEAUTY_SHOW、CAMERA_FRONT_FACE_BEAUTY_SHOW设为true
freeme相机增加背景虚化功能
freemeCamConfig.xml: CAMERA_BACKGROUND_VIRTUAL_SUPPORT设为true
开启触屏提示音,短音源第一声Speaker无法听到
mediatek/proprietary/hardware/audio/common/V3/aud_drv/AudioALSAHardwareResourceManager.cpp
@@ status_t AudioALSAHardwareResourceManager::startOutputDevice_l(const audio_devic
AudioALSAANCController::getInstance()->setSpeakerEnabled(true);
#endif
OpenSpeakerPath(SampleRate);
+ usleep(1000*X); //添加延时X(可以修改为100)毫秒
}
复制代码
添加手动写IMEI号的指令
FreemeSpecialCharSequenceMgr.java
中添加
.build("*#*#1122#*#*", "com.freeme.intent.action.IMEI_SETTING", "alternative.imei_setting") // Imei setting
关机电池动画位置
vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/
vendor/mediatek/proprietary/external/libshowlogo/cust_display.h
复制代码
修改谷歌文件夹里app名字颜色
修改下拉状态栏透明度
vendor/mediatek/proprietary/packages/apps/SystemUI/res/color/qs_background_dark.xml
复制代码
修改状态栏图标位置
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/status_bar.xml
vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/keyguard_status_bar.xml(锁屏时不显示)
复制代码
工厂模式硬件信息增加fingerprint
private final String getHwInfos() {
.....
String fingerprint = android.os.SystemProperties.get("ro.hardware.fingerprint", "null");
if (fingerprint != "null") {
infos.append("[ fingerprint ]:\n" + fingerprint + "\n");
}
return infos.toString();
}
复制代码
内置apk
juejin.im/post/5cd411…
1、apk不含so文件 将APK放入文件夹内,改名为:yourModuleName.apk(mk文件中的yourModuleName)。Android.mk文件与apk文件同级。
Android.mk内容如下:
LOCAL_MODULE_TAGS 是指定在什么版下才会编译这个Android.mk
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
LOCAL_MODULE_SUFFIX 是指文件后缀.apk
LOCAL_CERTIFICATE指apk的签名,可以有:testkey、media、platform、shared,如果文件已经签过名,则使用PRESIGNED。
LOCAL_MODULE_PATH 指你要安装的apk的路径。
$(TARGET_OUT)/priv-app这个路径下,apk不可卸载。
$(TARGET_OUT_DATA_APPS)这个路径下apk卸载后不再恢复
$(TARGET_OUT)/vendor/operator/app这个路径下apk卸载后恢复出厂设置可以恢复apk
复制代码
Android P(9.0) userdebug版本执行adb remount
android P版本后google启用avb(Android Verified Boot)2.0,verified boot and DM-verity默认启用策略发生了变化
* Android P + kernel-4.4 or kernel-3.18
- download preloader with verified boot disabled which location is the same as scatter file //preloader__SBOOT_DIS.bin
- adb root
- adb disable-verity
- adb reboot
- adb root
- adb remount
* Android P + kernel-4.9 or after
- download preloader with verified boot disabled which location is the same as scatter file. //preloader__SBOOT_DIS.bin
- boot to Home Screen
- go to setting -> system -> Developer options -> OEM unlocking
- adb reboot bootloader
- fastboot flashing unlock
- press volume up key
- fastboot reboot
- adb root
- adb disable-verity
- adb reboot
- adb root
- adb remount
复制代码
将锁屏方式默认为None
SettingsProvider/res/values/defaults.xml
def_lockscreen_disabled 设置为true
更新开关机动画
参考FAQ10590制作开关机动画压缩文件。
注意点:制作好动画后,选中folder1文件夹、folder2文件夹和desc.txt,邮件压缩,压缩文件格式.zip,压缩方式选择存储。 切忌多一层bootanimation文件夹。
制作好的压缩文件放在droi下对应的工程目录下。
关闭特定的Log
有时客户会要求关闭特定的log,大多是底层的log,具体方法如下:
1、首先根据客户提供的信息,确认关闭的log tag,比如MtkOmxMVAMgr/Acodec/MtkCam
2、在代码中搜索相关内容 cgrep "LOG_TAG \"ACodec\""
,但是有的log是在so库中的,无法关闭,比如MtkOmxMVAMgr
3、打开相关文件,将相关内容注释即可 // #define LOG_TAG "ACodec"
User版本的root权限
juejin.im/post/5cd249…
如何配置全球通和非全球通客户
modem的AP端配置
www.jianshu.com/p/de7327037…
紧急联系人功能
设置紧急联系人,并且可以通过长按音量+和音量-来拨打紧急联系人号码
http://10.20.40.21:8081/#/c/TYD/platforms/android-28/ALPS-P0-MP1-6739/project/droi_pd3d/+/1508/
新项目无法登陆Google account
www.jianshu.com/p/943939173…
源码编译错误问题定位
可以在log中查找以下几个关键字:
ERROR:
、FAILED:
、String ERROR
调整桌面图标的行之间距离
applist layout:
packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
updateIconSize(float scale, Resources res, DisplayMetrics dm):
//*/update applist layout
allAppsCellHeightPx = allAppsIconSizePx + allAppsIconDrawablePaddingPx
+ Utilities.calculateTextHeight(allAppsIconTextSizePx)
+ allAppsIconDrawablePaddingPx * 3;
/*/
allAppsCellHeightPx = getCellSize().y;
//*/
复制代码
workspace layout:
packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
updateWorkspacePadding():
//*/ZY.zhanglin,20190301. update workspace layout
int paddingBottom = hotseatBarSizePx ;
/*/
int paddingBottom = hotseatBarSizePx + verticalDragHandleSizePx;
//*/
复制代码
google 文件夹图标有毛边
Launcher3/src/com/android/launcher3/folder/PreviewBackground.java
将半径增大4:
private void drawCircle(Canvas canvas,float deltaRadius) {
float radius = getScaledRadius();
canvas.drawCircle(radius + getOffsetX(), radius + getOffsetY(),
(radius - deltaRadius) + 4, mPaint);
}
复制代码
第三方应用白名单
很多出货国内要使用freeme os的客户,比如天龙世纪、南极星,基本都要内置某个对讲类的app。由于 freeme os的对第三方应用的限制很多,内置这些应用时需要注意解除一些限制,保证此类app功能正常运行。
针对freeme 8.1 (android O1)总结如下:
1、默认赋予该应用申请的所有权限
vendor/freeme/frameworks/base/data/etc/default-permissions-freeme.xml
具体写法可参考该文件的内容,比如:
"com.ctchat.sample"
type=""
trust="true" >
复制代码
2、设置-应用-自启动管理,默认打开开关后台服务才能收到开机广播或者其他广播
vendor/freeme/packages/providers/FreemeConfigProvider/RRO/res/values/arrays.xml,添加item即可默认打开
"1.0" encoding="utf-8"?>
"config_atlas_custom_white_list" translatable="false">
- com.ctchat.sample
复制代码
3、点击最近应用里的清理会杀死不带锁的应用,需要默认上锁
vendor/freeme/packages/providers/FreemeSettingsProvider/res/values/defaults.xml
"def_sysui_recent_locked_tasks" translatable="false">com.ctchat.sample
复制代码
4、桌面一键清理、设置-安全中心里的悬浮窗管理和通知管理,这三项都需要找负责安全中心来客制,他会提供给你以下文件去override即可
vendor/freeme/packages/apps/security/Security/default_local_config
5、进程保活,低内存时不轻易被系统杀掉
vendor/freeme/frameworks/base/core/java/com/freeme/internal/util/FreemeCustomizedOom.java
private static final Map DEFAULT_APP_ADJ_MAP = new HashMap() {
{
put("com.ctchat.sample", HEAVY_WEIGHT_APP_ADJ);
}};
复制代码
MTK FMRadio 修改工作频率范围的方法
全球大部分国家的调频广播频率范围基本都是87.5-108.0 Mhz,但也有些例外,比如日本的为76.0-90.0Mhz。
mtk平台默认都是87.5-108.0Mhz,如果该机型销往日本,那么我们就需要修改FM频率范围。
MTK已经预留好宏和变量,改个值就好,代码是基于O的,但是这一块基本没什么变化,O之前以及之后应该也是适用的,可能文件路径会有改变
1、device/mediatek/common/kernel-headers/linux/fm.h 找到以下宏修改如下
#define FMR_BAND 3 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special
#define FMR_BAND_FREQ_L 760 //FM radio special band low freq(Default 87.5MHz)
#define FMR_BAND_FREQ_H 1080 //FM radio special band high freq(Default 108.0MHz)
#define FM_BAND_DEFAULT FM_BAND_JAPANW
#define FM_RAIDO_BAND FM_BAND_JAPANW
复制代码
2、vendor/mediatek/proprietary/packages/apps/FMRadio/src/com/android/fmradio/FmUtils.java
修改如下几个变量
// maximum station frequency
private static final int HIGHEST_STATION = 1080;
// minimum station frequency
private static final int LOWEST_STATION = 760;
// maximum station frequency 50khz
private static final int HIGHEST_STATION_50KHZ = 10800;
// minimum station frequency 50khz
private static final int LOWEST_STATION_50KHZ = 7600;
复制代码
修改时区
www.jianshu.com/p/03b6c8c34…
FOTA差分包制作流程相关
www.jianshu.com/p/d24648a87…
近斯任务界面的的文字有很严重的锯齿
packages/apps/Launcher3/quickstep/src/com/android/quickstep/views/RecentsView.java
RecentsView():
+ mEmptyMessagePaint.setAntiAlias(true);
复制代码