解決JPinyin在APK被加密后不能正常使用的問題

之前寫過一篇博客漢字轉(zhuǎn)拼音開源工具包Jpinyin介紹燕偶,介紹過JPinyin的使用侵浸,因?yàn)樗鼘?shí)在是太方便了旺韭,在項(xiàng)目一直用它,但是最近在做項(xiàng)目的時候掏觉,發(fā)現(xiàn)使用了JPinyin的工程区端,在IDE中編譯的APK能正常使用,但是APK被加密后再安裝履腋,使用JPinyin時會報漢字轉(zhuǎn)拼音時讀取數(shù)據(jù)失敗珊燎,下面記錄一下問題的解決過程。

加密后導(dǎo)致使用Jpinyin報異常的原因肯定是加密導(dǎo)致了Jpinyin中的某些內(nèi)容變化導(dǎo)致(解密后數(shù)據(jù)不再是未加密前的數(shù)據(jù)了)遵湖,為了跟蹤這個問題悔政,下載JPinyin的源碼發(fā)現(xiàn)漢字轉(zhuǎn)拼音是使用了三個“數(shù)據(jù)庫”文件,分別是:

  • chinese.db

  • mutil_pinyin.db

  • pinyin.db

起初我以為是數(shù)據(jù)被加密了延旧,加密APK的時候相當(dāng)于這些數(shù)據(jù)被再次加密導(dǎo)致了JPinyin不能正常使用谋国,但是JPinyin中的代碼是這樣讀取這三個文件的,讀取文件的類為:PinyinResource.java

package com.github.stuxuhai.jpinyin;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 資源文件加載類
 *
 * @author stuxuhai (dczxxuhai@gmail.com)
 * @version 1.0
 */
public class PinyinResource {

    private static Properties getResource(String resourceName) {
        InputStream is = PinyinResource.class.getResourceAsStream(resourceName);
        Properties props = new Properties();
        try {
            props.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return props;
    }


    protected static Properties getPinyinTable() {
        String resourceName = "/data/pinyin.db";
        return getResource(resourceName);
    }


    protected static Properties getMutilPintinTable() {
        String resourceName = "/data/mutil_pinyin.db";
        return getResource(resourceName);
    }


    protected static Properties getChineseTable() {
        String resourceName = "/data/chinese.db";
        return getResource(resourceName);
    }
}

文件讀取過程中根本沒有數(shù)據(jù)庫的解密過程迁沫,代碼中將db文件當(dāng)做“.properties”文件處理了芦瘾,遂在網(wǎng)上查詢".properties"為何物:JAVA操作properties文件,直接把這三個db文件的后綴改成".properties"集畅,然后打開的內(nèi)容是這樣的:

chinese.properties
chinese.properties

于是可以確定這三個文件的原始格式為".properties"近弟,只是作者將其改為".db"文件了,于是嘗試通過將db格式改為.properties,來解決加密APK導(dǎo)致JPinyin不能正常使用的問題挺智,修改后的代碼是這樣的(這個工程是在Android項(xiàng)目中被使用的祷愉,所以我將這三個.properties文件放在了assets文件夾下):

/**
 * 資源文件加載類
 *
 * @author stuxuhai (dczxxuhai@gmail.com)
 * @version 1.0
 */
public class PinyinResource {
    private static Properties getResource(Context context, String resourceName) {
        InputStream is = null;
        Properties props = null;
        try {
            is = context.getAssets().open(resourceName);
            props = new Properties();
            props.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(null != is){
                    is.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return props;
    }

    protected static Properties getPinyinTable(Context context) {
        String resourceName = "pinyin.properties";
        return getResource(context, resourceName);
    }

    protected static Properties getMutilPintinTable(Context context) {
        String resourceName = "mutil_pinyin.properties";
        return getResource(context, resourceName);
    }

    protected static Properties getChineseTable(Context context) {
        String resourceName = "chinese.properties";
        return getResource(context, resourceName);
    }
}

JPinyin的其它幾個類也需要修改,加上context參數(shù)赦颇,修改后重新打包JPinyin.jar二鳄,在IDE中運(yùn)行沒問題,加密后使用也沒有問題媒怯。將properties文件改成db文件導(dǎo)致加密后不能正常使用的問題我還沒有跟蹤到具體原因订讼,但解決這個問題的過程和方法值得記錄一下,遇到這種問題最好的辦法是查看源碼扇苞,大膽猜測并嘗試欺殿,比在不看源碼的情況下去猜測要靠譜得多寄纵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祈餐,隨后出現(xiàn)的幾起案子擂啥,更是在濱河造成了極大的恐慌,老刑警劉巖帆阳,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屋吨,居然都是意外死亡蜒谤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門至扰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳍徽,“玉大人,你說我怎么就攤上這事敢课〗准溃” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵直秆,是天一觀的道長濒募。 經(jīng)常有香客問我,道長圾结,這世上最難降的妖魔是什么瑰剃? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮筝野,結(jié)果婚禮上晌姚,老公的妹妹穿的比我還像新娘。我一直安慰自己歇竟,他們只是感情好挥唠,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焕议,像睡著了一般宝磨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上号坡,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天懊烤,我揣著相機(jī)與錄音,去河邊找鬼宽堆。 笑死腌紧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畜隶。 我是一名探鬼主播壁肋,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼号胚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浸遗?” 一聲冷哼從身側(cè)響起猫胁,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跛锌,沒想到半個月后弃秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡髓帽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年菠赚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郑藏。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡衡查,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出必盖,到底是詐尸還是另有隱情拌牲,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布歌粥,位于F島的核電站塌忽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏阁吝。R本人自食惡果不足惜砚婆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望突勇。 院中可真熱鬧装盯,春花似錦、人聲如沸甲馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽定躏。三九已至账磺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痊远,已是汗流浹背垮抗。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碧聪,地道東北人冒版。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像逞姿,于是被迫代替她去往敵國和親辞嗡。 傳聞我的和親對象是個殘疾皇子捆等,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容