天天看點

Android實戰技巧之五十:App的系統簽名

這件事困擾我們多時了。

我們一直想用非源碼編譯的方式解決此事,按如下步驟。

這種擷取系統簽名的方法如下:

1、apk中需要使用android:sharedUserId=”android.uid.system” 這個屬性。在Manifest檔案修改,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.linc.systemsigndemo"
    android:sharedUserId="android.uid.system"
    >
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
           

2、将app做無簽名編譯(Android Studio)

用指令行編譯

Windows: gradlew.bat assembleRelease 
Mac/linux: ./gradlew assembleRelease
           

3、對apk進行系統簽名。

1)、在android源碼下build/target/product/security找到兩個密鑰檔案platform.x509.pem platform.pk8

2)、out/host/linux-x86/framework/signapk.jar找到系統封裝工具signapk.jar

3)、使用指令java -jar signapk.jar platform.x509.pem platform.pk8 test.apk testnew.apk

安裝時遇到的問題:

Installation failed with message INSTALL_FAILED_SHARED_USER_INCOMPATIBLE.
           

困擾了大概半個月,最後覺得還是源碼編譯吧。

1、将Android Studio項目複制到源碼packages/apps/路徑下

2、從其他項目如Settings複制Android.mk,做一些修改如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 android-support-v13 jsr305

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := \
        $(call all-java-files-under, app/src/main/java/) \

LOCAL_PACKAGE_NAME := SystemSignDemo
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_AAPT_FLAGS += -c zz_ZZ

include $(BUILD_PACKAGE)

# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
           

3、将res檔案夾和Manifest檔案拷到與Android.mk同級目錄(項目的根目錄)

4、編譯

5、成功後會生成兩個檔案: .odex和.apk檔案

前者是優化過的可執行程式。此時可以把apk檔案當成普通的應用安裝即可。

6、如何證明已經獲得系統簽名

很簡單,使用SystemClock.setCurrentTimeMillis修改系統時間,将其修改為12:15,如下:

mTvInfo.setText("time: "+SystemClock.currentThreadTimeMillis());

        Calendar c = Calendar.getInstance();

        c.set(Calendar.HOUR_OF_DAY, );
        c.set(Calendar.MINUTE, );
        long when = c.getTimeInMillis();

        if (when /  < Integer.MAX_VALUE) {
            Log.d(TAG,"set time");
            mTvInfo.append("\nset time when: "+when);
            SystemClock.setCurrentTimeMillis(when);
        }
           

Good Luck!