Pages

December 24, 2010

githubにプッシュ

git init
git add .
git commit -m 'first commit'
git remote add origin git@github.com:hoge/fuga.git
git push origin master

December 12, 2010

IS01 rooterでうまーくモジュールが呼び出せないとおもったらの巻き

※文鎮化する可能性が高い操作を行っていますので注意してください。

いやはや便利な者が出来てしまうとそれに頼ってしまうのですが、それが盲点となってしまった。

たぶん僕だけの環境で起こったことだと思うので気にせずに^^;

MIRO氏作成のIS01 rooter_002ですが、こちらを使用した際にmsm_nand_exをinsmodすることが出来なかった。

なぜ出来なかったのか?

まずは、/sqlite_journals/is01root/以下にあるautoexecに実行権限が付与されていなかった。
#chmod 755 /sqlite_journals/is01root/autoexec.sh

それと。autoexec.shに書かれている2行に「/sqlite_journals/is01root/_su ...」とあるが、is01root以下に「_su」が入っていない。
ファイルをDL解凍したら
adb push _su /sqlite_journals/is01root/
#chown root.root _su
#chmod 6755 _su
で再起動を行う。
これでlsmodしてモジュールがロードされていればおkです。
あと*.koは基本的に644で。

で、ここまで書いたが。
MIRO氏はたぶんsystemを書き込めないように上記手順を行わなかったのかなと思います。

December 04, 2010

IS01のkernelをビルドしちゃおう! ※修正: 20101213

※このビルドはNANDロック解除などのセキュリティ部分の解除はしていません。

nandロックが解除出きるようになって、recovery等の書き変えも可能になりいろいろと旬になってきたIS01ですが、まだまだスタートしたばかりです。

で、まぁカスタムロム作りたくてandroidのソースをぼちぼち読んでいるのですが云々。

さてさて、今回はSH Developers Squareに公開されているIS01のkernelソースをビルドしていきます。

ソースは前記事のスクリプトから取得しておきましょう。

STEP1: android.git.kernel.orgからコンパイル用ソースをとってきましょう。(既にやっている人はSTEP2へ)
#mkdir mydroid
#wget http://android.git.kernel.org/repo
#chmod 755 repo
#./repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
#./repo sync
ここのSTEPは取得に時間がかかりますので気長に待ちましょう。

STEP2: IS01のソースをビルドするための準備1
IS01のkernelソースに移動
#vim ./arch/arm/mach-msm/sh_sleepcheck.c
最初の行にある#include <smd_private.h>を#include "smd_private.h"
に書き換える。diffはよーわからないのでそのうち勉強する。

STEP3: IS01のソースをビルドするための準備2
IS01での操作です。
rootとった状態でTerminal Emulatorから
#busybox cp /proc/config.gz /sdcard/config.gz ←この操作はbusyboxとそのpathが必要です。
config.gzをPCに持ってきて展開する。
それをIS01のkernelフォルダに「.config」という名前で保存してください。
「.config」はmakeするときに使用します。

STEP4: kernelのビルド
#make ARCH=arm CROSS_COMPILE=../../mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
を実行すると、
arch/arm/boot/にImageというファイルが出来上がります。これがkernelです。
お疲れ様でした。


と記事書いてたら仙石さんが仕事早いw
Android 端末 IS01 のカーネルを入れ替えてみた ? さよならデッカード LSM
とりあえず僕はnandプロテクト外したものを作っています。
froyoベースになるにはもうちょいお勉強。。


STEP 番外編1: android.kernel.orgとcode auroraからのkernelソース取得
・純粋なandroid向けkernelの取得
mkdir android_kernel ←適宜名前変更してください
git clone git://android.git.kernel.org/kernel/msm.git -b android-msm-2.6.35
2.6.29の場合は「android-msm-2.6.29」です。なお各ブランチはこちらを参考にしてください。

・IS01のベースとなったとされるcodeauroraのkernelの取得
mkdir aurora
git clone git://codeaurora.org/kernel/msm.git msm-kernel 
cd msm-kernel 
git checkout origin/android-msm-2.6.29b 
git checkout dcdb890bc3e49ba5091230e73e976d9f6860fffe
wiki参考



どうでもいいこと:なんでSTEP2で書き換えたのかは…
カーネルソースを修正せずにmakeしたらエラーが出た。これはひどい、、
arch/arm/mach-msm/sh_sleepcheck.c:27:25: error: smd_private.h: No such file or directory
arch/arm/mach-msm/sh_sleepcheck.c: In function 'sh_sleepcheck_name_m_show':
arch/arm/mach-msm/sh_sleepcheck.c:625: error: implicit declaration of function 'smem_get_entry'
arch/arm/mach-msm/sh_sleepcheck.c:625: error: 'SMEM_SLEEP_STATIC' undeclared (first use in this function)
arch/arm/mach-msm/sh_sleepcheck.c:625: error: (Each undeclared identifier is reported only once
arch/arm/mach-msm/sh_sleepcheck.c:625: error: for each function it appears in.)
cc1: warnings being treated as errors
arch/arm/mach-msm/sh_sleepcheck.c:625: warning: assignment makes pointer from integer without a cast
make[1]: *** [arch/arm/mach-msm/sh_sleepcheck.o] エラー 1
make: *** [arch/arm/mach-msm] エラー 2
てなかんじのエラーが。まさか素の状態でこんなもんでるとは思わなかったw
で、まぁ上のSTEPで修正していたわけですね。



repoつかったりgit clone使ったりしてるのは、途中でエラーが発生したりしなかったり謎なため。

December 03, 2010

SH DevelopersSquareからIS01等のAndroid向けソースをDLするスクリプト作ったよ!

SH DevelopersSquareがgitとかsvnとか用意してくれていないのでソースのDLがまんどくさいことこの上ないのでPythonでスクリプトを作成しました。


このスクリプトを利用することにより、is01, sh-10b, jn-dk01のソースを取得・展開してくれます。


使い方(Ubuntu環境)は以下の通りです。


まず、easy_install等で必要なモジュールをインストールします。
#sudo apt-get install setup_tools ←インストールしていない場合
#sudo easy_install -U MultipartPostHandler
#sudo easy_install -U BeautifulSoup


スクリプトの実行例は以下の通りです。
#python ./sdasg.py is01 ←is01のソースを取得・展開したい場合
#python ./sdasg.py sh-10b ←sh-10bのソースを取得・展開したい場合
#python ./sdasg.py jn-dk01 ←jn-dk01のソースを取得・展開したい場合


以下がスクリプトです。
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# Name:        SH Dev Android Source Getter(特に名前決めてない)
# Purpose:     (https://sh-dev.sharp.co.jp/android/modules/oss/)がsvnやgitでの
#              ソース公開してなかったので自動でダウンロードしてきて展開するスク
#              リプト作った。
#              使用する際は、GPL(http://www.gnu.org/licenses/)と各々のソフトウェ
#              ア使用許諾契約書に同意すること。
#
# Usage:       引数にis01, sh-10b, jn-dk01のどれかを与えてください。
#              スクリプト直下にディレクトリを作られ保存されます。
#              例)is01のソースを取得・展開します。
#                 #python ./sdasg.py is01
#
# Require      MultipartPostHandler, BeautifulSoupをeasy_installなどでインストー
#              ルしてください。
#
# Author:      renax64.blogspot.com
#
# Created:     02/12/2010, ver. 0.3
# Copyright:   (c) renax64.blogspot.com 2010
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import os
import sys
from BeautifulSoup import BeautifulSoup
#import datetime
import urllib2
import MultipartPostHandler
import cookielib
import tarfile

#初期値: 対策されたときここを書き換える
init_vals ={
    "main_url":"https://sh-dev.sharp.co.jp/android/modules/oss/index.php?/",
    "is01":"is01",
    "sh-10b":"sh10b",
    "jn-dk01":"jndk01",
    "dl_form_class":"dl2_center",
    "dl_tr_class":"dl2_data",
    "td_date_class":"dl2_center",
    "td_filename_style":"padding-left:1em",
    "form_post_class":"dl2_center",
    "input_name":"ticket",
    "accept":"同意する ( ダウンロード )",
    "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12",
    "Content-Type":"multipart/form-data"
    }

#ファイルの取得・展開
def getFile(link, filename, device):
    try:
        html = urllib2.urlopen(link)
        soup = BeautifulSoup(html)
        form = soup.find("form", {"class":init_vals["form_post_class"]})
        ticket = form.find("input", {"name":init_vals["input_name"]}).get("value")
        params = {"ticket":ticket, "accept":init_vals["accept"]}
        cookies = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),MultipartPostHandler.MultipartPostHandler)
        opener.addheaders = [("User-agent",init_vals["User-Agent"]),
                            ("Content-Type",init_vals["Content-Type"]),
                            ("Referer",link)]
        f = opener.open(link, params)
        #device_sourceディレクトリ作成
        dir_name = device + "_sources"
        os.chdir(os.path.dirname(os.path.abspath(__file__)))
        current_dir = os.getcwd()
        if os.path.isdir(dir_name) != True:
            os.mkdir(dir_name)
        #device_sourceディレクトリへ移動
        os.chdir(dir_name)
        #ファイル書き込み
        fw = open(filename,'wb')
        print u"現在 %s をダウンロード中..." % filename
        fw.write(f.read())
        fw.close()
        #ファイル展開
        ft = tarfile.open(filename,"r")
        print u"現在 %s を展開中..." % filename
        ft.extractall("./")
        ft.close()
        #元のディレクトリへ移動
        os.chdir(current_dir)
    except urllib2.HTTPError, e:
        e.code, e.msg
        pass

def getInf(device):
    #オープンソースソフトウェアのファイル一覧ページの解析
    curl = init_vals["main_url"] + init_vals[device]
    try:
        html = urllib2.urlopen(curl).read()
        soup = BeautifulSoup(html)
        tr_data = soup.findAll("tr", {"class":init_vals["dl_tr_class"]})
        trs = []
        for i in tr_data:
            link = init_vals["main_url"] + i.a.get("href").replace("./index.php?/", "")
            #dateは差分処理を実装しようとして取得したが、そこまでする必要もないと思い放置
            dates = i.findAll("td", {"class":init_vals["td_date_class"]})
            for ix in dates:
                date = ix.renderContents().split("/")
            files = i.findAll("td", {"style":init_vals["td_filename_style"]})
            for iy in files:
                filename = iy.a.renderContents()
            array = dict([["link", link], ["date", date], ["filename", filename]])
            trs.append(array)
            #ファイルの取得
            getFile(link, filename, device)
        return trs
    except urllib2.HTTPError, e:
        e.code, e.msg
        pass

def main():
    #引数の取得
    argvs = sys.argv
    argc = len(argvs)
    #実行
    #現在のディレクトリパスを取得
    c_dir = os.getcwd()
    if argc == 2:
        device = argvs[1]
        if device == "is01":
            getInf(device)
        elif device == "sh-10b":
            getInf(device)
        elif device == "jn-dk01":
            getInf(device)
        else:
            print "usage: #python ./sdasg.py (is01|sh-10b|jn-dk01)\n"
    else:
        print "usage: #python ./sdasg.py (is01|sh-10b|jn-dk01)\n"
    print u"すべてのファイルの取得・展開が終了しました。"

if __name__ == '__main__':
    main()


こちらからもスクリプトをDLすることができます。


更新履歴:
Ver. 0.3: 気づいた部分のスペルミス修正
Ver. 0.2: UbuntuなどのLinuxで動作しないバグを修正
Ver. 0.1: とりあえずリリース



beautifulsoupが3.0.1から3.2.0に変わったらHTMLParseErrorなくなってた!

beautifulsoupが3.0.1から3.2.0に変わったらHTMLParseErrorなくなっていました。


そういえばアップデートしてないなーとか思いながらeasy_installから実行したら、そうなっちまった。


良いことなのか悪いのか、


間違いなく例外とかfrom importとか書き換えないと行けない場所が出てしまった。


しかし、パースエラーあった部分が問題なくパースされるようになったりどっこいどっこいなのかな。


で、まぁアップデートによって


from html5lib import HTMLParser
from html5lib import treebuilders
from BeautifulSoup import HTMLParseError

try:
 soup = BeautifulSoup(html)
except HTMLParseError, e:
 parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"))
 soup = parser.parse(html)

とかやって別なパーサーでエラー部分を除去って貰う形をとっていたことが必要なくなったのかな?

ということで前回書いた記事「BeautifulSoupでHTMLParseErrorが起きた時の対処」もこんなことやれば良かったのかな?



まぁまとめるとアップデートしとけ(゚Д゚)ゴルァ!! ですね・・・w