其實 Android 製作 .apk 的 Private Key 是放在 \build\target\product\security 這個目錄下,這裡有好幾組 Key 而其主要的差異如下:

testkey -- a generic key for packages that do not otherwise specify a key.
platform -- a test key for packages that are part of the core platform.
shared -- a test key for things that are shared in the home/contacts process.
media -- a test key for packages that are part of the media/download system.

因此,如果你希望在 Android 建制 Framework 的過程中把你寫的 Application 改成你所指定的 Private Key ,基本上你需要改動的就是 testkey ,這個目錄下還有個 mkkey.sh 來協助你作這樣的工作, mkkey.sh 的內容如下:

if ["$1" == ""]; then
 echo "Create a test certificate key."
 echo "Usage: $0 NAME"
 echo "Will generate NAME.pk8 and NAME.x509.pem"
 echo "  /C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com"
 return
fi

openssl genrsa -3 -out $1.pem 2048

openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 \
    -subj '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -nocrypt

說穿了,就是利用 openssl 來產生新的 Private Key,所以更改的方法很簡單,你可以把 openssl req -new ... 這一行改成你所需要的格式, 接著你只要執行 mkkey.sh 就可以產生新的 Private Key 了! 讚吧!

上一個方法是把 Private Key 跟 Certificate 直接換掉,如果你已經有現成的 Certificate 可以使用,令一個比較簡單的方法是更改 Android.mk 的設定,加一行:


LOCAL_CERTIFICATE := vendor/example/certs/app

如此,在 build system 的時候就可以使用指定的 Certificate 了。

可是這樣還離完美差一點點,你也許想把這個 Private Key 放到 Java 的 .keystore 檔案去,關於這個問題可以參考這篇文章http://www.agentbob.info/agentbob/79-AB.html,裡面有很詳細的說明。

OK, 到這裡為止一切就算是大功告成囉!