轉自 http://blog.csdn.net/chen_chun_guang/archive/2011/04/15/6325833.aspx

網上Android數字簽名大多是與Android APK相關,而介紹Android係統簽名的方法卻不多。正巧前段時間幫別人做CTS 認證,需要用到給Android係統簽名。

為什麼需要給Android係統簽個名才能進行CTS認證呢?原來我們通過make -j4編譯出來的system.img使用的是test key,這種類型的key隻適用於開發階段,而且這種秘鑰是公開的,誰都可以使用。當發布一款android產品,就需要另外給整個係統簽個名,防止被別 人盜用。這種係統就是release版本的Android係統。

下麵就詳細介紹下整個過程。

1、生成加密key文件

要對Android係統進行簽名,需要生成四種類型的key文件。

a)releasekey (testkey)

b)media

c)shared

d)platform

我們就拿releasekey為例簡單介紹下生成過程。

1)進入/android_src/development/tools目錄。

/development/tools$ ls
apkcheck etc1tool hosttestlib jdwpspy makedict mkstubs

axl findunused idegen line_endings make_key monkeyrunner zoneinfo

2)使用make_key工具生成簽名文件

development/tools$ sh make_key releasekey /C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=YourName/emailAddress=YourE-mailAddress

Enter password for releasekey (blank for none; password will be visible): mypassword <------- 設置你的密碼
creating platform.pk8 with password [mypassword]
Generating RSA private key, 2048 bit long modulus
e is 3 (0x3)

這裏要順便介紹下make_key的參數。第一個參數是要生成key的名字,第二個參數是關於你公司的信息。

key的名字很好理解,就是前麵提到的4中類型的key,公司信息的參數比較多,它們的含義如下:

C ---> Country Name (2 letter code)
ST ---> State or Province Name (full name)
L ---> Locality Name (eg, city)
O ---> Organization Name (eg, company)
OU ---> Organizational Unit Name (eg, section)
CN ---> Common Name (eg, your name or your server’s hostname)
emailAddress ---> Contact email address

這樣就生成了一組releasekey,另外3種類型的key的生成方法也基本一樣。

生成後的結果如下:

/development/tools$ ls
makedict media.pk8 mkstubs platform.pk8 releasekey.pk8 shared.pk8
make_key media.x509.pem platform.x509.pem releasekey.x509.pem shared.x509.pem

*.pk8是生成的私鑰,而*.x509.pem是公鑰,生成時兩者是成對出現的.

另外,如果出現 openssl : relocation error penssl : symbol ...嚐試用 sudo 執行命令, 問題解決了!


2 、 把pk8和x509.pem文件拷貝到vendor/Modul/security/product_modul目錄

/android_src/vendor/Modul/security/product_modul$ cp ../../../../development/tools/*.pk8 ./
/android_src/vendor/Modul/security/product_modul$ cp ../../../../development/tools/*.pem ./

這一部雖然不是必須的,但最好還是這樣做下,由於牽涉到項目的原因,產品和產品型號就用Modul和product_modul代替了.

3 、 回到根目錄android_src

/android_src/vendor/Modul/security/product_modul$ cd ../../../../

大家看後肯定覺得這一步很多餘,根本沒有必要單獨提出來,但後來證明把這步提下還是很有必要的,因為第5步的操作必須要在根目錄下執行,不然會出錯.在這一點上我是吃了不少苦頭.

4 、編譯係統

/android_src$ make -j4 PRODUCT-product_modul-user dist

這個怎麼跟平時的編譯不一樣,後麵多了兩個參數PRODUCT-product_modul-user 和 dist. 編譯完成之後回在/android_src/dist/目錄內生成個product_modul-target_files開頭的zip文件.這就是我們 需要進行簽名的文件係統.

5 、開始簽名

android_src$ ./build/tools/releasetools/sign_target_files_apks -d vendor/Modul/security/product_modul/ out/dist/product_modul-target_files.zip out/dist/signed_target_files.zip
ERROR: no key specified for:
CalendarWidget.apk
Contacts_yellowpage.apk
SnsAppMain.apk
fbandroid-1.5.0.apk
AnalogClockWidget.apk
MessageWidget.apk
NewsWidget.apk

上麵的意思是使用sign_target_files_apks工具采用vendor/Modul/security/product_modul /下的key對product_modul-target_files.zip文件進行簽名,並把簽名結果放在out/dist /signed_target_files.zip裏.

從上麵的簽名結果看,簽名並沒有成功,原因是由於有些apk程序已經簽過名了或者找不到對應的key. 這也難不倒我們,我們可以通過設置過濾,不對上麵的程序進行簽名.方法如下:

通過參數"-e <apkname>=" 來過濾這些程序.

android_src$ ./build/tools/releasetools/sign_target_files_apks -d vendor/Modul/security/product_modul/ -e CalendarWidget.apk= -e Contacts_yellowpage.apk= -e SnsAppMain.apk= -e fbandroid-1.5.0.apk= -e AnalogClockWidget.apk= -e MessageWidget.apk= -e NewsWidget.apk= out/dist/product_modul-target_files.zip out/dist/signed_target_files.zip
Enter password for vendor/Modul/security/product_modul//media key> <----- imput the password
Enter password for vendor/Modul/security/product_modul//platform key> <----- imput the password
Enter password for vendor/Modul/security/product_modul//releasekey key> <----- imput the password
Enter password for vendor/Modul/security/product_modul//shared key> <----- imput the password
rewriting RECOVERY/RAMDISK/default.prop:
replace: ro.build.tags=test-keys
with: ro.build.tags=release-keys

NOT signing: CalendarWidget.apk
NOT signing: Contacts_yellowpage.apk
signing: Mms.apk
signing: SoundRecorder.apk
signing: AccountAndSyncSettings.apk
signing: Camera.apk
rewriting SYSTEM/build.prop:
replace: ro.build.tags=test-keys
with: ro.build.tags=release-keys
replace: ro.build.description= test-keys
with: ro.build.description= release-keys
replace: ro.build.fingerprint=...........................
with: ro.build.fingerprint=.............................
signing: framework-res.apk
done.

這樣就完成了android係統的簽名工作.

6 、生成image文件

android_src$ ./build/tools/releasetools/img_from_target_files out/dist/signed-target-files.zip out/dist/signed-img.zip
creating boot.img...
creating recovery.img...
creating system.img...
creating userdata.img...
cleaning up...
done.

使用img_from_target_files工具生成signed-img.zip文件.signed-img.zip文件包含了boot.img,userdate.img,system.img文件等.

7 、通過fastboot下載signed-img.zip文件

fastboot update signed-img.zip

通過fastboot就可以把簽了名的係統文件下載到手機上了。

介紹android APK簽名的方法有很多,下麵這篇文章寫的挺不錯,有需要的可以參考一下.

http://yangguangfu.iteye.com/blog/723182

更多相关文章

  1. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入S
  2. Android(安卓)NDK 入门
  3. 关于android的中文文档
  4. Android:使用命令行工具adb、mksdcard等
  5. Android(安卓)JNI打印c\c++日志信息
  6. Android编译系统分析
  7. RenderScript 让你的Android计算速度快的飞上天!
  8. Android(安卓)NDK 入门
  9. Android(安卓)Studio 3.0 新特性

随机推荐

  1. Android——XML解析
  2. Android中的常见FC及解决方式整理
  3. android 分享 api
  4. Android消息机制 Handler
  5. android 实现由下至上弹出并位于屏幕底部
  6. Android(安卓)GPS状态改变与监听
  7. android 设置静态wifi地址
  8. Android(安卓)软键盘小知识点
  9. android短信发送器源代码
  10. android 客户端 smtp 协议发送数据