為ZTE U970加上TTS輸出設置


ZTE U970加上TTS輸出設置

                                                                                                      shanshengsheng@gmail.com  (歡迎g+,gtalk)

由於種種不可以表述的原因,國行的手機基本都是閹割了TTS輸出設置,可能這個設置沒多少人在意,所以網上對這個功能也沒多少人關注,發了很多帖子無解后決定自力更生,呵呵。

這個設置有什么用呢?具體對我來說,我是一個鐵桿谷粉,郵件要用Gmail,聊天要用Gtalk,那導航當然要Google Maps了。這里就要用到TTS設置了,不然導航的時候沒有語音導航。其他比如閱讀器的讀書功能,很多也是調用系統的TTS

廢話了那么多,下面言歸正傳,講述修改過程。

第一步,當然是要反編譯Settings.apk了,因為TTS設置屬於設置里的一部分。用到的工具:apktool

具體命令如下:

apktool if Framework-res.apk 

apktool d Settings.apk

反編譯后得到Settings文件夾。由於官方包都是odex過的,所以apk里面是沒有代碼的,只有資源文件,所以我們先找到資源文件res目錄,TTS選項是在語言和輸入法這個子選項中,所以我們找res/xml下面的language_settings.xml,經過和android源碼里的language_settings.xml對比,發現被zte閹掉了tts選項的描述文件,立馬將其拷貝粘貼到對應地方。

代碼太多就不貼了,貼出閹掉的代碼:

<PreferenceCategory android:title="@string/voice_category" android:key="voice_category">

        <ListPreference android:title="@string/recognizer_title" android:key="recognizer" android:dialogTitle="@string/recognizer_title" />

        <PreferenceScreen android:title="@string/recognizer_settings_title" android:key="recognizer_settings" />

        <PreferenceScreen android:title="@string/tts_settings_title" android:key="tts_settings" android:fragment="com.android.settings.tts.TextToSpeechSettings" />

    </PreferenceCategory>

其中有三項,兩位兩項我們不關心,只要有第三項就行了。

保存,編譯回apk

apktool b Settings

Settings/dist目錄里就出現了Settings.apk文件了。不過這個文件不能直接用來替換,因為這個是沒簽名的,聽說也不能直接隨便簽名替換,據說這個是系統文件,需要的是共享簽名,所以這里需要把apk里面生成的resources.arsc和我們剛才修改的language_settings.xml這兩個文件拖回到原來的Settings.apk包里。具體的就是用winrar打開兩個apk包,從新的里面拖到老的里面,不過這里有個地方需要注意到是在彈出的對話框里要選擇存儲,不然這個包就壞了,我第一次就沒看到這個。

下面就是拷回手機,修改權限xx-x--x--。重啟手機,點設置-語言與輸入法,就出現了,如圖:


出現了“文字轉語音(TTS)輸出”,非常激動,點擊居然SettingsFC了。

這里就要用到androidlogcat了,好像可以直接adb logcat,不過我不是黑客,還是喜歡用圖形界面,打開sdk里面的ddms.bat,用這個分析點擊之后為啥fc了,主要內容如下:

07-26 16:44:53.030: E/AndroidRuntime(3487): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.SubSettings}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.tts.TextToSpeechSettings: make sure class name exists, is public, and has an empty constructor that is public

上次用到moto的手機,他們只是簡單的把xml文件刪了隱藏了,沒想到zte更狠,居然把類也刪了,看來不愧是中國本土企業啊,執行力度很強,這里順便吐槽一下,以后大家不要買zte手機,服務差,rom不穩定,閹割東西倒是很在行。以前的moto一個月不重啟都行,這個zte一個星期就要重啟。又扯遠了,我汗。下面第二步就是補上被閹割的類。

第二步:添加缺少的TTS相關類。用到smail

模擬器中是有這個選項的,所以模擬器中肯定是有tts相關類的,所以從模擬器中提取Settings.odex,和手機中提取Settings.odex,分別進行反編譯。如下命令:

java -jar baksmali-1.3.3.jar -a 15 -x Settings.odex

out文件夾中會生成對應的各個smali文件,簡單對比就會發現少了tts,和nfc兩個文件夾,不過nfc這個手機沒硬件支持,我們只回復tts,把模擬器中的tts文件夾拷貝到手機反編譯的out文件夾中,並執行如下命令:

 java -jar smali-1.3.3.jar out/ -o classes.dex

將修改后的文件生成classes.dex

目前我還沒發現怎么直接生成odex,所以只有曲線救國了,把生成的classes.dex用上一步的辦法拷貝到Settings.apk里面,並把這個apkdexopt-wrapper拷貝到手機的system/bin目錄下,並賦予權限XXX X-X X-X。這些權限具體需要不需要我也沒仔細研究,反正網上怎么說我就怎么抄來得了。然后手機開啟調試,在pc端執行:

adb shell

su

cd system/bin

dexopt-wrapper Settings.apk Settings.odex

         這樣就生成了含有TTS相關類的odex文件,將其拷貝到system/app並賦予權限,並重啟。又一次小激動啊,信心滿滿,不過又fc了,崩潰,呵呵。

         logcat信息如下:

         07-26 19:48:10.890: E/AndroidRuntime(3067):     at com.android.settings.tts.TextToSpeechSettings.onCreate(TextToSpeechSettings.java:131)

找到源碼查看第131行,代碼如下:

     mPlayExample.setOnPreferenceClickListener(this);

         結合整個onCreate的代碼:

123    @Override
124    public void onCreate(Bundle savedInstanceState) {
125        super.onCreate(savedInstanceState);
126        addPreferencesFromResource(R.xml.tts_settings);
127
128        getActivity().setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
129
130        mPlayExample = findPreference(KEY_PLAY_EXAMPLE);
131        mPlayExample.setOnPreferenceClickListener(this);
132
133        mEnginePreferenceCategory = (PreferenceCategory) findPreference(
134                KEY_ENGINE_PREFERENCE_SECTION);
135        mDefaultRatePref = (ListPreference) findPreference(KEY_DEFAULT_RATE);
136
137        mTts = new TextToSpeech(getActivity().getApplicationContext(), mInitListener);
138        mEnginesHelper = new TtsEngines(getActivity().getApplicationContext());
139
140        initSettings();
141    }

         懷疑是沒找到R.xml.tts_settings文件或者AndroidManifest.xml缺了啥東東,所以把反編譯的資源文件對比,眼都看花了,也沒發現有啥區別。

         黔驢技窮了,能想到的辦法都想了,還是不行。各大論壇求助除了幫頂的,沒人理。今天終於gfan論壇有人回復了,給了我動力繼續研究。期間還gtalk了安智網做rom的高手G大,搞droidboxkun yang。昨天突擊看了smali的語法,還看到miui論壇里寫的關於移植到帖子(具體的會在下面參考列表中寫),看到資源翻譯成對應十六進整數的帖子,茅塞頓開。

         第三步,調整資源編號

         看源碼是第126行引用了R.xml.tts_settings,找到smali文件,搜索.line 126,代碼如下:

.line 126

    const v0, 0x7f05002d

 

invoke-virtual {p0, v0}, Lcom/android/settings/tts/TextToSpeechSettings;->addPreferencesFromResource(I)V

 

public.xml里面tts_settings對應的數字是:

<public type="xml" name="tts_settings" id="0x7f050036" />

 

smali中的0x7f05002d替換為0x7f050036

還有其他很多需要替換,這個就需要耐心慢慢替換了,期間搞到手機上有fc了,繼續跟進logcat找還有啥資源沒有對應對。最好,終於大功告成,貼圖慶賀一下。


為了這個界面忙了好多天啊。

鳴謝:

         android apk反編譯和odex轉dex:

       http://www.cnblogs.com/wanqieddy/archive/2012/03/01/2375424.html

    Apk生成odex的方法,自己成功的經驗 - 董芝全:

       http://www.cnblogs.com/dongzhiquan/archive/2011/08/18/2143924.html

MIUI ROM適配之旅: 

http://www.miui.com/thread-402302-1-1.html

安卓越科技deng9song

http://bbs.gfan.com/android-4709421-1-1.html

G大:https://plus.google.com/u/0/111829074553801826123/about

Kun Yanghttps://plus.google.com/u/0/109637943394058791672/about

其中aapt是從一個論壇中有人無法打包后一個人傳的,已失去出處,感謝。

感謝各位頂貼的人。

        並要感謝ZTE給我機會學習Android

提供我基於B04版本修改的文件,替換system/app里面的文件並修改權限為xx-x--x-- 

/Files/sss/settings.rar 


免責聲明!

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



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