Sony Ericsson Xperia X10 刷 2.3.3 + Root + xRecovery教學

Sony Ericsson Xperia™ X10 刷機教學整理

==================================================

 

Step1. 請於x10進入OS(操作系統) 做

設定->應用程式->開發->USB偵錯->打勾
設定->應用程式->開發->螢幕保持開啟->打勾
設定->應用程式->未知的來源->打勾

Step2. 下載並安裝Update Service
選擇X10

依照畫面指示 關閉你的手機

USB線接上手機,按住Back鍵不放並同時將USB線接上PC
進入刷機模式

Update Service抓到手機後會自動進行網路下載版本和更新的動作
然後最後會提示你拔除USB線,然後開機
這樣2.3.3就升級成功了

Step3. 進入OS(操作系統)之後確認為2.3.3
接下來,打開FlashTool

按下flash
點選X10_aZuZu_Kernel_Downgrade_Generic按下OK
依照畫面指示進入刷機模式 (請參考Step2)
刷機的Log直到出現turn on your usb debug就OK!!!

Step4. 拔除USB線,按電源鍵開機,當感到開機的時候的些微震動就可以接回USB線

在pc的FlashTool root鍵的位置會變成可按的,按下root。直到Root should be available after reboot!

Step5. 完成root時,手機不管有沒有自動reboot,把電池拔掉數分鐘。pc端USB拔除。

Step6. 刷入X10_aZuZu_Kernel_UpGrade_Generic,步驟相同請參考Step3

Step7. 點選 Ask Root Perms 之後請注意你的手機,他會問你是否接受root程序,請按「接受」

之後手機端會出現「Unknown已經獲得最高權限」的字樣
這時候FlashTool上的 xRecovery按鈕應該成為可點選了,然後按下xRecovery
並等待其安裝成功

==================如何進入X10的刷機模式==================
1. 關閉你的手機

(註:在還沒按住Back鍵之前,畫面上不能有Sony Ericsson字樣或者電池充電中的圖示。若有,可以拔電池約一分鐘再接回去,接上電池後等待約30秒左右,讓系統偵測完畢。也確定他為黑螢幕)

2. USB線接上手機,按住Back鍵不放並同時將USB線接上PC
進入刷機模式

3. 成功進入刷機模式的話,手機的右上角會亮綠燈
(綠燈亮了之後就可以放掉Back鍵,不用再按住Back鍵不放了)

而且PC上會多出一個叫SEMC USB Flash driver的不明裝置
那個驅動在FlashTool_0.2.9.1\drivers\X10_ADB_drivers.zip
解壓縮後的資料夾內

4. SEMC USB Flash driver的不明裝置,安裝完驅動會變成
Sony Ericsson sa0102 ADB Interface

================如何進入刷入後的xRecovery================
重新開機,看到Sony Ericsson的白字的時候,連續按返回鍵,不是按住喔,是一直連續0.5-1秒按放按放,之後會跑出Xrecovery模式
按音量的上下鍵選擇,右方的Back鍵就是返回,中間的Home按鍵則是進入,這時候電源鍵會變成無用

 

 =================================================

這次刷機有用到的文章

[教學] x10 2.3.3 root+Recovery完全教學
http://gphonefans.net/thread-59094-1-1.html

[教學] X10新手ROOT+安裝busybox,xRecovery刷2.2+變磚救機術
http://gphonefans.net/thread-34157-1-1.html

Flashtool軟體網站 (目前版本 Flashtool v0.5.3.0)
http://androxyde.github.com/Flashtool/

====================找到的一些教學====================

X10一鍵 解鎖/上鎖
http://www.mobile01.com/topicdetail.php?f=569&t=2062214

[RECOVERY image] {v2} X10 GB 3.0.1.G.0.75 [Prerooted + Fixed xRecovery]
http://forum.xda-developers.com/showthread.php?t=1192152&fb_source=message

===========自訂的ROM (朋友推薦的,不過沒用到就是了)===========

X10 Wolfs V7(Test V3)/ThGo2_v9.3 (畫面很順) (11/5)X10台灣版2.3.3官方版可一鍵root
http://www.mobile01.com/topicdetail.php?f=569&t=2288956&last=32340524

[Android] ViewFlipper “Receiver not registered” 的 bug

又抓到一個bug了,真開心

這次是Android自己本身控件的問題

有使用到ViewFlipper的朋友注意了

 

如果最近有遇到這個bug

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@464946a0

at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:814)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
at android.view.View.dispatchDetachedFromWindow(View.java:6033)
…….(略刪)

網友看過source code 發現是google本身控件的Bug

可以用以下,最簡單的方式可以這樣解決

—————————————————————————-

解決方式

建立一個package名字叫做com.J_Test.temp

建立一個class名稱叫做myViewFlipper 

貼上其程式碼

 

package
com.J_Test.temp;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ViewFlipper;

public class myViewFlipper extends ViewFlipper

{
     // 建立預設的建構子
     public myViewFlipper(Context context)
     {
           super(context);
     }

     public myViewFlipper(Context context,
AttributeSet attrs)
     {
           super(context, attrs);
     }

 
     @Override
     protected void onDetachedFromWindow()
     {
           // Android 2.1~2.3.4bug ()
           // 解決ViewFlipper “Receiver not
registered” Error
           try
           {
                super.onDetachedFromWindow();
           } catch (IllegalArgumentException e)
           {
                stopFlipping();
           }
     }
}

 

 

使用方式

將舊有的程式碼

   <ViewFlipper
        android:id=“@+id/flipper”
        android:layout_width=“match_parent”
        android:layout_height=“wrap_content”
        android:flipInterval=“5000”
        android:inAnimation=“@anim/push_up_in”
        android:outAnimation=“@anim/push_up_out” >

 ………….

    </ViewFlipper>

替換掉成我們的控件

   <com.J_Test.temp.myViewFlipper
        android:id=“@+id/flipper”
        android:layout_width=“match_parent”
        android:layout_height=“wrap_content”
        android:flipInterval=“5000”
        android:inAnimation=“@anim/push_up_in”
        android:outAnimation=“@anim/push_up_out” >

 ………….

    </com.J_Test.v1.temp.myViewFlipper>

 

這樣就OK了

 

原理就是上述藍色字處有bug

我們繼承它,把super()用try-catch把他接起來

然後呼叫stopFlipping()會讓所有程序停止

 

 

—————————————————————————-

測試方式如下:

在XML做一個ViewFlipper

JAVA程式對應尋找其View

ViewFlipper mFlipper = (ViewFlipper) findViewById(R.id.flipper);

還沒有呼叫

mFlipper.startFlipping();

之前就把螢幕轉向

網友測試好像從Android 2.1就出現此bug

測試從Android 2.3.4都還仍然依舊

—————————————————————————-

 

 

參考資料

http://daniel-codes.blogspot.com/2010/05/viewflipper-receiver-not-registered.html
http://code.google.com/p/android/issues/detail?id=6191


[Android] 多執行緒-Handler和Thread的關係 (2)

之前寫過一個多執行緒,發現還是寫太亂了,不夠簡單

http://j796160836.pixnet.net/blog/post/28766165

 

我重新敘述一下

 

多執行緒的部分,有幾個名詞

  • Runnable 工作包 (要做的事情)
  • Thread 執行緒
  • Handler
  • Message

 

————————————————————————–

Runnable

就是像是專案管理裡的工作包,說穿了就是要做的事情啦,像是這樣

   private Runnable r1=new Runnable () {

        public void run() {

            //………………………..

            //做了很多事

        }

    };

這裡的 r1 就是一個runnable

————————————————————————–

Thread

在Android的世界裡,Thread分成二種

1.  單次型 (Java原有的)

2.  常駐型 (Android特有的)

 

 

————————————————————————–

1.  單次型

意指就是給他一件艱巨的任務

他做完就會關閉了

 

寫法實在有夠簡單

   
   Thread t1=
new Thread(r1);

   t1.start();


這裡的 r1 是一個runnable

————————————————————————–

 

2.  常駐型

就是做完事情他不會自動關閉,而是變成一個idle (閒置) 的狀態

閒置意思就是他沒事幹啦~  要給他事情做

 

        mThread = new HandlerThread(“name”);

        //Worker待命,等待其工作 (開啟Thread)

        mThread.start();

這樣子就可以建立且執行Thread了

連Runnable也不想打的話可以合併起來

 

     Thread XXX = new Thread(new Runnable()

     {

           publicvoid run()

           {

                // ……工作

           }

     }).start();

 

要給他事情做要這樣寫

 mThreadHandler.post(r1);

 

 

有沒有發現,單次型的Thread就是把事情定義下來然後呼叫start()

開始跑,跑完關閉

 

而常駐型的話,反而是讓你先start()

然後post(r1)   給他事情做,做完就閒置

 

請務必記得不用這個Thread的時候要把他關閉


        if (mThread != null)
            mThread.quit();

大部分的情況,常駐型的Thread

在onCreate()裡面建立Thread

在onDestory()裡面關閉Thread



————————————————————————–

Handler

那甚麼是Handler呢?

你可以想成是一個服務的窗口

給他事情做的地方


寫法有二種


1.  mUI_Handler.post(r2);
2.  mUI_Handler.sendEmptyMessage(MSG_UPLOAD_OK);

第一種就是直接給他一個Runnable,讓他去執行

第二種就是傳一個Message給他



Handler的建立

 private Handler mUI_Handler = new Handler();

這樣會建立一個基於Main Thread (UI Thread)的Handler


————————————————————————–

Message


這東西不複雜,剛剛不是還在講Runnable嘛?

Message就是要一言以蔽之,用一個值  (一句話)
代表一堆事情(Runnable)


先看看Handler的變形吧


Handler的建立

 private Handler mUI_Handler = new Handler();

這樣會建立一個基於Main Thread (UI Thread)的Handler

以下是他的變形

     private Handler mUI_Handler new Handler()

     {

           @Override

           public void handleMessage(Message msg)

           {

                switch (msg.what)

                {

                     case MSG_UPLOAD_OK:

                           // …………..

                           break;

                }

           }

     };

這樣會建立一個基於Main Thread (UI Thread)的Handler

有一個窗口,有一個地方可以處理Message的地方  ( 就是handleMessage() )

這裡用一個switch case的格式表示

msg.what  就是你訊息的內容

MSG_UPLOAD_OK  這就是你的訊息了(自己自訂)

像這樣

privatestaticfinalint MSG_UPLOAD_OK= 0x00000001;

說穿了就是個int而已


要使用的時候就這樣

 mUI_Handler.sendEmptyMessage(MSG_UPLOAD_OK);

可以使用帶參數的寫法

 mUI_Handler.obtainMessage(MSG_UPLOAD_OK, arg1, arg2).sendToTarget();

或是

 mUI_Handler.obtainMessage(MSG_UPLOAD_OK, obj1).sendToTarget();

這樣可以帶二個int去,或是直接帶object給他(收到了之後再去轉型…)









[Android] 如何Debug 含有Bundle (has Extra) 的Intent

2012-12-24 02 15 06  

不知道在Android做Intent除錯時
和我有類似的經驗

自己寫的APP,明明看到LogCat上面寫著

 

Starting activity: Intent { cmp=<你的Package名稱>/.<你的Activity名稱> (has extras) }

 

對呀,我的Activity被Intent喚起來了

但那個has extras又是啥鬼?
阿我就是想知道那些Extras是啥呀(怒吼~

 


 

如果用Log直接把Intent直接toString

Log.v("Test Intent", intent.toString());

對不起他只會跟你說是個物件,ID為何
這訊息根本不是我們想要的

 


 

沒關係,有解的。

 

你需要

intent.getExtras()

會回傳Bundle

 

利用Bundle的

bundle.keySet()  來達成

它會回傳一個只有Key名字的hash

那你可以使用.toArray()轉換成普通的陣列

 

組合起來成為一長串

Log.v("Test Intent", intent.getExtras().keySet().toArray().toString())

 

 就是它了。

 

 

參考文章
http://groups.google.com/group/android-developers/browse_thread/thread/00828fe418964285

[SQL] 多個各自count之後還要join成一張表 (在多個表格裡count資料)

我這個標題我還想了一下要怎麼下

下太複雜我怕大家又看不太懂,還有搜尋引擎關鍵字的問題

(題外話……)

 

這個用看的不會懂,做過才知道其中的奧妙

————————————————————————–

問題

問題是這樣的

 

假設說,我有個資料庫,分別存了A表格 B表格 C表格 ……

都是主鍵(Primary Key)+外鍵(Foreign Key)的格式

這幾張表都有外來鍵只向同一張表格的主鍵

也就是

A表格

A_id(主鍵)  A_name  data ……

B表格

B_id(主鍵)   A_id(外來鍵)   data ……

C表格

C_id(主鍵)   A_id(外來鍵)   data ……

 

如今

 

我想要個別統計一下資料的狀況

 

最後呈現的欄位是這樣
A_id    A_name   B_count  C_count

 

這對我們來說不是難事

所以我們在資料庫下了這些SQL  (以下使用MySQL的格式表示)

 

對表格B做統計
SELECT `A_id`, COUNT(`B_id`) as `B_count` FROM `tableB` GROUP BY `A_id`;

 

得到
A_id    B_count  的欄位

 

對表格B做統計
SELECT `A_id`, COUNT(`C_id`) as `C_count` FROM `tableC` GROUP BY `A_id`;

 

得到
A_id    C_count  的欄位

 

問題來了

我們有學過JOIN,他們都有A_id
我們如何把他們另外統計的二張表格合起來

還要顯示A表格的其他內容

 

你要如何做?

 

————————————————————————–

第一,我可能會想到在JOIN的過程中

不能直接JOIN起來的話

好歹列數也要一致相同吧

所以我改這樣下

SELECT `A_id`, `A_name`, COUNT(`tableB`.`A_id`) as `B_count` FROM `tableA` LEFT JOIN `tableB` ON `tableA`.`A_id`=`tableB`.`A_id` GROUP BY `tableA`.`A_id`;

SELECT `A_id`, `A_name`, COUNT(`tableC`.`A_id`) as `C_count` FROM `tableA` LEFT JOIN `tableC` ON `tableA`.`A_id`=`tableC`.`A_id` GROUP BY `tableA`.`A_id`;

 

 

使用LEFT JOIN是因為INNER JOIN是有對到資料才會出現

而LEFT JOIN才會顯示Count是零的狀況

 

這樣也不盡人意……

 

 

————————————————————————–

解答

找好久才找到這個解答

我個人認為其重要性接近死背這個架構

 

SELECT `A_id`, `A_name`,

(SELECT COUNT(*) FROM `tableB` WHERE  `tableB`.`A_id`=`tableA`.`A_id`) AS `B_count`,  

(SELECT COUNT(*) FROM `tableC` WHERE  `tableC`.`A_id`=`tableA`.`A_id`) AS `C_count`,  

FROM `tableA`;

 

這個架構叫做

關聯子查詢

SQL語句裡面跟外面有產生關聯的

但是光看問題不會馬上想到這個架構

 

 

解釋

簡單來說一句SQL語法做了三個動作

 

從刮號裡面先看好了

裡面有二句SQL語法,看起來像是獨立的但不能跑

會有這個錯誤

#1054 – Unknown column ‘tableA.A_id’ in ‘where clause’

因為他找不到tableA在哪裡

 

 

SELECT COUNT(*) FROM `tableB` WHERE  `tableB`.`A_id`=`tableA`.`A_id`

這句的意思是計算tableB總共有幾筆

我們有學到在WHERE裡面打上

`tableB`.`A_id`=`tableA`.`A_id`

意思就是要讓表格合併起來 (像是INNER JOIN)

 

—————————————————-

*TIPS:

 

WHERE id=id能獨立跑的是這個

SELECT `tableA`.*, `tableB`.* FROM `tableA`, `tableB` WHERE `tableB`.`A_id`=`tableA`.`A_id`

用INNER JOIN 改寫變成

SELECT `tableA`.*, `tableB`.* FROM `tableA`INNER JOIN `tableB` ON `tableB`.`A_id`=`tableA`.`A_id`

 

—————————————————-

在來就是外面那層

SELECT `A_id`, `A_name`, (……) AS `B_count`,  (……) AS `C_count`,  FROM `tableA`;

就只有簡單的撈整張表格出來而已

 

AS就是做欄位別名

整個SQL語句要做為一個欄位賦予別名

那該SQL語句必須資料輸出一個欄位而已

這裡輸出COUNT(*)剛好只有一欄,符合規定

 

—————————————————-

其它範例

 

有個問卷的系統,表格長這樣

這個學生詢問了向各種對象,問各種不同的問題,放在不同的表格

而如今他想要把他的問題做統計

 

欄位名稱如下

Student(id,name,mykad,…)
Customer Service(id, Q1,Q2,Q3,date)
Instructor(id, Q1,Q2,Q3,date)
Runner(id, Q1,Q2,Q3,date)

SQL語法如下:

SELECT A.name, A.mykad, 

(select count(*) from customerservice B where B.id = A.id and B.Q1=’Excellent’) AS E, 
(select count(*) from customerservice C where C.id = A.id and C.Q1=’Satisfaction’) AS S,
(select count(*) from customerservice D where D.id = A.id and D.Q1=’Poor’) AS P
FROM student A

就會輸出欄位

name   mykad  E  S  P

 

這裡的參考資料一定要看,他寫的比我還要詳細

http://stackoverflow.com/questions/1279569/sql-combine-select-count-from-multiple-tables
http://www.daniweb.com/software-development/legacy-and-other-languages/threads/352342

[Android] ‘aapt’ error. Pre Compiler Build aborted. (aapt.exe crash)

又是個Android SDK的很嚴重的Bug

從8/16發現,一直到現在9月了,才把這個嚴重的Bug給繞過去

搞了一個多月了,終於不用再找其他電腦頂替了

 

2011-08-16 00 58 01.png

 

 

 

怎麼說呢

使用的是Windows版Android SDK r12版(最新)

使用Java版本:已測試JDK 6u23 6u24 6u25 6u26皆有這狀況

只要是在Library裡面有drawable,aapt.exe又是在verbose模式底下

就一定會crash

 

請大家集氣反映給google請他修掉這個Bug~

 

 

測試方式如下

  1. open an Android project under eclipse and call it ‘a’
  2. open the ‘a’ properties and check the ‘Is Library’ check box.
  3. open another Android project and name it ‘b’.
  4. open it’s properties and add ‘a’ as an android library it uses.
  5. open the android plugin preferences and change the build from silent to verbose
  6. clean both projects.
  7. on linux everything is neat, on windows it crashes after the line:’baseFile zd has flavor (null)’ which according to linux should be:’baseFile 0 has flavor ,,,,,,,,,,,hdpi,,,,,,,’ most chances null pointer exception occurs here, the question is why only on windows ?

 

  1.  eclipse開一個專案叫A
    2.  A專案  滑鼠右鍵 >  內容,勾上Is Library
    3.  開另一個專案叫B
    4.  B專案 滑鼠右鍵 > 內容,引用A專案的函式庫
    5.  在eclipse裡, Windows > Preferences > Android > Build

Build output的選項為Verbose

  1.   二個專案分別做 Project > Clean

  2.  跳出Bug

[2011-09-03 01:41:01 – (專案名稱A)] Refreshing resource folders.
[2011-09-03 01:41:01 – (專案名稱A)] Starting full Pre Compiler.
[2011-09-03 01:41:01 – (專案名稱A)] Removing generated java classes.
[2011-09-03 01:41:01 – (專案名稱A)] Preparing generated java files for update/creation.
(android-sdk路徑)platform-toolsaapt.exe package -m -v –auto-add-overlay
-J (專案路徑A)gen -M (專案路徑A)AndroidManifest.xml -S (專案路徑A)res
-S (專案路徑B)res -I (android-sdk路徑)platformsandroid-8android.jar 
[2011-09-03 01:41:05 – (專案名稱A)] ‘aapt’ error. Pre Compiler Build aborted.

把系統產生的ㄧ大串指令貼到cmd上得到

(…..前面略)
Including resources from package: (android-sdk路徑)platformsandroid-8android.jar

applyFileOverlay for drawable
trying overlaySet Key=icon.png
baseFile zd has flavor (null)

 


 

解決方法其實上面就有提到了

我還是補一下圖好了

 

在eclipse裡, Windows > Preferences

2011-09-03 02 15 05.png  

 

 

在 Android > Build這裡,將Build output改為Silent或是Normal即可繞過這個Bug

2011-09-03 02 17 58.png  


 

另外,順道一提

2011-09-03 02 30 27.png  

 

Android SDK r12版目前只能搭配 Java JDK 1.6.0 (6u xx)版唷~

(文章截止Java出到 JDK 1.6.0 (6u27) )

不能直接灌JDK 7喔

因為JDK 7的金鑰計算工具有改

JDK 6版預設使用MD5
JDK 7版預設使用SHA-1

在使用Google Map的時候,算key.store的時候,就會不管怎麼樣都會驗證不過  (哇哈哈~~)

 

 

 

補充:JDK7的使用者需要加上 -v 這個參數,使用MD5數值

keytool -v -list -keystore ~/.android/debug.keystore

就可以用它產生金鑰了, (感謝BB大大提供的方法)

 

 

Google  API 註冊頁面

http://code.google.com/android/maps-api-signup.html

2011-09-03 02 33 43.png  

 

 

 

 

希望大家能感受到Android小綠機器人快樂的體驗

而不會做小綠機器人的噩夢 (對開發者而言啦XD)

 

Google呀Google.   大家都在接連修正你的Bug…..(囧)

 

參考文章

http://stackoverflow.com/questions/6887886/debugging-android-tools-code-under-windows
http://comments.gmane.org/gmane.comp.handhelds.android.devel/146994

[分享] RT-N10+刷DD-WRT之後如何回復原廠設定

我的RT-N10+刷了DD-WRT剛好滿半年摟

 

已經買了第三台了

我真的蠻推這台的,蠻穩的

開BT也沒掛過

 

我最喜歡他的DD-WRT的

VPN功能,不過要搭配固定IP或是ddns使用會比較好用

DHCP Forward,這也是比一般的switch強大的地方

這真的要好好說一下

之前使用switch,直接向主要的分享器(DHCP功能)   去索取IP

當線路不穩定時,IP資訊就不見,網路就馬上斷線了

而且要回復連線時,還要重新去遠方索取IP,回復時間

 

 

但DHCP Forward的話,他會在機器上存份cache

當線路異常時,不會馬上移掉IP資訊,會改由次要分享器 索取IP資訊

(不知道我推論的對不對)

 

 

還沒有刷DD-WRT的看這裡

DD-WRT要看型號刷,不是每家分享器都可以這樣玩

http://j796160836.pixnet.net/blog/post/28819027

 

DD-WRT版本又更新摟 Build r17201  (2011-06-14)

路徑在

Path: Downloads › others › eko › BrainSlayer-V24-preSP2 › 2011 › 06-14-11-r17201 › Asus-RT-N10PLUS

 

 

————————————-

今天遇到設定Wifi Repeater的問題

DD-WRT也有提供Repeater的相關設定

但我可能設定不出來

 

 

想試試看原廠Rom的設定

但我的機器已經刷了DD-WRT怎麼辦?

 

請遵循以下步驟刷回原廠設定值  (這步驟原廠的說明書也有,我後來才找到   哈)

 

 

用筆尖戳Reset鈕數十秒,直到WPS燈到閃爍(半秒鐘亮、半秒鐘熄)

這時就已經進入了Recovery Mode了

 

這時候

你的電腦接上網路線,另一端接上

手動設定IP

IP: 192.168.1.2

Mask: 255.255.255.0

Gateway: 192.168.1.1

 

使用原廠的工具

Firmware Restoration軟體

 

解壓縮FW_RT_N10Plus_2016.zip得到RT-N10+_2.0.1.6.trx原廠韌體檔

指定路徑到  RT-N10+_2.0.1.6.trx  原廠韌體檔

按下Update

然後等待

 

之後在瀏覽器打

 

http://192.168.1.1/

 

預設帳號是admin密碼admin

 

就進的去了

 

 

 

參考文章

http://kururu6233.pixnet.net/blog/post/27817519-%E3%80%90%E8%B2%B7%E7%89%A9%E3%80%91asus-rt-n10%2B-%E7%84%A1%E7%B7%9A%E8%B7%AF%E7%94%B1%E5%99%A8

http://koukaipan.pixnet.net/blog/post/26909556#comment-29020862

http://tomatousb.org/forum/t-287762/build-53-bricked-asus-rt-n10  (這是給RT-N10用的,不過跟RT-N10+的步驟相同)

http://digiland.tw/viewtopic.php?id=1561   (RT-N10和RT-N10+的差異大比較,大概是N10+不能換天線N10可以,N10+的各個硬體配備比N10好,但比N10便宜,何樂不為?)

[Android] Google出的Android萬用驅動,驅動裝不上嗎?請看這

2011-08-20 01 44 53.png

 

 

我先說,這不一定適用所有其他非Android的usb驅動
這就要煩請你自已測試了,如有成功可以不吝分享給我

這是一篇不是給初學者看的文章,裡面盡是一堆歪招 haha

—————————————————————————–

之前我遇到一台白牌機的Android驅動裝不上,問了朋友他說

到SDK manager裡面,要確定一個叫做Google USB Driver有安裝

 

2011-08-20 01 54 28.png

2011-08-20 01 55 34.png   

然後

 

在我的電腦 右鍵 > 內容  找到裝置管理員  

2011-08-20 01 45 09.png2011-08-20 01 46 32.png

找到Android

2011-08-20 01 47 22.png

右鍵 > 更新驅動程式

2011-08-20 01 48 39.png  

 

選擇 Browse my computer for driver software

2011-08-20 01 49 28.png

 

 

 

 

這個是重點,Let me pick from a list device drivers on my computer

2011-08-20 01 49 52.png

 

 

到了選擇類型的頁面,選Show All Devices,直接按下一步

2011-08-20 01 50 56.png

 

按下have Disk…..   (從磁片安裝)

2011-08-20 01 51 38.png

 

 

 

選擇其路徑

 

然後選擇路徑      <你裝的android SDK的路徑>extrasgoogleusb_driverandroid_winusb.inf

我的是

C:Program FilesAndroidandroid-sdkextrasgoogleusb_driverandroid_winusb.inf

2011-08-20 01 51 52.png

找到android_winusb.inf

2011-08-20 01 53 33.png  

 

就會有三個可以選,隨便選,但通常是第一個

2011-08-20 01 52 25.png

詢問驅動程式簽章事宜,直接按確定繼續

2011-08-20 01 52 36.png  

 

就安裝完成了

2011-08-20 01 52 58.png

 


如果你的驅動已經安裝完畢的話就不用看這篇了

搞不定的話請跟我一起繼續奮鬥………

 

 

我的win7裝好了  但xp遲遲無法這樣安裝

 

 

 

 

 

 

有一天,我無意間開了android_winusb.inf

這才恍然大悟

 

有了這一招,應該沒有所謂的上不了的驅動

只是上了會不會跳藍底白字的畫面而已

 


2011-09-03 03 14 08.png

 

這是Google USB Driver, r4

裡面的android_winusb.inf  內容

 

;
; Android WinUsb driver installation.
;
[Version]
Signature           = "$Windows NT$"
Class               = AndroidUsbDeviceClass
ClassGuid           = {3F966BD9-FA04-4ec5-991C-D326973B5128}
Provider            = %ProviderName%
DriverVer           = 12/06/2010,4.0.0000.00000
CatalogFile.NTx86   = androidwinusb86.cat
CatalogFile.NTamd64 = androidwinusba64.cat

;
; This section seems to be required for WinUsb driver installation.
; If this section is removed the installer will report an error
; "Required section not found in INF file".
;
[ClassInstall32]
Addreg = AndroidWinUsbClassReg

[AndroidWinUsbClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-1

[Manufacturer]
%ProviderName% = Google, NTx86, NTamd64

[Google.NTx86]

%SingleAdbInterface%        = USB_Install, USBVid_18d1&Pid_0005&Rev_0223&MI_01
%SingleAdbInterface%        = USB_Install, USBVid_18d1&Pid_0005&MI_01

; HTC Dream

%SingleAdbInterface%        = USB_Install, USBVID_0BB4&PID_0C01
%CompositeAdbInterface%     = USB_Install, USBVID_0BB4&PID_0C02&MI_01
%SingleBootLoaderInterface% = USB_Install, USBVID_0BB4&PID_0FFF
; HTC Magic
%CompositeAdbInterface%     = USB_Install, USBVID_0BB4&PID_0C03&MI_01
;
;Moto Sholes
%SingleAdbInterface%        = USB_Install, USBVID_22B8&PID_41DB
%CompositeAdbInterface%     = USB_Install, USBVID_22B8&PID_41DB&MI_01
;
;Google NexusOne
%SingleAdbInterface%        = USB_Install, USBVID_18D1&PID_0D02
%CompositeAdbInterface%     = USB_Install, USBVID_18D1&PID_0D02&MI_01
%SingleAdbInterface%        = USB_Install, USBVID_18D1&PID_4E11
%CompositeAdbInterface%     = USB_Install, USBVID_18D1&PID_4E12&MI_01
%CompositeAdbInterface%     = USB_Install, USBVID_18D1&PID_4E22&MI_01

[Google.NTamd64]
; HTC Dream
%SingleAdbInterface%        = USB_Install, USBVID_0BB4&PID_0C01
%CompositeAdbInterface%     = USB_Install, USBVID_0BB4&PID_0C02&MI_01
%SingleBootLoaderInterface% = USB_Install, USBVID_0BB4&PID_0FFF
; HTC Magic
%CompositeAdbInterface%     = USB_Install, USBVID_0BB4&PID_0C03&MI_01
;
;Moto Sholes
%SingleAdbInterface%        = USB_Install, USBVID_22B8&PID_41DB
%CompositeAdbInterface%     = USB_Install, USBVID_22B8&PID_41DB&MI_01
;
;Google NexusOne
%SingleAdbInterface%        = USB_Install, USBVID_18D1&PID_0D02
%CompositeAdbInterface%     = USB_Install, USBVID_18D1&PID_0D02&MI_01
%SingleAdbInterface%        = USB_Install, USBVID_18D1&PID_4E11
%CompositeAdbInterface%     = USB_Install, USBVID_18D1&PID_4E12&MI_01
%CompositeAdbInterface%     = USB_Install, USBVID_18D1&PID_4E22&MI_01

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include     = winusb.inf
AddService  = WinUSB,0x00000002,WinUSB_ServiceInstall

[WinUSB_ServiceInstall]
DisplayName     = %WinUSB_SvcDesc%
ServiceType     = 1
StartType       = 3
ErrorControl    = 1
ServiceBinary   = %12%WinUSB.sys

[USB_Install.Wdf]
KmdfService = WINUSB, WinUSB_Install

[WinUSB_Install]
KmdfLibraryVersion  = 1.9

[USB_Install.HW]
AddReg  = Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{F72FE0D4-CBCB-407d-8814-9ED673D0DD6B}"

[USB_Install.CoInstallers]
AddReg    = CoInstallers_AddReg
CopyFiles = CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll"

[CoInstallers_CopyFiles]
WinUSBCoInstaller2.dll
WdfCoInstaller01009.dll

[DestinationDirs]
CoInstallers_CopyFiles=11

[SourceDisksNames]
1 = %DISK_NAME%,,,i386
2 = %DISK_NAME%,,,amd64

[SourceDisksFiles.x86]
WinUSBCoInstaller2.dll  = 1
WdfCoInstaller01009.dll = 1

[SourceDisksFiles.amd64]
WinUSBCoInstaller2.dll  = 2
WdfCoInstaller01009.dll = 2

[Strings]
ProviderName                = "Google, Inc."
SingleAdbInterface          = "Android ADB Interface"
CompositeAdbInterface       = "Android Composite ADB Interface"
SingleBootLoaderInterface   = "Android Bootloader Interface"
WinUSB_SvcDesc              = "Android USB Driver"
DISK_NAME                   = "Android WinUsb installation disk"
ClassName                   = "Android Phone"

 


這份文件要從最後的[Strings]
這區塊開始看

 

 

2011-09-03 02 42 00.png  

比對了一下,這個驅動

類別名叫Android Phone

驅動有三個,個別叫做

Android ADB Interface
Android Composite ADB Interface
Android Bootloader Interface

驅動有分32位元版和64位元版

紅字的部分就是我們要更動的

 

步驟如下:  (XP測試可用)

  1.  先判斷你的作業系統是  32位元(x86)   還是  64位元(x64)

決定你這行是要加在 [Google.NTx86]   還是 [Google.NTamd64]  區塊

  1.  找到裝置管理員,找到那驚嘆號的Android上面按一下   右鍵  ->  內容

2011-09-03 03 17 14.png   

 

在詳細資料頁籤裡面,找到硬體識別碼  (Hardware Ids)  (這是重點)

2011-09-03 03 17 02.png

把這些文字選起來按 Ctrl +  C   然後在文字編輯器貼上

 

我的有二筆資料,如下

 

USBVid_18d1&Pid_0005&Rev_0223&MI_01
USBVid_18d1&Pid_0005&MI_01

 

 

  1.   依樣畫葫蘆,將文字加上去

 

%SingleAdbInterface%        = USB_Install, USBVid_18d1&Pid_0005&Rev_0223&MI_01
%SingleAdbInterface%        = USB_Install, USBVid_18d1&Pid_0005&MI_01

開頭至於要加哪一個(SingleAdbInterface , CompositeAdbInterface ),都試試看

2011-09-03 03 19 14.png  

 

 

  1.    然後就存檔,重新裝驅動看看,一定會抓到「非常合適」的驅動

因為你手動把他改上去了嘛   XDDD

 

 

 

(Win7 會出現這個大紅色的警示視窗,不用裡他直接按Install this driver software anyway)

2011-09-03 03 20 49.png

就安裝成功了

2011-09-03 03 21 12.png  

 

 

  1.   再來打開cmd  ,用cd 指令切到       <你裝的android SDK的路徑>platform-tools

我的是

C:Program FilesAndroidandroid-sdkplatform-tools

然後鍵入指令

adb kill-server

然後再鍵入指令

adb start-server

重新啟動連接介面的程式

 

神奇的事情就發生了喔
我把驅動裝好了~~~

[Android]解決INSTALL_FAILED_INSUFFICIENT_STORAGE

開發時出現

[2011-08-03 14:50:26 – videoAdsTest] Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

[2011-08-03 14:50:26 – videoAdsTest] Please check logcat output for more details.
[2011-08-03 14:50:27 – videoAdsTest] Launch canceled!

代表說模擬器的程式空間被裝滿了

手動到

menu > 設定 > 管理應用程式  手動移除一些之前測試的程式.

 

或是關掉模擬器,重新啟動模擬器時選擇Wipe User Data

[Android]解決模擬器invalid command-line parameter問題

之前更新Android的SDK之後,打開模擬器出現了以下的問題

2011-08-03 20 57 45.png   

上面寫的是

invalid command-line parameter: Files.
Hint: use ‘@foo’ to launch a virtual device named ‘foo’.
please use -help for more information

意思說是指令列錯誤

 


查了網路上的資料

2011-08-03 21 02 13.png

在Eclipse的  Window >  Preferences  中

2011-08-03 21 04 15.png

 

在左側Android的選項中,重新指定SDK的路徑

 

 

我的設定是

D:Program Files (x86)Androidandroid-sdk

手動修改成

D:Progra~2Androidandroid-sdk

像這樣

2011-08-03 21 05 34.png

 

如果你的SDK是裝在

C:Program FilesAndroidandroid-sdk

那就手動修改成

C:Progra~1Androidandroid-sdk

這樣就OK了

————————————————————————–  

 

因為以前的檔名(資料夾名稱)都要符合DOS的8+3的規定

檔名只能有8個字元加上3個字元的副檔名

 

到了之後才有所謂的長檔名(沒有這種限制)

在DOS裡的長檔名表示就是,打出8個字之後,加上~符號

第一個就1號  第二個就2號……以此類推

原文

Explanation: All nowadays folder names longer than 8 characters have their old DOS equivalent name (8 characters with no spaces).

So:
– “C:Program Files…” is converted into “C:Progra~1…”
– “C:Program Files (x86)…” becomes “C:Progra~2…”

 

至於為何會倒退回之前的表示法

我想這Bug  以後會被修掉吧

 

 

參考資料

http://ideanotion.net/android-sdk-invalid-command-line-parameter-files-error/