Menu Home

android framework

Android OTA升级中的一些零碎知识

OTA升级脚本 build/tools/releasetools recovery-resource.dat # Recovery is generated as a patch using both the boot image # (which contains the same linux kernel as recovery) and the file # /system/etc/recovery-resource.dat (which contains all the images # used in the recovery UI) as sources. This lets us minimize the # size of […]

windows python跨进程访问文件

OS: windows 7 python: 2.7 最近在把Android OTA的整套东西移植到windows上,涉及了很多python脚本,要疯了。暂不说没写过一行python了,就是windows系统也有很多年头没动过了,这个牛X的系统,居然还是那么难用。 问题描述: temp_zip_file = tempfile.NamedTemporaryFile() #同一线程访问temp_zip_file #不同线程访问temp_zip_file temp_zip_file.close() 运行时提示错误: 另一个程序正在使用此文件,进程无法访问。 靠啊,这么简单的一条语句还能出啥问题啊,在Linux上也是没有问题的,查查文档,发现下面这句话: tempfile.NamedTemporaryFile([mode=’w+b'[, bufsize=-1[, suffix=”[, prefix=’tmp'[, dir=None[, delete=True]]]]]]) This function operates exactly as TemporaryFile() does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry […]

How to change Kernel Version String

OS: Android 4.4 Kernel: 3.10.28 这里所谓的修改kernel version string并不是真的修改linux的版本号,因为那样会导致非常多的问题(比如一些驱动会不能用,等等)。所以这里修改的仅仅是/proc系统下的version,而从/proc/version中读取kernel version string是一个通常的做法,所以只需要修改这个就可以了。 kernel/fs/proc/version.c static int version_proc_show(struct seq_file *m, void *v) { seq_printf(m, linux_proc_banner, utsname()->sysname, utsname()->release, utsname()->version); return 0; } seq_printf和printf的功能很类似,可以输出经格式化的字符串。这里的linux_proc_banner参数实际上是一个格式化字符串,它的定义在文件kernel/init/version.c中: const char linux_proc_banner[] = “%s version %s” ” (” LINUX_COMPILE_BY “@” LINUX_COMPILE_HOST “)” ” (” LINUX_COMPILER “) %s\n”; 所以很明显你可以通过修改上面2个文件来定制你自己的version string. 接下来看看Android的setttings中是如何来读取kernel version的: […]

Android定制BootAnimation

准备动画图片 把制作好的动画帧图片按播放顺序命名,如 0001.png 0002.png … 0098.png 0099.png,命名可以不连续但是先后顺序一定要正确,Android将以数值升序播放。Tip:如何在Linux下批量重命名 创建父文件夹并命名为animation。 创建子文件夹并命名为part0。 把命名好的图片放到part0中。(PS:我分别测试了PNG和JPG格式的图片,Android都可以正常播放)接着在父文件夹中创建文件desc.txt,这个文件将控制Android如何播放动画。 看一下这个文件的: 800 1280 24 p 0 1 part0 第一行: 800 1280是图片宽高,一般跟手机屏幕的宽高一致。 24指的是播放帧率(帧/s)。 第二行:p标志一条播放规则。0 循环播放本文件中所有图片的次数,值0表示无限循环直到进入系统。1 播放相邻两帧图片之间的间隔时间。part0 对应图片的文件夹。 你可以用相同的方法建立多条播放规则,需要注意的是无限循环规则应该放到最后一条。 如: 800 1280 24 p 1 1 part0 p 1 0 part1 p 0 0 part2 打包 Android bootanimation不支持经过压缩的包,记住一定要只打包不压缩。 cd animation zip -r […]

Android:How to change MTP and PTP name

Android OS: 4.4.4 Sometimes, you want to change the default MTP/PTP name of your android device. If you have android source, it’s very easy. First open the source file: frameworks/base/media/java/android/mtp/MtpDatabase.java, Line:799(in my source), or you can search the function getDeviceProperty private int getDeviceProperty(int property, long[] outIntValue, char[] outStringValue) { switch […]

Framework增加资源文件

把需要增加的图片资源放到 frameworks/base/core/res/res/drawable-nodpi,如果就这样直接应用这个资源,会出现找不到资源的错误。实际上在增加完资源后还需要在 frameworks/base/core/res/res/values/symbols.xml文件中做相应的注册,比如: <java-symbol type=”drawable” name=”my_wallpaper” /> 重新编译framework-res后就可以使用这个资源了: com.android.internal.R.drawable.my_wallpaper

Android设置系统首次开机的默认输入法

Android OS: 4.4.4 需求:Android系统首次开机(恢复出厂状态),读取build.prop中的属性来设置默认的输入法。 增加系统属性 ro.product.IME.default 修改InputMethodService 打开文件 frameworks/base/services/java/com/android/server/InputMethodManagerService.java 增加如下方法: /** * 0: not first boot * 1: first boot */ static final String FIRST_BOOT_FLAG = “first_boot_flag”; private void setCustomDefaultIME() { int firstBootFlag = Settings.System.getInt( mContext.getContentResolver(), FIRST_BOOT_FLAG, 1); if(DEBUG) Slog.d(TAG, “First Boot Flag: ” + firstBootFlag); if (1 == firstBootFlag) […]

Android自定义系统属性

增加自定义属性涉及的文件: /build/toos/buildinfo.sh 比如这里增加了一个系统默认输入法的属性: echo “ro.product.IME.default=com.android.inputmethod.pinyin/.PinyinIME” 也可以加在device目录下的system.prop文件中,最终都会输出到build.prop rebuild出来的system.img中的build.prop就有了上面的属性。 通过下面的代码来访问这个自定义属性: String defaultIme = SystemProperties.get(“ro.product.IME.default”, “com.android.inputmethod.latin/.LatinIME”); 这里的SystemProperties为@hide类,所以需要在Android Source中使用上面的代码。 有了需要的属性后,就可以在Android机器中修改这个属性值了,但是需要注意一点: 如果是通过adb pull后再push到android机器的话,需要确保build.prop文件的权限为644,否则进不了系统。

解决KitKat对SD卡的读写限制

前情摘要 前提是你有Android源码或者设备已经ROOT,如果不考虑系统安全或者CTS等条件,可以选择修改系统文件来完全开放KitKat对SD卡的读写权限,让第三方APP以KitKat之前版本相同的方式操作SD卡。 修改文件:/system/etc/permissions/platform.xml 原始内容: <permission name=”android.permission.WRITE_EXTERNAL_STORAGE” > <group gid=”sdcard_r” /> <group gid=”sdcard_rw” /> </permission> 修改后: <permission name=”android.permission.WRITE_EXTERNAL_STORAGE” > <group gid=”sdcard_r” /> <group gid=”sdcard_rw” /> <group gid=”media_rw” /> </permission> 修改之后第三方APP只需要跟以前一样申请<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />来读写整个SD卡了。 ref: http://developer.huawei.com/devunion/ui/newsDetail.html?news=/devunion/news/n_00033.html

[转]Android Build System

Android Build System Android uses a custom build system to generate tools, binaries, and documentation. This document provides an overview of Android’s build system and instructions for doing a simple build. Android’s build system is make based and requires a recent version of GNU Make (note that Android uses advanced […]

Android Framework: 重启代码

private void RebootIntoRecovery() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); pm.reboot(“recovery”); } <uses-permission android:name=”android.permission.REBOOT” /> <manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”com.android.settings” coreApp=”true” android:sharedUserId=”android.uid.system”>

Android多窗口分屏(原生方法)

事实上KitKat已经可以实现多窗口分屏,只是功能不全,Google并没有把这个功能提供给用户。 使用am stack boxes可以查看当前系统存在的Activity Stack: am stack boxes output: Box id=1 weight=0.0 vertical=false bounds=[0,38][800,1208] Stack= Stack id=1 bounds=[0,38][800,1208] taskId=2: com.android.calendar/com.android.calendar.AllInOneActivity taskId=3: com.android.deskclock/com.android.deskclock.DeskClock Box id=0 weight=0.0 vertical=false bounds=[0,38][800,1208] Stack= Stack id=0 bounds=[0,38][800,1208] taskId=1: net.lnmcc.launcher/net.lnmcc.launcher.Launcher 从上面的输出我们看到当前有两个Stack,id分别为0和1。在Stack 1中存在了两个Task,这两个Task分别是Calender和DeskClock应用。而Launcher则是在Stack 0中。实际上,你会发现Launcher始终独占Stack 0。Android有如下规则: HOME stack: This is the stack with id = 0. This stack is […]