标签: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