æ们ç¥éï¼å¨ä¸ä¸ªAPKæ件ä¸ï¼é¤äºæ代ç æ件ä¹å¤ï¼è¿æå¾å¤èµæºæ件ãè¿äºèµæºæ件æ¯éè¿Androidèµæºæå
å·¥å
·aaptï¼Android Asset Package Toolï¼æå
å°APKæ件éé¢çãå¨æå
ä¹åï¼å¤§é¨åææ¬æ ¼å¼çXMLèµæºæ件è¿ä¼è¢«ç¼è¯æäºè¿å¶æ ¼å¼çXMLèµæºæ件ãå¨æ¬æä¸ï¼æ们就详ç»åæXMLèµæºæ件çç¼è¯åæå
è¿ç¨ï¼ä¸ºåé¢æ·±å
¥äºè§£Androidç³»ç»çèµæºç®¡çæ¡æ¶æä¸åå®çåºç¡ã
å¨åé¢Androidèµæºç®¡çæ¡æ¶ï¼Asset Managerï¼ç®è¦ä»ç»åå¦ä¹ 计åä¸æä¸æå°ï¼åªæé£äºç±»å为res/animatorãres/animãres/colorãres/drawableï¼éBitmapæ件ï¼å³é.pngã.9.pngã.jpgã.gifæ件ï¼ãres/layoutãres/menuãres/valuesåres/xmlçèµæºæ件åä¼ä»ææ¬æ ¼å¼çXMLæ件ç¼è¯æäºè¿å¶æ ¼å¼çXMLæ件ï¼å¦å¾1æ示ï¼
å¾1 Androidåºç¨ç¨åºèµæºçç¼è¯åæå
è¿ç¨
è¿äºXMLèµæºæ件ä¹æè¦ä»ææ¬æ ¼å¼ç¼è¯æäºè¿å¶æ ¼å¼ï¼æ¯å 为ï¼
1. äºè¿å¶æ ¼å¼çXMLæ件å ç¨ç©ºé´æ´å°ãè¿æ¯ç±äºææXMLå
ç´ çæ ç¾ãå±æ§å称ãå±æ§å¼åå
容ææ¶åå°çå符串é½ä¼è¢«ç»ä¸æ¶éå°ä¸ä¸ªå符串èµæºæ± ä¸å»ï¼å¹¶ä¸ä¼å»éãæäºè¿ä¸ªå符串èµæºæ± ï¼åæ¥ä½¿ç¨å符串çå°æ¹å°±ä¼è¢«æ¿æ¢æä¸ä¸ªç´¢å¼å°å符串èµæºæ± çæ´æ°å¼ï¼ä»èå¯ä»¥åå°æ件ç大å°ã
2. äºè¿å¶æ ¼å¼çXMLæ件解æé度æ´å¿«ãè¿æ¯ç±äºäºè¿å¶æ ¼å¼çXMLå
ç´ éé¢ä¸åå
å«æå符串å¼ï¼å æ¤å°±é¿å
äºè¿è¡å符串解æï¼ä»èæé«é度ã
å°XMLèµæºæ件ä»ææ¬æ ¼å¼ç¼è¯æäºè¿å¶æ ¼å¼è§£å³äºç©ºé´å ç¨ä»¥å解ææççé®é¢ï¼ä½æ¯å¯¹äºAndroidèµæºç®¡çæ¡æ¶æ¥è¯´ï¼è¿åªæ¯å®æäºå
¶ä¸çä¸é¨åå·¥ä½ãAndroidèµæºç®¡çæ¡æ¶çå¦å¤ä¸ä¸ªéè¦ä»»å¡å°±æ¯è¦æ ¹æ®èµæºIDæ¥å¿«éæ¾å°å¯¹åºçèµæºã
å¨åé¢Androidèµæºç®¡çæ¡æ¶ï¼Asset Managerï¼ç®è¦ä»ç»åå¦ä¹ 计åä¸æä¸æå°ï¼ä¸ºäºä½¿å¾ä¸ä¸ªåºç¨ç¨åºè½å¤å¨è¿è¡æ¶åæ¶æ¯æä¸åç大å°åå¯åº¦çå±å¹ï¼ä»¥åæ¯æå½é
åï¼å³æ¯æä¸åçå½å®¶å°åºåè¯è¨ï¼Androidåºç¨ç¨åºèµæºçç»ç»æ¹å¼æ18个维度ï¼æ¯ä¸ä¸ªç»´åº¦é½ä»£è¡¨ä¸ä¸ªé
置信æ¯ï¼ä»èå¯ä»¥ä½¿å¾åºç¨ç¨åºè½å¤æ ¹æ®è®¾å¤çå½åé
置信æ¯æ¥æ¾å°æå¹é
çèµæºæ¥å±ç°å¨UIä¸ï¼ä»èæé«ç¨æ·ä½éªã
ç±äºAndroidåºç¨ç¨åºèµæºçç»ç»æ¹å¼å¯ä»¥è¾¾å°18个维度ï¼å æ¤å°±è¦æ±Androidèµæºç®¡çæ¡æ¶è½å¤å¿«éå®ä½æå¹é
设å¤å½åé
置信æ¯çèµæºæ¥å±ç°å¨UIä¸ï¼å¦åçè¯ï¼å°±ä¼å½±åç¨æ·ä½éªã为äºæ¯æAndroidèµæºç®¡çæ¡æ¶å¿«éå®ä½æå¹é
èµæºï¼Androidèµæºæå
å·¥å
·aaptå¨ç¼è¯åæå
èµæºçè¿ç¨ä¸ï¼ä¼æ§è¡ä»¥ä¸ä¸¤ä¸ªé¢å¤çæä½ï¼
1. èµäºæ¯ä¸ä¸ªéassetsèµæºä¸ä¸ªIDå¼ï¼è¿äºIDå¼ä»¥å¸¸éçå½¢å¼å®ä¹å¨ä¸ä¸ªR.javaæ件ä¸ã
2. çæä¸ä¸ªresources.arscæ件ï¼ç¨æ¥æè¿°é£äºå
·æIDå¼çèµæºçé
置信æ¯ï¼å®çå
容就ç¸å½äºæ¯ä¸ä¸ªèµæºç´¢å¼è¡¨ã
æäºèµæºID以åèµæºç´¢å¼è¡¨ä¹åï¼Androidèµæºç®¡çæ¡æ¶å°±å¯ä»¥è¿
éå°æ ¹æ®è®¾å¤å½åé
置信æ¯æ¥å®ä½æå¹é
çèµæºäºãæ¥ä¸æ¥æ们å¨åæAndroidåºç¨ç¨åºèµæºçç¼è¯åæå
è¿ç¨ä¸ï¼å°±ä¸»è¦å
³æ³¨XMLèµæºçç¼è¯è¿ç¨ãèµæºIDæ件R.javaççæè¿ç¨ä»¥åèµæºç´¢å¼è¡¨æ件resources.arscççæè¿ç¨ã
Androidèµæºæå
å·¥å
·å¨ç¼è¯åºç¨ç¨åºèµæºä¹åï¼ä¼å建ä¸ä¸ªèµæºè¡¨ãè¿ä¸ªèµæºè¡¨ä½¿ç¨ä¸ä¸ªResourceTable对象æ¥æè¿°ï¼å½åºç¨ç¨åºèµæºç¼è¯å®æä¹åï¼å®å°±ä¼å
å«ææèµæºçä¿¡æ¯ãæäºè¿ä¸ªèµæºè¡¨ä¹åï¼ Androidèµæºæå
å·¥å
·å°±å¯ä»¥æ ¹æ®å®çå
容æ¥çæèµæºç´¢å¼è¡¨æ件resources.arscäºã
æ¥ä¸æ¥ï¼æ们就éè¿ResourceTableç±»çå®ç°æ¥å
大æ¦äºè§£èµæºè¡¨éé¢é½æäºä»ä¹ä¸è¥¿ï¼å¦å¾2æ示ï¼
å¾2 ResourceTableçå®ç°
ResourceTableç±»ç¨æ¥æ»ä½æè¿°ä¸ä¸ªèµæºè¡¨ï¼å®çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mAssetsPackageï¼è¡¨ç¤ºå½åæ£å¨ç¼è¯çèµæºçå
å称ã
--mPackagesï¼è¡¨ç¤ºå½åæ£å¨ç¼è¯çèµæºå
ï¼æ¯ä¸ä¸ªå
é½ç¨ä¸ä¸ªPackage对象æ¥æè¿°ãä¾å¦ï¼ä¸è¬æ们å¨ç¼è¯åºç¨ç¨åºèµæºæ¶ï¼é½ä¼å¼ç¨ç³»ç»é¢å
ç¼è¯å¥½çèµæºå
ï¼è¿æ ·å½åæ£å¨ç¼è¯çèµæºå
é¤äºç®æ åºç¨ç¨åºèµæºå
ä¹å¤ï¼å°±è¿æé¢å
ç¼è¯å¥½çç³»ç»èµæºå
ã
--mOrderedPackagesï¼åmPackagesä¸æ ·ï¼ä¹æ¯è¡¨ç¤ºå½åæ£å¨ç¼è¯çèµæºå
ï¼ä¸è¿å®ä»¬æ¯ä»¥Package IDä»å°å°å¤§ç顺åºä¿åå¨ä¸ä¸ªVectoréé¢çï¼èmPackagesæ¯ä¸ä¸ªä»¥Package Name为KeyçDefaultKeyedVectorã
--mAssetsï¼è¡¨ç¤ºå½åç¼è¯çèµæºç®å½ï¼å®æåçæ¯ä¸ä¸ªAaptAssets对象ã
Packageç±»ç¨æ¥æè¿°ä¸ä¸ªå
ï¼è¿ä¸ªå
å¯ä»¥æ¯ä¸ä¸ªè¢«å¼ç¨çå
ï¼å³ä¸ä¸ªé¢å
ç¼è¯å¥½çå
ï¼ä¹å¯ä»¥æ¯ä¸ä¸ªæ£å¨ç¼è¯çå
ï¼å®çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mNameï¼è¡¨ç¤ºå
çå称ã
--mTypesï¼è¡¨ç¤ºå
å«çèµæºçç±»åï¼æ¯ä¸ä¸ªç±»åé½ç¨ä¸ä¸ªType对象æ¥æè¿°ãèµæºçç±»åå°±æ¯æanimimatorãanimãcolorãdrawableãlayoutãmenuåvaluesçã
--mOrderedTypesï¼åmTypesä¸æ ·ï¼ä¹æ¯è¡¨ç¤ºå
å«çèµæºçç±»åï¼ä¸è¿å®ä»¬æ¯Type IDä»å°å°å¤§ç顺åºä¿åå¨ä¸ä¸ªVectoréé¢çï¼èmTypesæ¯ä¸ä¸ªä»¥Type Name为KeyçDefaultKeyedVectorã
Typeç±»ç¨æ¥æè¿°ä¸ä¸ªèµæºç±»åï¼å®çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mNameï¼è¡¨ç¤ºèµæºç±»åå称ã
--mConfigsï¼è¡¨ç¤ºå
å«çèµæºé
置项å表ï¼æ¯ä¸ä¸ªé
置项å表é½å
å«äºä¸ç³»åååçèµæºï¼ä½¿ç¨ä¸ä¸ªConfigListæ¥æè¿°ãä¾å¦ï¼å设æmain.xmlåsub.xml两个layoutç±»åçèµæºï¼é£ä¹main.xmlåsub.xmlé½åå«å¯¹åºæä¸ä¸ªConfigListã
--mOrderedConfigsï¼åmConfigsä¸æ ·ï¼ä¹æ¯è¡¨ç¤ºå
å«çèµæºé
置项ï¼ä¸è¿å®ä»¬æ¯ä»¥Entry IDä»å°å°å¤§ç顺åºä¿åå¨ä¸ä¸ªVectoréé¢çï¼èmConfigsæ¯ä»¥Entry Nameæ¥KeyçDefaultKeyedVectorã
--mUniqueConfigsï¼è¡¨ç¤ºå
å«çä¸åèµæºé
置信æ¯ç个æ°ãæ们å¯ä»¥å°mConfigsåmOrderedConfigsçä½æ¯æç
§å称çä¸åæ¥ååèµæºé¡¹ï¼èå°mUniqueConfigsçä½æ¯æç
§é
置信æ¯çä¸åæ¥ååèµæºé¡¹ã
ConfigListç¨æ¥æè¿°ä¸ä¸ªèµæºé
置项å表ï¼å®çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mNameï¼è¡¨ç¤ºèµæºé¡¹å称ï¼ä¹ç§°ä¸ºEntry Nameã
--mEntriesï¼è¡¨ç¤ºå
å«çèµæºé¡¹ï¼æ¯ä¸ä¸ªèµæºé¡¹é½ç¨ä¸ä¸ªEntry对象æ¥æè¿°ï¼å¹¶ä¸ä»¥ä¸ä¸ªå¯¹åºçConfigDescription为Keyä¿åå¨ä¸ä¸ªDefaultKeyedVectorä¸ãä¾å¦ï¼å设æä¸ä¸ªå称为icon.pngçdrawableèµæºï¼æä¸ç§ä¸åçé
ç½®ï¼åå«æ¯ldpiãmdpiåhdpiï¼é£ä¹ä»¥icon.png为å称çèµæºå°±å¯¹åºæä¸ä¸ªé¡¹ã
Entryç±»ç¨æ¥æè¿°ä¸ä¸ªèµæºé¡¹ï¼å®çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mNameï¼è¡¨ç¤ºèµæºå称ã
--mItemï¼è¡¨ç¤ºèµæºæ°æ®ï¼ç¨ä¸ä¸ªItem对象æ¥æè¿°ã
Itemç±»ç¨æ¥æè¿°ä¸ä¸ªèµæºé¡¹æ°æ®ï¼å®çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--valueï¼è¡¨ç¤ºèµæºé¡¹çåå§å¼ï¼å®æ¯ä¸ä¸ªå符串ã
--parsedValueï¼è¡¨ç¤ºèµæºé¡¹åå§å¼ç»è¿è§£æåå¾å°çç»æåçèµæºå¼ï¼ä½¿ç¨ä¸ä¸ªRes_Value对象æ¥æè¿°ãä¾å¦ï¼ä¸ä¸ªæ´æ°ç±»åçèµæºé¡¹çåå§å¼ä¸ºâ12345âï¼ç»è¿è§£æåï¼å°±å¾å°ä¸ä¸ªå¤§å°ä¸º12345çæ´æ°ç±»åçèµæºé¡¹ã
ConfigDescriptionç±»æ¯ä»ResTable_config类继æ¿ä¸æ¥çï¼ç¨æ¥æè¿°ä¸ä¸ªèµæºé
置信æ¯ãResTable_configç±»çæååéimsiãlocaleãscreenTypeãinputãscreenSizeãversionåscreenConfig对åºçå®é
ä¸å°±æ¯å¨åé¢Androidèµæºç®¡çæ¡æ¶ï¼Asset Managerï¼ç®è¦ä»ç»åå¦ä¹ 计åä¸ææå°ç18个èµæºç»´åº¦ã
åé¢æå°ï¼å½åæ£å¨ç¼è¯çèµæºç®å½æ¯ä½¿ç¨ä¸ä¸ªAaptAssets对象æ¥æè¿°çï¼å®çå®ç°å¦å¾3æ示ï¼
å¾3 AaptAssetsç±»çå®ç°
AaptAssetsç±»çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mPackageï¼è¡¨ç¤ºå½åæ£å¨ç¼è¯çèµæºçå
å称ã
--mResï¼è¡¨ç¤ºæå
å«çèµæºç±»åéï¼æ¯ä¸ä¸ªèµæºç±»åé½ä½¿ç¨ä¸ä¸ªResourceTypeSetæ¥æè¿°ï¼å¹¶ä¸ä»¥Type Name为Keyä¿åå¨ä¸ä¸ªKeyedVectorä¸ã
--mHaveIncludedAssetsï¼è¡¨ç¤ºæ¯å¦æå¼ç¨å
ã
--mIncludedAssetsï¼æåçæ¯ä¸ä¸ªAssetManagerï¼ç¨æ¥è§£æå¼ç¨å
ãå¼ç¨å
é½æ¯ä¸äºé¢ç¼è¯å¥½çèµæºå
ï¼å®ä»¬éè¦éè¿AssetManageræ¥è§£æãäºå®ä¸ï¼Androidåºç¨ç¨åºå¨è¿è¡çè¿ç¨ä¸ï¼ä¹æ¯éè¿AssetManageræ¥è§£æèµæºçã
--mOverlayï¼è¡¨ç¤ºå½åæ£å¨ç¼è¯çèµæºçéå å
ãéå å
æ¯ä»ä¹æ¦å¿µå¢ï¼å设æ们æ£å¨ç¼è¯çæ¯Package-1ï¼è¿æ¶åæ们å¯ä»¥è®¾ç½®å¦å¤ä¸ä¸ªPackage-2ï¼ç¨æ¥åè¯aaptï¼å¦æPackage-2å®ä¹æåPackage-1ä¸æ ·çèµæºï¼é£ä¹å°±ç¨å®ä¹å¨Package-2çèµæºæ¥æ¿æ¢æå®ä¹å¨Package-1çèµæºãéè¿è¿ç§Overlayæºå¶ï¼æ们就å¯ä»¥å¯¹èµæºè¿è¡å®å¶ï¼èåä¸å¤±ä¸è¬æ§ã
ResourceTypeSetç±»å®é
ä¸æè¿°çæ¯ä¸ä¸ªç±»å为AaptGroupçKeyedVectorï¼å¹¶ä¸è¿ä¸ªKeyedVectoræ¯ä»¥AaptGroup Name为KeyçãAaptGroupç±»æè¿°çæ¯ä¸ç»ååçèµæºï¼ç±»ä¼¼äºåé¢ææè¿°çConfigListï¼å®æä¸ä¸ªéè¦çæååémFilesï¼éé¢ä¿åçå°±æ¯ä¸ç³»åååçèµæºæ件ãæ¯ä¸ä¸ªèµæºæ件é½æ¯ç¨ä¸ä¸ªAaptFile对象æ¥æè¿°çï¼å¹¶ä¸ä»¥ä¸ä¸ªAaptGroupEntry为Keyä¿åå¨ä¸ä¸ªDefaultKeyedVectorä¸ã
AaptFileç±»çéè¦æååéçå«ä¹å¦ä¸æ示ï¼
--mPathï¼è¡¨ç¤ºèµæºæ件路å¾ã
--mGroupEntryï¼è¡¨ç¤ºèµæºæ件对åºçé
置信æ¯ï¼ä½¿ç¨ä¸ä¸ªAaptGroupEntry对象æ¥æè¿°ã
--mResourceTypeï¼è¡¨ç¤ºèµæºç±»åå称ã
--mDataï¼è¡¨ç¤ºèµæºæ件ç¼è¯åå¾å°çäºè¿å¶æ°æ®ã
--mDataSizeï¼è¡¨ç¤ºèµæºæ件ç¼è¯åå¾å°çäºè¿å¶æ°æ®ç大å°ã
AaptGroupEntryç±»çä½ç¨ç±»ä¼¼åé¢ææè¿°çResTable_configï¼å®çæååémccãmncãlocaleãvendorãscreenLayoutSizeãscreenLayoutLongãorientationãuiModeTypeãuiModeNightãdensityãtounscreenãkeysHiddenãkeyboardãnavHiddenãnavigationãscreenSizeåversion对åºçå®é
ä¸å°±æ¯å¨åé¢Androidèµæºç®¡çæ¡æ¶ï¼Asset Managerï¼ç®è¦ä»ç»åå¦ä¹ 计åä¸ææå°ç18个èµæºç»´åº¦ã
äºè§£äºResourceTableç±»åAaptAssetsç±»çå®ç°ä¹åï¼æ们就å¯ä»¥å¼å§åæAndroidèµæºæå
å·¥å
·çæ§è¡è¿ç¨äºï¼å¦å¾4æ示ï¼
å¾4 Androidèµæºæå
å·¥å
·çæ§è¡è¿ç¨
å设æ们å½åè¦ç¼è¯çåºç¨ç¨åºèµæºç®å½ç»æå¦ä¸æ示ï¼
[plain] view plaincopyå¨CODEä¸æ¥ç代ç çæ´¾çå°æç代ç ç
project
--AndroidManifest.xml
--res
--drawable-ldpi
--icon.png
--drawable-mdpi
--icon.png
--drawable-hdpi
--icon.png
--layout
--main.xml
--sub.xml
--values
--strings.xml
æ¥ä¸æ¥ï¼æ们就æç
§å¾4æ示çæ¥éª¤æ¥åæä¸è¿°åºç¨ç¨åºèµæºçç¼è¯åæå
è¿ç¨ã
ä¸. 解æAndroidManifest.xml
解æAndroidManifest.xmlæ¯ä¸ºäºè·å¾è¦ç¼è¯èµæºçåºç¨ç¨åºçå
å称ãæ们ç¥éï¼å¨AndroidManifest.xmlæ件ä¸ï¼manifestæ ç¾çpackageå±æ§çå¼æè¿°çå°±æ¯åºç¨ç¨åºçå
å称ãæäºè¿ä¸ªå
å称ä¹åï¼å°±å¯ä»¥å建èµæºè¡¨äºï¼å³å建ä¸ä¸ªResourceTable对象ã
äº. æ·»å 被å¼ç¨èµæºå
Androidç³»ç»å®ä¹äºä¸å¥éç¨èµæºï¼è¿äºèµæºå¯ä»¥è¢«åºç¨ç¨åºå¼ç¨ãä¾å¦ï¼æ们å¨XMLå¸å±æ件ä¸æå®ä¸ä¸ªLinearLayoutçandroid:orientationå±æ§çå¼ä¸ºâverticalâæ¶ï¼è¿ä¸ªâverticalâå®é
ä¸å°±æ¯å¨ç³»ç»èµæºå
éé¢å®ä¹çä¸ä¸ªå¼ã
å¨Androidæºä»£ç å·¥ç¨ç¯å¢ä¸ï¼Androidç³»ç»æä¾çèµæºç»è¿ç¼è¯åï¼å°±ä½äºout/target/common/obj/APPS/framework-res_intermediates/package-export.apkæ件ä¸ï¼å æ¤ï¼å¨Androidæºä»£ç å·¥ç¨ç¯å¢ä¸ç¼è¯çåºç¨ç¨åºèµæºï¼é½ä¼å¼ç¨å°è¿ä¸ªpackage-export.apkã
ä»ä¸é¢çåæå°±å¯ä»¥çåºï¼æ们å¨ç¼è¯ä¸ä¸ªAndroidåºç¨ç¨åºçèµæºçæ¶åï¼è³å°ä¼æ¶åå°ä¸¤ä¸ªå
ï¼å
¶ä¸ä¸ä¸ªè¢«å¼ç¨çç³»ç»èµæºå
ï¼å¦å¤ä¸ä¸ªå°±æ¯å½åæ£å¨ç¼è¯çåºç¨ç¨åºèµæºå
ãæ¯ä¸ä¸ªå
é½å¯ä»¥å®ä¹èªå·±çèµæºï¼åæ¶å®ä¹å¯ä»¥å¼ç¨å
¶å®å
çèµæºãé£ä¹ï¼ä¸ä¸ªå
æ¯éè¿ä»ä¹æ¹å¼æ¥å¼ç¨å
¶å®å
çèµæºçå¢ï¼è¿å°±æ¯æ们çæçèµæºIDäºãèµæºIDæ¯ä¸ä¸ª4åèçæ 符å·æ´æ°ï¼å
¶ä¸ï¼æé«åè表示Package IDï¼æ¬¡é«åè表示Type IDï¼æä½ä¸¤åè表示Entry IDã
Package IDç¸å½äºæ¯ä¸ä¸ªå½å空é´ï¼éå®èµæºçæ¥æºãAndroidç³»ç»å½åå®ä¹äºä¸¤ä¸ªèµæºå½ä»¤ç©ºé´ï¼å
¶ä¸ä¸ä¸ªç³»ç»èµæºå½ä»¤ç©ºé´ï¼å®çPackage IDçäº0x01ï¼å¦å¤ä¸ä¸ªæ¯åºç¨ç¨åºèµæºå½ä»¤ç©ºé´ï¼å®çPackage IDçäº0x7fãææä½äº[0x01, 0x7f]ä¹é´çPackage IDé½æ¯åæ³çï¼èå¨è¿ä¸ªèå´ä¹å¤çé½æ¯éæ³çPackage IDãåé¢æå°çç³»ç»èµæºå
package-export.apkçPackage IDå°±çäº0x01ï¼èæ们å¨åºç¨ç¨åºä¸å®ä¹çèµæºçPackage IDçå¼é½çäº0x7fï¼è¿ä¸ç¹å¯ä»¥éè¿çæçR.javaæ件æ¥éªè¯ã
Type IDæ¯æèµæºçç±»åIDãèµæºçç±»åæanimatorãanimãcolorãdrawableãlayoutãmenuãrawãstringåxmlççè¥å¹²ç§ï¼æ¯ä¸ç§é½ä¼è¢«èµäºä¸ä¸ªIDã
Entry IDæ¯ææ¯ä¸ä¸ªèµæºå¨å
¶æå±çèµæºç±»åä¸æåºç°ç次åºã注æï¼ä¸åç±»åçèµæºçEntry IDæå¯è½æ¯ç¸åçï¼ä½æ¯ç±äºå®ä»¬çç±»åä¸åï¼æ们ä»ç¶å¯ä»¥éè¿å
¶èµæºIDæ¥åºå«å¼æ¥ã
å
³äºèµæºIDçæ´å¤æè¿°ï¼ä»¥åèµæºçå¼ç¨å
³ç³»ï¼å¯ä»¥åèframeworks/base/libs/utilsç®å½ä¸çREADMEæ件ã
ä¸. æ¶éèµæºæ件
å¨ç¼è¯åºç¨ç¨åºèµæºä¹åï¼Androidèµæºæå
å·¥å
·aaptä¼å建ä¸ä¸ªAaptAssets对象ï¼ç¨æ¥æ¶éå½åéè¦ç¼è¯çèµæºæ件ãè¿äºéè¦ç¼è¯çèµæºæ件就ä¿åå¨AaptAssetsç±»çæååémResä¸ï¼å¦ä¸æ示ï¼
[cpp] view plaincopyå¨CODEä¸æ¥ç代ç çæ´¾çå°æç代ç ç
class AaptAssets : public AaptDir
{
......
private:
......
KeyedVector<String8, sp<ResourceTypeSet> >* mRes;
};
AaptAssetsç±»å®ä¹å¨æ件frameworks/base/tools/aapt/AaptAssets.hä¸ã
AaptAssetsç±»çæååémResæ¯ä¸ä¸ªç±»å为ResourceTypeSetçKeyedVectorï¼è¿ä¸ªKeyedVectorçKeyå°±æ¯èµæºçç±»åå称ãç±æ¤å°±å¯ç¥ï¼æ¶éå°èµæºæ件æ¯æç
§ç±»åæ¥ä¿åçãä¾å¦ï¼å¯¹äºæ们å¨è¿ç¯æç« ä¸è¦ç¨å°çä¾åï¼ä¸å
±æä¸ç§ç±»åçèµæºï¼åå«æ¯drawableãlayoutåvaluesï¼äºæ¯ï¼å°±å¯¹åºæä¸ä¸ªResourceTypeSetã
ä»åé¢çå¾3å¯ä»¥çåºï¼ResourceTypeSetç±»æ¬èº«æè¿°çä¹æ¯ä¸ä¸ªKeyedVectorï¼ä¸è¿å®éé¢ä¿åçæ¯ä¸ç³»åæçç¸åæ件åçAaptGroupãä¾å¦ï¼å¯¹äºæ们å¨è¿ç¯æç« ä¸è¦ç¨å°çä¾åï¼
1. ç±»å为drawableçResourceTypeSetåªæä¸ä¸ªAaptGroupï¼å®çå称为icon.pngãè¿ä¸ªAaptGroupå
å«äºä¸ä¸ªæ件ï¼åå«æ¯res/drawable-ldpi/icon.pngãres/drawable-mdpi/icon.pngåres/drawable-hdpi/icon.pngãæ¯ä¸ä¸ªæ件é½ç¨ä¸ä¸ªAaptFileæ¥æè¿°ï¼å¹¶ä¸é½å¯¹åºæä¸ä¸ªAaptGroupEntryãæ¯ä¸ä¸ªAaptGroupEntryæè¿°çé½æ¯ä¸åçèµæºé
置信æ¯ï¼å³å®ä»¬ææè¿°çå±å¹å¯åº¦åå«æ¯ldpiãmdpiåhdpiã
2. ç±»å为layoutçResourceTypeSetæ两个AaptGroupï¼å®ä»¬çå称åå«ä¸ºmain.xmlåsub.xmlãè¿ä¸¤ä¸ªAaptGroupé½æ¯åªå
å«äºä¸ä¸ªAaptFileï¼åå«æ¯res/layout/main.xmlåres/layout/sub.xmlãè¿ä¸¤ä¸ªAaptFileåæ ·æ¯åå«å¯¹åºæä¸ä¸ªAaptGroupEntryï¼ä¸è¿è¿ä¸¤ä¸ªAaptGroupEntryæè¿°çèµæºé
置信æ¯é½æ¯å±äºdefaultçã
3. ç±»å为valuesçResourceTypeSetåªæä¸ä¸ªAaptGroupï¼å®çå称为strings.xmlãè¿ä¸ªAaptGroupåªå
å«äºä¸ä¸ªAaptFileï¼å³res/values/strings.xmlãè¿ä¸ªAaptFileä¹å¯¹åºæä¸ä¸ªAaptGroupEntryï¼è¿ä¸ªAaptGroupEntryæè¿°çèµæºé
置信æ¯ä¹æ¯å±äºdefaultçã
å. å°æ¶éå°çèµæºå¢å å°èµæºè¡¨
åé¢æ¶éå°çèµæºåªæ¯ä¿åå¨ä¸ä¸ªAaptAssets对象ä¸ï¼è¿ä¸æ¥éè¦å°è¿äºèµæºåæ¶å¢å å°ä¸ä¸ªèµæºè¡¨ä¸å»ï¼å³å¢å å°åé¢æå建çä¸ä¸ªResourceTable对象ä¸å»ï¼å 为æåæ们éè¦æ ¹æ®è¿ä¸ªResourceTableæ¥çæèµæºç´¢å¼è¡¨ï¼å³çæresources.arscæ件ã
注æï¼è¿ä¸æ¥æ¶éå°èµæºè¡¨çèµæºæ¯ä¸å
æ¬valuesç±»åçèµæºçãç±»å为valuesçèµæºæ¯è¾ç¹æ®ï¼å®ä»¬è¦ç»è¿ç¼è¯ä¹åï¼æä¼æ·»å å°èµæºè¡¨ä¸å»ãè¿ä¸ªè¿ç¨æ们åé¢åæè¿°ã
ä»åé¢çå¾2å¯ä»¥çåºï¼å¨ResourceTableç±»ä¸ï¼æ¯ä¸ä¸ªèµæºé½æ¯åå«ç¨ä¸ä¸ªEntry对象æ¥æè¿°çï¼è¿äºEntryåå«æç
§PacakgeãTypeåConfigListæ¥åç±»ä¿åãä¾å¦ï¼å¯¹äºæ们å¨è¿ç¯æç« ä¸è¦ç¨å°çä¾åï¼å设å®çå
å为âshy.luo.activityâï¼é£ä¹å¨ResourceTableç±»çæååémPackagesåmOrderedPackagesä¸ï¼å°±ä¼åå«ä¿åæä¸ä¸ªå称为âshy.luo.activityâçPackageï¼å¦ä¸æ示ï¼
[cpp] view plaincopyå¨CODEä¸æ¥ç代ç çæ´¾çå°æç代ç ç
class ResourceTable : public ResTable::Accessor
{
......
private:
......
DefaultKeyedVector<String16, sp<Package> > mPackages;
Vector<sp<Package> > mOrderedPackages;
......
};
ResourceTableç±»å®ä¹å¨æ件frameworks/base/tools/aapt/ResourceTable.hä¸ã
å¨è¿ä¸ªå称为âshy.luo.activityâçPackageä¸ï¼åå«å
å«ædrawableålayout两ç§ç±»åçèµæºï¼æ¯ä¸ç§ç±»å使ç¨ä¸ä¸ªType对象æ¥æè¿°ï¼å
¶ä¸ï¼
1. ç±»å为drawableçTypeå
å«æä¸ä¸ªConfigListãè¿ä¸ªConfigListçå称为icon.pngï¼å
å«æä¸ä¸ªEntryï¼åå«ä¸ºres/drawable-ldip/icon.pngãres/drawable-mdip/icon.pngåres/drawable-hdip/icon.pngãæ¯ä¸ä¸ªEntryé½å¯¹åºæä¸ä¸ªConfigDescriptionï¼ç¨æ¥æè¿°ä¸åçèµæºé
置信æ¯ï¼å³åå«ç¨æ¥æè¿°ldpiãmdpiåhdpiä¸ç§ä¸åçå±å¹å¯åº¦ã
2. ç±»å为layoutçTypeå
å«æ两个ConfigListãè¿ä¸¤ä¸ªConfigListçå称åå«ä¸ºmain.xmlåsub.xmlãå称为main.xmlçConfigListå
å«æä¸ä¸ªEntryï¼å³res/layout/main.xmlãå称为sub.xmlçConfigListå
å«æä¸ä¸ªEntryï¼å³res/layout/sub/xmlã
ä¸è¿°å¾å°çäºä¸ªEntryåå«å¯¹åºæäºä¸ªItemï¼å®ä»¬ç对åºå
³ç³»ä»¥åå
容å¦ä¸å¾5æ示ï¼
å¾5 æ¶éå°çdrawableålayoutèµæºé¡¹å表
äº. ç¼è¯valuesç±»èµæº
ç±»å为valuesçèµæºæè¿°çé½æ¯ä¸äºç®åçå¼ï¼å¦æ°ç»ãé¢è²ã尺寸ãå符串åæ ·å¼å¼çï¼è¿äºèµæºæ¯å¨ç¼è¯çè¿ç¨ä¸è¿è¡æ¶éçãæ¥ä¸æ¥ï¼æ们就以å符串çç¼è¯è¿ç¨æ¥è¿è¡è¯´æã
å¨è¿ç¯æç« ä¸è¦ç¨å°çä¾åä¸ï¼å
å«æä¸ä¸ªstrings.xmlçæ件ï¼å®çå
容å¦ä¸æ示ï¼
[html] view plaincopyå¨CODEä¸æ¥ç代ç çæ´¾çå°æç代ç ç
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Activity</string>
<string name="sub_activity">Sub Activity</string>
<string name="start_in_process">Start sub-activity in process</string>
<string name="start_in_new_process">Start sub-activity in new process</string>
<string name="finish">Finish activity</string>
</resources>
è¿ä¸ªæ件ç»è¿ç¼è¯ä¹åï¼èµæºè¡¨å°±å¤äºä¸ä¸ªå称为stringçTypeï¼è¿ä¸ªTypeæäºä¸ªConfigListãè¿äºä¸ªConfigListçå称åå«ä¸ºâapp_nameâãâsub_activityâãâstart_in_processâãâstart_in_new_processâåâfinishâï¼æ¯ä¸ä¸ªConfigListååå«å«æä¸ä¸ªEntryã
ä¸è¿°å¾å°çäºä¸ªEntryåå«å¯¹åºæäºä¸ªItemï¼å®ä»¬ç对åºå
³ç³»ä»¥åå
容å¦å¾6æ示ï¼
å¾6 æ¶éå°çstringèµæºé¡¹å表
å
. ç»Bagèµæºåé
ID
ç±»å为valuesçèµæºé¤äºæ¯stringä¹å¤ï¼è¿æå
¶å®å¾å¤ç±»åçèµæºï¼å
¶ä¸æä¸äºæ¯è¾ç¹æ®ï¼å¦bagãstyleãpluralsåarrayç±»çèµæºãè¿äºèµæºä¼ç»èªå·±å®ä¹ä¸äºä¸ç¨çå¼ï¼è¿äºå¸¦æä¸ç¨å¼çèµæºå°±ç»ç§°ä¸ºBagèµæºãä¾å¦ï¼Androidç³»ç»æä¾çandroid:orientationå±æ§çåå¼èå´ä¸ºï½âverticalâãâhorizontalâï½ï¼å°±ç¸å½äºæ¯å®ä¹äºverticalåhorizontal两个Bagã
å¨ç»§ç»ç¼è¯å
¶å®évaluesçèµæºä¹åï¼æ们éè¦ç»ä¹åæ¶éå°çBagèµæºåé
èµæºIDï¼å 为å®ä»¬å¯è½ä¼è¢«å
¶å®évaluesç±»èµæºå¼ç¨å°ãå设å¨res/valuesç®å½ä¸ï¼æä¸ä¸ªattrs.xmlæ件ï¼å®çå
容å¦ä¸æ示ï¼
[html] view plaincopyå¨CODEä¸æ¥ç代ç çæ´¾çå°æç代ç ç
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="custom_orientation">
<enum name="custom_vertical" value="0" />
<enum name="custom_horizontal" value="1" />
</attr>
</resources>
è¿ä¸ªæ件å®ä¹äºä¸ä¸ªå称为âcustom_orientationâçå±æ§ï¼å®æ¯ä¸ä¸ªæ举类åçå±æ§ï¼å¯ä»¥åå¼ä¸ºâcustom_verticalâæè
âcustom_horizontalâãAndroidèµæºæå
å·¥å
·aaptå¨ç¼è¯è¿ä¸ªæ件çæ¶åï¼å°±ä¼çæ以ä¸ä¸ä¸ªEntryï¼å¦å¾7æ示ï¼
å¾7 æ¶éå°çBagèµæºé¡¹å表
ä¸è¿°ä¸ä¸ªEntryå为Bagèµæºé¡¹ï¼å
¶ä¸ï¼custom_verticalï¼idç±»åèµæºï¼åcustom_horizontalï¼ idç±»åèµæºï¼æ¯custom_orientationï¼attrç±»åèµæºï¼ç两个bagï¼æ们å¯ä»¥å°custom_verticalåcustom_horizontalçææ¯custom_orientationç两个å
æ°æ®ï¼ç¨æ¥æè¿°custom_orientationçåå¼èå´ãå®é
ä¸ï¼custom_orientationè¿æä¸ä¸ªå
é¨å
æ°æ®ï¼ç¨æ¥æè¿°å®çç±»åãè¿ä¸ªå
é¨å
æ°æ®ä¹æ¯éè¿ä¸ä¸ªbagæ¥è¡¨ç¤ºçï¼è¿ä¸ªbagçå称åå¼åå«ä¸ºâ^typeâåTYPE_ENUMï¼ç¨æ¥è¡¨ç¤ºå®æè¿°çæ¯ä¸ä¸ªæ举类åçå±æ§ã注æï¼ææå称以â^âå¼å¤´çbagé½æ¯è¡¨ç¤ºä¸ä¸ªå
é¨å
æ°æ®ã
温馨提示:答案为网友推荐,仅供参考