apk系統(tǒng)簽名記錄

1支示、系統(tǒng)簽名

當(dāng)項(xiàng)目開發(fā)需要使用系統(tǒng)級別權(quán)限或frame層某些api時刊橘,普通應(yīng)用是無法使用的,需要在AndroidManifest中配置sharedUserId:


20180628193621701.png
android:sharedUserId="android.uid.system"

配置完 android:sharedUserId="android.uid.system" 之后颂鸿,此時的 app 是無法成功安裝到設(shè)備的促绵,控制臺會提示 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,這是因?yàn)榇藭r app 已經(jīng)被識別為系統(tǒng)應(yīng)用嘴纺,但是其簽名信息卻不是系統(tǒng)簽名败晴,于是無法通過系統(tǒng)檢驗(yàn)。進(jìn)行系統(tǒng)簽名需要準(zhǔn)備好如下幾個文件:

  • platform.pk8:簽名證書
  • platform.x509.pem:簽名證書
  • signapk.jar:簽名工具
    注:我們是與Android系統(tǒng)廠商合作開發(fā)栽渴,以上文件為硬件廠商提供尖坤。

1.1 單獨(dú)簽名

將簽名文件和簽名工具、簽名apk放置同一目錄闲擦,定位到該目錄慢味,使用如下命令:

java -jar signapk.jar platform.x509.pem platform.pk8 unsign.apk signed.apk

signed.apk就是生成已經(jīng)擁有系統(tǒng)簽名的apk

1.2 生成平臺platform.keystore文件

除了直接使用signapk.jar簽名外,還可以將簽名文件生成keystore文件墅冷,然后給apk進(jìn)行簽名纯路。

1.2.1將pkcs8格式的私鑰轉(zhuǎn)化成pkcs12格式

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt

1.2.2 將x509.pem公鑰轉(zhuǎn)換成pkcs12格式

openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name test

這里會輸入密碼和確認(rèn)密碼,密碼是android

1.2.3 生成platform.keystore

keytool -importkeystore -deststorepass android -destkeypass android -destkeystore test.jks -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias test

1.2.4 引入AndroidStudio

配置項(xiàng)目builde.gradle寞忿,在android區(qū)域下(與defaultConfig同級)添加配置:

signingConfigs {
    release {
        storeFile file("../test")
        storePassword 'android'
        keyAlias 'test'
        keyPassword 'android'
    }
    debug {
        storeFile file("../test")
        storePassword 'android'
        keyAlias 'test'
        keyPassword 'android'
    }
}

2 代碼安裝

使用場景:版本更新

2.1 安裝方法

/*系統(tǒng)簽名apk 使用pm安裝*/
fun systemInstall(apkFile: File, finish: (() -> Unit)? = null) {
    try {
        if (apkFile.exists()) {
            val cmd = "pm install -r " + apkFile.absolutePath
            val runtime = Runtime.getRuntime()
            val process = runtime.exec(cmd)
            val errorInput = process.errorStream
            val inputStream = process.inputStream
            var bufferedReader = BufferedReader(InputStreamReader(inputStream))
            var error = ""
            var result = ""
            var line = ""
            while (bufferedReader.readLine().also { line = it } != null) {
                result += line
            }
            bufferedReader = BufferedReader(InputStreamReader(errorInput))
            while (bufferedReader.readLine().also { line = it } != null) {
                error += line
            }
            Log.e("===>", result)
            if (result == "Success") {
                Log.e("===>", "install: Success")
            } else {
                Log.e("===>", "install: error$error")
            }
            finish?.invoke()
        } else {
            finish?.invoke()
        }
 
    } catch (e: IOException) {
        e.printStackTrace()
        finish?.invoke()
 
    } catch (e: Exception) {
        finish?.invoke()
    }
}

2.2 注冊廣播驰唬,安裝成功后自啟

manifest文件下

 <!-- 注冊廣播 安裝包更新調(diào)起自啟 -->
<receiver
    android:name=".receiver.UpdateRestartReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
 
        <data android:scheme="package" />
    </intent-filter>
</receiver>

2.3 重啟app


public class UpdateRestartReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
            Uri data = intent.getData();
            if (data != null && context.getPackageName().equals(data.getEncodedSchemeSpecificPart())) {
                // 重新啟動APP
                Intent intentToStart = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
                context.startActivity(intentToStart);
            }
        }
 
 
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子定嗓,更是在濱河造成了極大的恐慌蜕琴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宵溅,死亡現(xiàn)場離奇詭異凌简,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恃逻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門雏搂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寇损,你說我怎么就攤上這事凸郑。” “怎么了矛市?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵芙沥,是天一觀的道長。 經(jīng)常有香客問我浊吏,道長而昨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任找田,我火速辦了婚禮歌憨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墩衙。我一直安慰自己务嫡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布漆改。 她就那樣靜靜地躺著心铃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挫剑。 梳的紋絲不亂的頭發(fā)上去扣,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音暮顺,去河邊找鬼。 笑死秀存,一個胖子當(dāng)著我的面吹牛捶码,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播或链,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惫恼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了澳盐?” 一聲冷哼從身側(cè)響起祈纯,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤令宿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腕窥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粒没,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年簇爆,在試婚紗的時候發(fā)現(xiàn)自己被綠了癞松。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡入蛆,死狀恐怖响蓉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哨毁,我是刑警寧澤枫甲,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站扼褪,受9級特大地震影響想幻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迎捺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一举畸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凳枝,春花似錦抄沮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹋订,卻和暖如春率挣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背露戒。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工椒功, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人智什。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓动漾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荠锭。 傳聞我的和親對象是個殘疾皇子旱眯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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