miui patchrom項目開發詳細教程(Being updated)


 

 

 

 

 

linux64位android開發環境

miui patchrom項目開發


by: curtischen 整合修改【本人正在學習中,一直更新】

 

 

 

 


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM