设置系统默认语言或者设备版本型号属性

一般途径
1)进入build/target/product目录,修改文件core_base.mk的PRODUCT_PROPERTY_OVERRIDES 值,例如,欲修改为默认中文,则增加语句如

PRODUCT_PROPERTY_OVERRIDES := \
ro.config.notification_sound=OnTheHunt.ogg \
ro.config.alarm_alert=Alarm_Classic.ogg \
persist.sys.language=zh \ 
persist.sys.country=CN

2)source build/envsteup.sh后重新编译即可。
针对供应商修改
对于供应商,比如rockchip,厂商自定义的设备属性文件都集中在device/rockchip目录下,如设备版本型号属性都集中在
device/rockchip/common/device.mk最后有设备的型号属性如:
PRODUCT_PROPERTY_OVERRIDES +=
ro.internal.model=TPS650
ro.product.model=TPS650
ro.product.brand=TPS650
ro.product.name=TPS650
ro.product.device=TPS650
ro.build.display.id=TPS515A_7100C_V1.0.0_20161212
当然,也可以修改device/rockchip/common/common.mk中:
PRODUCT_BRAND := rockchip
PRODUCT_DEVICE := rksdk
PRODUCT_NAME := rksdk
PRODUCT_MODEL := rksdk
PRODUCT_MANUFACTURER := rockchip
强制手段
当一般修改没有效时,可以直接修改build/tools/buildinfo.sh,如需要设置默认语言,可以注释

#if [ -n "$PRODUCT_DEFAULT_LANGUAGE" ] ; then
#  echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
#fi
#if [ -n "$PRODUCT_DEFAULT_REGION" ] ; then
#  echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
#fi

在后面添加

echo "persist.sys.timezone=Asia/Shanghai"
echo "ro.product.locale.language=zh"
echo "ro.product.locale.region=CN"

这个文件的系统属性优先级将高于其他文件,直接生效,重新编译即可;
如果变量仍然没有改变,可以在out目录下搜索build.prop文件,将同名文件删除后重新编译;
最后还是无效就只有make installclean;make重新编译了。
查看生效
在adb下,查看/system/build.prop可以得到系统的编译全局属性。

ANDROID_ID

在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
581行,通过随机数产生:

final SecureRandom random = new SecureRandom();
 final String newAndroidIdValue = Long.totoHexString(random.nextLong());

修改设备节点默认权限

device/rockchip/common/ueventd.rockchip.rc

默认安装APK

vendor\rockchip\common\apps
vendor\rockchip\firefly\apps
厂商自行定制的预装App
packages\apps
谷歌自行定制的App

etc配置文件

system/core/rootdir
中有etc中的配置文件

RK3288双屏闪屏问题

--- a/frameworks/base/core/java/android/app/Presentation.java
+++ b/frameworks/base/core/java/android/app/Presentation.java
@@ -29,6 +29,7 @@ import android.os.Message;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.TypedValue;
+import android.view.WindowManager;
 
 /**
 * Base class for presentations.
@@ -180,6 +181,7 @@ public class Presentation extends Dialog {
         mDisplayManager = (DisplayManager)getContext().getSystemService(Context.DISPLAY_SERVICE);
 
         getWindow().setGravity(Gravity.FILL);
 *        getWindow().setType(WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
         setCanceledOnTouchOutside(false);
     }

将可执行文件或者so打包进system.img

直接修改device.mk:

PRODUCT_COPY_FILES += \  
    device/ti/panda/my/app/my.apk:system/app/my.so

将现成的apk打包进system.img

先修改device.mk:

PRODUCT_PACKAGES += \  
    myapk

注意这里的名字要求和模块的Android.mk中,指定生成的文件名称相同,例如

LOCAL_MODULE:= myapk

同时,还要求模块的Android.mk中变量LOCAL_MODULE_TAGS值为optional

LOCAL_MODULE_TAGS := optional

最后,根据需要编译的是so、bin或者是apk,需要添加宏,编译系统将根据类型自动把编译目标复制到指定路径(/system/lib、/system/app、/system/bin)

include $(BUILD_PREBUILT) xxx.apk复制方式
include $(BUILD_PACKAGE)  apk源码方式
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)

一个复制apk的Android.mk例子:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my 
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := Dmc.apk
#LOCAL_PRIVILEGED_MODULE := true #对于像Launcher等特权应用,可以加快启动速度
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS) #如果是特权应用,将此行注释,apk将放在/system/priv-app目录
#LOCAL_CERTIFICATE := PRESIGNED #可选,使用APK原有签名
include $(BUILD_PREBUILT)

添加开机shell脚本

①在init.rc中添加开机启动的服务,这里服务名为init-setup,执行的脚本为custom_startup.sh(注意开头加上sh注释“#!system/bin/sh”):

service init-setup /system/bin/sh /system/bin/custom_startup.sh
    user root
    group root
    disabled
    oneshot
    seclabel u:r:custsh:s0  #进程的标签
on property:sys.boot_completed=1
	chmod 0777 /system/bin/custom_startup.sh
    start  init-setup
    (这里可以使用mkdir或者insmod)

②在device/${vendor}/common目录下添加脚本文件,并且在device.mk中添加拷贝命令:
PRODUCT_COPY_FILES +=
device/rockchip/common/custom_startup.sh:system/bin/custom_startup.sh
③device/qcom/sepolicy/common目录下添加SELinux规则custsh.te,内容为

type custsh,domain;    #service中的标签
type custsh_exec,exec_type,file_type;  #脚本的标签
init_daemon_domain(custsh)

在file_contexts中为脚本文件添加标签
/system/bin/custom_startup.sh u:object_r:custsh_exec:s0
④脚本自身运行可能需要各种各样的SELinux权限,可以根据dmesg中的avc日志,在custsh.te中添加allow,比如脚本需要操作声卡:

allow shell audio_device:chr_file { read write ioctl open };#该规则会导致app.te的audio_devices的notallow报错,对应注释即可

修改Android开关机动画

1 . linux启动小企鹅涉及的目录为android_source/kernel/drivers/video/logo下面有很多相关的图标,涉及到的文件就是 logo.c
2 . 当android系统从Linux内核启动后,会初始化anddroid平台,屏幕上将会出现”A N D R I O D”文字字样画面,涉及到的源文件为:android_source/frameworks/base/cmds/bootanimation/BootAnimation.cpp
从代码中可以看出,如果system/midea/目录下有bootanimation.zip则播放movie(),否则通过android()函数将./frameworks/base/core/res/assets/images/android-logo-mask.png和android-logo-shine.png合成默认的开机动画,动画过程播放audio.wav
3.关机动画是QCOM提供的一个应用,相关源文件为
./vendor/qcom/proprietary/qrdplus/Extension/apps/PowerOffHandler/PowerOffHandler.cpp,动画过程播放shutdown.wav

修改方法就是复制一份bootanimation.zip到/out/system/media/。bootanimation.zip里面包含part0 part1文件夹 和desc.txt,part 文件夹里面放的是动画拆分的图片,格式为png, desc.txt里面是播放的设置。
格式是这样的
480 800 15
p 1 0 part0
p 0 0 part1(这里需要添加换行)
480 800是指显示的分辨率 宽 高
15是一秒的帧数
p后面的数字是指播放次数 0为循环,N为播放N次
后面那位数字 一般为0(空指令), 表示播放一遍后稍作停顿的时间
part0,part1 为文件夹名

默认开机壁纸修改

Android5.1下,直接替换/framework/base/core/res目录下,找到对应分辨率,替换其中的default_wallpaper.jpg
资源选定方法优选判定请参考

Android编译结构

各个目录下的Android.mk的左右是声明目录下代码的源文件,模块名,模块属性(比如目标是shared lib 还是 excutable bin)
而device.mk等文件中的PRODUCT_PACKAGES 决定了最终编译并且安装哪些模块到out目录

Android层添加pn547

需要添加的包括四部分:
①kernel的驱动;
②frameworks/base/core/java/下的标准api,nxp定义的api以及vzw的api;
③packages/apps/Nfc下的JNI以及Java实现;
④external/libnfc-nci下的一些HAL层实现;
⑤根据porting文档修改
external/libnfc-nci/Android.mk
external/libnfc-nci/halimpl/pn54x/Android.mk
packages/apps/nfc/nci/jni/Android.mk
中的PN548C2为PN547C2
将packages/apps/Nfc/nci/jni/Android.mk
中的NFC_NXP_P61:= TRUE改为FALSE
⑤替换hardware/libhardware/include/hardware/nfc.h
⑥修改device.mk,添加
PRODUCT_PACKAGES +=
libnfc-nci
libnfc_nci_jni
NfcNci
nfc_nci.pn54x.default
Tag
com.android.nfc_extras
⑦修改init.rc,并且复制.conf、libpn547_fw.so、nfcee_access.xml。
⑧支持二代证:
packages/apps/Nfc/nci/jni/NativeNfcTag.cpp
将sCurrentConnectedHandle = targetHandle;提到if(natTag.mTechLibNfcTypes[i] == NFC_PROTOCOL_T3BT)之前。

默认允许APP获取USB设备权限

修改
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java
将setupAlert();注释,改为
mPermissionGranted = true;
finish();