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
