码迷,mamicode.com
首页 > 其他好文 > 详细

miui patchrom项目开发详细教程(Being updated)

时间:2014-05-24 12:02:36      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:android   style   class   c   code   java   

 

 

 

 

 

linux64位android开发环境

miui patchrom项目开发


by: colinchen 整合修改【本人正在学习中,一直更新】

 

 

 

 


******************************************************************************
******************************************************************************

1 准备工作 下载所需软件(均为官方原版,只是离线下载到了百度网盘)

 


1.1 deepin_2013_zh-hans_amd64.iso
http://pan.baidu.com/s/1i3G8Xhz

1.2 jdk-6u38-linux-x64.bin
http://pan.baidu.com/s/1mgBdmR2

1.3 eclipse-jee-indigo-linux-gtk-x86_64.tar.gz
http://pan.baidu.com/s/1dDqYEI1

1.4 android-sdk_r22.6.2-linux.tgz
http://pan.baidu.com/s/1gd66IbD

1.5 bcompare-3.3.4.14431_amd64.deb
http://pan.baidu.com/s/1kTBit7L

 

 

******************************************************************************
******************************************************************************

2 软件安装 推荐使用 linuxdeepin 64 位,DeepWin安装适合新手朋友,免去你的分区烦恼http://wiki.linuxdeepin.com/inde ... n%E5%AE%89%E8%A3%85提醒:请不要在root用户下搭建以下开发环境和进行ROM的开发工作【如果只有root用户,请新建个人用户】

 


2.1 在当前用户home目录下新建android目录:(jdk, sdk, eclipse安装移动后都将放在这个目录)
mkdir ~/android


2.2 软件安装(将下载的文件全部复制到桌面上,直接在桌面运行终端)

2.2.1 JDK安装 下载jdk-6u38-linux-x64.bin

2.2.1.1 在jdk-6u38-linux-x64.bin所在目录下,添加可执行权限,并运行该文件

chmod +x jdk-6u38-linux-x64.bin
./jdk-6u38-linux-x64.bin

2.2.1.2将生成的jdk1.6.0_38目录移动到android目录下:

mv jdk1.6.0_38 ~/android


2.2.2 安装Eclipse 下载Eclipse Linux版压缩版 eclipse-jee-indigo-linux-gtk-x86_64.tar.gz

2.2.2.1 解压
tar -xzf eclipse-jee-indigo-linux-gtk-x86_64.tar.gz

2.2.2.2 将解压得到的eclipse目录移动到 android目录下
mv eclipse ~/android

2.2.2.3 创建桌面链接(若不行,手动创建链接到桌面)
ln ~/android/eclipse ~/桌面/eclipse


2.2.3 环境变量的配置(把这个提前了,因为不先配置环境变量,下载Android SDK Platform-tools是会提示JAVA错误)

2.2.3.1打开/etc/profile文件,具体可使用如下命令:
sudo gedit /etc/profile

2.2.3.2 在最后添加下列内容:

 


# set android home
ANDROID_HOME=/home/colinchen/android

# set java environment
export JAVA_HOME=$ANDROID_HOME/jdk1.6.0_38
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export

PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ANDROID_HOME/android-sdk-linux/tools/:$ANDROID_HOME/android-sdk-linux/platform-tools/:$PATH

 

2.2.3.3 然后保存

source /etc/profile


2.2.3.4 查看java是否安装成功

java -version

2.2.3.5 重启

 

2.2.4 安装Android sdk 下载android-sdk_r22.6.2-linux.tgz

2.2.4.1 解压:
tar -xzf android-sdk_r22.6.2-linux.tgz

2.2.4.2 将解压得到的android-sdk-linux目录移动到 android目录下
mv android-sdk-linux ~/android

2.2.4.3 进入~/android/android-sdk-linux/tools文件夹,运行程序android

./android

2.2.4.4 会弹出一个更新界面,这个界面会自动更新可以安装的列表,大概需要几分钟,更新完成后,我们选择Tools下的Android SDK Platform-tools 这个包,点击install 1 package 安装,因为adb目前放在这个包里面安装完成后可以在~/android/android-sdk-linux/platform-tools/下看到adb 的应用至此adb下载完成。如果直接执行adb shell会提示你没有权限,这就需要在root模式下启动adb 服务了


2.2.5 安装 bcompare 下载 bcompare-3.3.4.14431_amd64.deb

2.2.5.1 点击安装即可

2.2.5.2

bcompare用与文件的对比,命令如下:
两项对比
bcompare framework-res/AndroidManifest.xml out/reject/framework-res/AndroidManifest.xml.reject

三项对比
bcompare autopatch/bosp/framework-res/AndroidManifest.xml framework-res/AndroidManifest.xml out/reject/framework-res/AndroidManifest.xml.reject

2.2.6 repo安装

2.2.6.1 个人目录下创建bin目录,这是为了保存repo 等更新脚本的

mkdir -p ~/bin

2.2.6.2 安装git

sudo apt-get install git-core

2.2.6.3 安装curl

sudo apt-get install git-core curl

2.2.6.4 安装repo, 通过curl下载repo并给于权限

curl http://git-repo.googlecode.com/files/repo-1.13 > ~/bin/repo

chmod a+x ~/bin/repo

2.2.6.5 也可以把 ~/bin/repo 加入到环境变量里面,终端输入

sudo gedit /etc/profile

2.2.6.6 打开的文件添加

# add bin in path
export PATH=~/bin:$PATH

2.2.6.7 更改结束之后终端输入

source /etc/profile

2.2.6.8 重启

sudo reboot

 

******************************************************************************
******************************************************************************

3 配置usb识别android设备

 


3.1 adb的下载安装

sudo apt-get install android-tools-adb

3.2 在/etc/udev/rules.d/目录下创建51-android.rules文件

sudo touch /etc/udev/rules.d/51-android.rules:

3.3 终端输入 lsusb

lsusb


3.4 会出现
Bus 001 Device 003: ID 24e3:7112
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub


3.5 编辑51-android.rules

sudo gedit /etc/udev/rules.d/51-android.rules

3.6 然后添加

SUBSYSTEM=="usb", ATTR{idVendor}=="24e3", ATTR{idProduct}=="7112", MODE="0600"

3.7 点击保存然后给予权限
sudo chmod a+rx /etc/udev/rules.d/51-android.rules

3.8 接着终端输入

sudo /etc/init.d/udev restart

3.9 关闭adb

sudo adb kill-server

[sudo] password for administrator: 输入你的密码

3.10 开启adb

sudo adb start-server

3.11 出现
* daemon not running. starting it now on port 5037 ** daemon started successfully *

3.12 输入

sudo adb devices

3.13 出现类似这样,device这时已经识别到你的设备了.

List of devices attached 0123456789ABCDEF

******************************************************************************
******************************************************************************


4 同步源码

4.1打开终端:请输入:

mkdir -p ~/bin
mkdir -p ~/android/patchrom

个人目录下的bin目录是为了保存repo 等更新脚本的

4.2 依然再终端输入:

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo ~/bin/repo

chmod a+x ~/bin/repo

可以把 ~/bin/repo 加入到环境变量里面终端输入 sudo gedit /etc/environment
在PATH=“”加入PATH=/home/colinchen/bin:qingtian为我个人目录的名称,也就是我的计算机登录名更改结束之后终端输入 source /etc/environment
就能直接在终端中使用repo 命令了。


4.3 同步MIUI代码


我们创建一个patchrom 目录,使用patchrom 的树来初始化你的本地仓库


mkdir patchrom

cd patchrom


repo init -u git://github.com/MiCode/patchrom.git -b ics (MIUI V4)
repo init -u git://github.com/MiCode/patchrom.git -b jellybean (MIUI V5)
repo init -u git://github.com/MiCode/patchrom.git -b jellybean42-mtk (MIUI V5-MTK)


注意 上面3个是选择一个进行同步!然后我们就可以开始同步啦。

 

repo sync

 

适配过程miui系统的适配就是利用小米公司在github上面提供的patchrom然后我们自己做修改,它的原理就是通过反编译生成的smali文件进行对比:
把我们的系统生成一份smali文件miui系统生成一份smali文件原生android未做修改的系统也生成一份smali文件然后就去对比miui相对原生android做过哪些修改,然后我们就把我们系统对应的smali文件也做相应的修改,从而达到适配的目的。
现在miui的patchrom的脚本已经很强大了,我们只要改好smali文件后,剩下的一些资源和其他文件miui自己的脚本会自动帮我们加入到我们的工程里面来。首先是先使用repo同步miui的

 


同步好了就可以开始适配之旅了:

 

 

 

首先配置下环境


. build/envsetup.sh

 

新建自己的机型目录


mkdir h30_u10

cd h30_u10

 

然后就是提取官方刷机包:

rec提取的方法:

../tools/releasetools/ota_target_from_phone -r

采用开机提取的方法:

../tools/releasetools/ota_target_from_phone -n


出现下列参数:输入YES即可
Warning: the ota package will not contain bootimage!!!
Maybe you forget to pass the ota-package parameter.
Are you sure this is really what you want(yes/no):yes

 

等待提取成功,会在我们的机型目录下成功一个stockrom.zip,这个就是我们的ROM包,还会生成一个metadata目录,里面主要记录一些我们手机的分区信息和签名信息,这两个不文件不能删了,后续生成自己的ROM包需要用。


然后从工程的android/目录下拷贝一个makefile文件到我们的手机目录,把里面的这一项
local-zip-file := null.zip改成
local-zip-file := stockrom.zip

然后我们就可以反编译我们刚刚提取出来的官方包了:


同步MTK的源码就不用这步了。
反编译前来个插曲:由于我们的系统是AOSP的底包,所以还要对build/目录下的porting.mk文件的
MIUI_JARS := services android.policy framework framework2
改成
MIUI_JARS := services android.policy framework framework_ext改好后就可以在终端敲入:
make workspace反编译后在我们的目录下就会生成反编译的目录,以后我们的插桩就是对这些文件进行patch

 

 

然后终端敲入:
make firstpatch 时间有点长,等待完成。


完成后会在机型目录下生成一个temp目录

里面有四个文件夹:


dst_smali_orig //这个是我们的系统反编译的smali文件dst_smali_patched //这个是我们执行make firstpatch命令有脚本自动给我们打的

patchnew_smali //这个是miui系统反编译的smali文件old_smali //这个是android原生的反编译的smali文件

reject //这个是make firstpatch自动打patch失败的smali文件我们需要关注的就是reject目录,把自动patch打入失败的我们手动加进去,失败的原因就是因为我们的系统对于那部分有过修改,所以上下文对不上,加不进去。手动加入patch的步骤就是先看miu系统和原生的android的区别,然后再看我们的系统跟原生的区别,我们就根据这两点把失败patch的加进去。

举一个例子:

在temp下的
reject/android.policy.jar.out/smali/com/android/internal/policy/impl/有这个一个patch没打上
KeyguardUpdateMonitor.smali.rej双击打开看到里面有这个的话:
*** 93,98 ****
.end annotation
.end field.field private mTelephonyPlmn:Ljava/lang/CharSequence;.field private mTelephonySpn:Ljava/lang/CharSequence;
— 94,105 —-
.end annotation
.end field+ .field private mSkipSimStateChange:Z
+ .annotation build Landroid/annotation/MiuiHook;
+ value = .enum Landroid/annotation/MiuiHook$MiuiHookType;-NEW_FIELD:Landroid/annotation/MiuiHook$MiuiHookType;
+ .end annotation
+ .end field
+
.field private mTelephonyPlmn:Ljava/lang/CharSequence;.field private mTelephonySpn:Ljava/lang/CharSequence;
这个跟我们的gitk一样的标注,我们就是要在我们机型目录下的android.policy.jar.out/smali/com/android/internal/policy/impl/
在KeyguardUpdateMonitor.smali里面相应的位置加入这几条语句:
.field private mSkipSimStateChange:Z
.annotation build Landroid/annotation/MiuiHook;
value = .enum Landroid/annotation/MiuiHook$MiuiHookType;-NEW_FIELD:Landroid/annotation/MiuiHook$MiuiHookType;
.end annotation
.end field
我建议是每加入一处编译一次,成功了就继续加,失败了就找原因,因为反编译回去的时候报错是天书,看不懂的,如果一次改动太多文件才编译最后就不知道是哪个文件报的错了。
反编译测试有没有报错是在我们的机型目录下:
假设我们手动patch的是 android.policy.jar.out这个目录

在终端就输:
apktool b android.policy.jar.out
能通过就行。等我们把temp目录下所有的.smali.rej手动加入完成之后就可以在终端输入:
make fullota完成了在机型目录的out文件夹下的
fullota.zip就是我们需要的ROM包了,刷入后就是适配好了的miui系统。(当然会是各种卡屏,FC,我们只能通过logcat日志再重新分析插桩的问题,重新修改再编译,最后肯定是可以适配完成的) 经过修改部分。

 

另附miui patchrom视频教程http://pan.baidu.com/s/1d08bT

miui patchrom项目开发详细教程(Being updated),布布扣,bubuko.com

miui patchrom项目开发详细教程(Being updated)

标签:android   style   class   c   code   java   

原文地址:http://www.cnblogs.com/qinglinchen/p/3748228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!