解決系統App編譯簽名問題

如下內容爲感慨和吐槽,沒興趣的能夠直奔分割線下方。       java

進新公司以後發現,由於以前作App開發,如今進了作ROM的公司,雖然也是作APP開發,可是不少東西就變了,以前在windows環境下就能搞定的事情,如今雙系統,由於公司配的unbuntu系統的電腦配置略高,因此花了一段時間才摸熟ubuntu,以後由於是開發系統app,簽名等方式都是按照android.mk。來進行編譯打包簽名的。老實說,剛進來,一個系統編譯4個小時,我就懵逼了。性子急表示整不肯意等,關鍵是編譯失敗,心裏是奔潰的有木有。linux

以後由於作的任務多半和編譯無關,我也有幸不去管這塊了,過了一段時間以後,由於在寫app方面確實比組內其餘成員有經驗些。因此擔起了一個核心app的重構工做,過程是曲折的,一個卡片展現形式的插件,用有本身的project,附着在桌面展現,經過桌面插件方式load出來項目中的主view展現在桌面,由於是寄生在桌面程序上,因此沒有application,心裏是奔潰的。作過app開發的都知道,沒有application,一些三方庫是無法使用的,意味着得回到原始社會,重操urlconection手寫全部代碼,處理各類邏輯,重複造輪子有木有。android

好幾經波折我發現雖然是插件app,在project中直接用這個view去getApplication拿不到,可是經過在attachwindow時獲取父容器的Context,能夠獲取到applicationcontext.而後各種三方庫能夠愉快的用起來有木有。可是這裏有坑需謹慎,後來咱們這個插件app準備接入事件統計,我把Umeng接進來發現初始化用桌面的context初始化用的是桌面的manifest信息。心裏是奔潰的,有木有。versionName,versioncode不是本身項目的,淚奔。。。。。。好在公司內部有一個組仿照umeng寫了一個統計sdk,而後讓他們給定製化,在初始化以前手動傳入versionName,versionCode.ubuntu

~~~~~~~~~~~~~~~~~~~~~~~~~~~~吐槽分割線~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~windows

而後就要談到今天這個問題了,其實這個問題,一直困擾着我,爲了儘快出包,簡化打包流程,開始我想到手寫mk文件,而後看了一成天android的makefile的知識,準備去編譯系統,把項目裏的aar等依賴處理簡化,由於你們都知道mk方式打包對aar的支持不是很好,然而系統依舊是編譯不過,太浪費時間,因此我看了下項目裏的mk文件指定的簽名是app

LOCAL_CERTIFICATE := platform

而後我思考着既然咱們是把項目放到系統源碼下只是爲了讓編譯的時候幫咱們簽下名,爲何咱們不能直接用這個簽名去給未簽名的包去簽名,而後去系統項目根目錄下的/build/target/product/security目錄下找到了platform簽名文件platform.x509.pem和platform.pk8,去網上找了下系統簽名的方式原來是用signApk.jar去進行簽名的。而後我屁顛屁顛的區sdk的platform-tools和tools下面找這個Jar包了,發現鬼影都沒有,好吧,打開方式不對,是否是在系統工程目錄下,而後百度了下果真是這麼回事。ide

而後我找了組內其餘已經編譯過系統的人copy過來了這個項目根目錄下的out/hostlinux-x86/framework/signApk.jar進行了簽名。工具

java -jar signApk.jar   platform.x509.pem platform.pk8 unsigned-source.apk  sligned-result.apkgradle

這樣sligned-result.apk就打包好了,直接能夠放到系統原來的目錄下,而後你也能夠徹底依照開發app的流程不用去考慮麻煩,費時的mk編譯了。ui

諮詢了組內系統開發的老司機,原來系統中也是存在預編譯apk直接用mk,進行配置apk就行。

看了下系統目錄下已經存在的預編譯apk的makefile文件語法

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
 
# Module name should match apk name to be installed
LOCAL_MODULE := CleanTask                //模塊名
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk   //這個值能夠本身指定,就也能夠直接用模塊名。
//只須要改動這2個地方,就能實現預編譯apk了,須要注意的是若是項目有依賴其餘module,那麼你能夠先用as把依賴的項目所有
//用provided加入到project的中,這樣就不會把依賴打包進項目,而後在mk文件裏代表他們的依賴,雖然我沒試過,可是理論上
//應該能夠

LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PREBUILT)

感受很爽有木有,不再用管那些複雜的系統編譯了。

可是用了幾天以後,感受仍是太麻煩了,由於之前打包都是直接用as 點擊run就出來包,區別只是as的release包使用keystore來進行配置的,而後我想雖然是系統簽名,可是又了pem,pk8能夠簽名,那應該能夠用工具把pem,pk8轉換成platform.keystore.說幹就幹,果真我在網上找到了:

keytool-importkeypair 

-k platform.keystore

-p android 

-pk8 platform.pk8 

-cert platform.x509.pem 

-alias platform

生成keystore以後,把文件放到app工程的根目錄下,對應在as的build.gradle下配置:

signingConfigs {
        releaseConfig {
            keyAlias 'platform'
            keyPassword 'android'
            storeFile file('platform.keystore')
            storePassword 'android'
        }
    }

而後就能夠能夠徹底按照app的方式開發了.只能說過程好曲折。。。。

相關文章
相關標籤/搜索