Ëæ×Å΢µêÒµÎñµÄ·¢Õ¹£¬App
²»¿É±ÜÃâµØÒ²Óöµ½ÁË 65535 µÄ´ó¿Ó¡£³ý´ËÖ®Í⣬ҵÎñÄ£¿éÔö¶à¡¢´úÂëÁ¿Ôö´óËù´øÀ´µÄÎÊÌâÒ²Öð½¥ÏÔÏÖ³öÀ´¡£Ä£¿éñîºÏ¶È¸ß¡¢Ð×÷¿ª·¢À§ÄÑ¡¢±àÒëʱ¼ä¹ý³¤µÈÎÊÌâÑÏÖØÓ°ÏìÁË¿ª·¢½ø³Ì¡£ÔÚÔ¤ÑÐÁ˶àÖÖ·½°¸ÒԺ󣬲å¼þ»¯ËƺõÊǽâ¾öÕâЩÎÊÌâ±È½ÏºÃµÄÒ»¸ö·½Ïò¡£ËäȻҵ½çÒѾÓкܶàÓÅÐãµÄ¿ªÔ´²å¼þ»¯¿ò¼Ü£¬µ«Ô¤Ñкó·¢ÏÖÔÚʹÓÃÉ϶ÔÎÒÃÇ»áÓÐÒ»¶¨µÄ¾ÖÏÞ¡£ÒªÃ´×·ÇóµÍÇÖÈëÐÔ¶ø
Hook ´óÁ¿ÏµÍ³µ×²ã´úÂëÎȶ¨ÐÔ²»¸Ò±£Ö¤£¬ÒªÃ´ÓкܸߵÄÇÖÈëÐÔ²»Âú×ã΢µê¶¨ÖÆ»¯µÄÐèÇó¡£¼¼ÊõÒªºÜºÃµØ·þÎñÒµÎñ£¬ÎÒÃÇÏëÔÚÎȶ¨ÐԺ͵ÍÇÖÈëÐÔÉÏѰÕÒÒ»¸öƽºâ¡¡

ͼ 1 ΢µê²å¼þ»¯¸ÄÔìÁ÷³Ì
΢µê´Ó 2016 Äê 4 Ô·ݿªÊ¼½øÐвå¼þ»¯¸ÄÔ죬µ½Äêµ×»ù±¾Íê³É£¨¿É¼ûͼ 1 ·Ïߣ©¡£ÏÖÔÚÒ»¹²ÓÐ 29
¸öÄ£¿éÒÔ²å¼þ»¯µÄ·½Ê½ÔËÐУ¬ÆäÖмÈÓÐÈçÉÌÆ·¡¢¶©µ¥µÈµÄÒµÎñÄ£¿é£¬Ò²ÓÐÏñ Network¡¢Cache µÈµÄ»ù´¡Ä£¿é£¬Ä¿Ç°ÎÒÃǵIJå¼þ»¯¿ò¼ÜÒѾºÜºÃµØÖ§³ÖÁË΢µê¶à
Feature ¿ìËÙ²¢Ðеü´ú¿ª·¢¡£Íê³ÉÒ»¸ö²å¼þ»¯¿ò¼ÜµÄ Demo ²¢²»ÊǶàÄѵÄʶù£¬È»¶øÒª¿ª·¢Ò»¿îÍêÉÆµÄ²å¼þ»¯¿ò¼ÜÈ´·ÇÒ×Ê£¬
±¾Æª½«ÎÒÃDzå¼þ»¯¸ÄÔì¹ý³ÌÖÐËùÉæ¼°µ½µÄһЩ¼¼ÊõµãÒÔ¼°Ë¼¿¼Óë´ó¼Ò·ÖÏíһϡ£
²å¼þ»¯¼¼ÊõÔÀí
²å¼þ»¯¼¼ÊõÌýÆðÀ´¸ßÉîĪ²â£¬Êµ¼ÊÒª½â¾öµÄ¾ÍÊÇÈý¸öÎÊÌ⣺
´úÂë¼ÓÔØ£»
×ÊÔ´¼ÓÔØ£»
×é¼þµÄÉúÃüÖÜÆÚ¡£
´úÂë¼ÓÔØ
ÎÒÃÇÖªµÀ Android ºÍ Java Ò»Ñù¶¼ÊÇͨ¹ý ClassLoader À´Íê³ÉÀà¼ÓÔØ£¬¶ÔÓÚ¶¯Ì¬¼ÓÔØÔÚʵÏÖ·½Ê½ÉÏÓÐÁ½ÖÖ»úÖÆ¿É¹©Ñ¡Ôñ£¬·Ö±ðΪµ¥
ClassLoader »úÖÆºÍ¶à ClassLoader »úÖÆ£º
µ¥ ClassLoader »úÖÆ£ºÀàËÆÓÚ Google MulDex »úÖÆ£¬ÔËÐÐʱ°ÑËùÓеÄÀàºÏ²¢ÔÚÒ»¿é£¬²å¼þºÍËÞÖ÷³ÌÐòµÄÀàÈ«²¿¶¼Í¨¹ýËÞÖ÷µÄ
ClassLoader ¼ÓÔØ£¬ËäÈ»´úÂë¼òµ¥£¬µ«Êdz°ôÐԺܲ
¶à ClassLoader »úÖÆ£ºÃ¿¸ö²å¼þ¶¼ÓÐÒ»¸ö×Ô¼ºµÄ ClassLoader£¬ÀàµÄ¸ôÀëÐÔ»áºÜºÃ¡£ÁíÍâ¶à
ClassLoader »¹ÓÐÒ»¸öÓŵ㣬Ϊ²å¼þµÄÈȲ¿ÊðÌṩÁË¿ÉÄÜ¡£Èç¹û²å¼þÐèÒªÉý¼¶£¬Ö±½Óн¨Ò»¸ö ClassLoader
¼ÓÔØÐµIJå¼þ£¬È»ºóÌæ»»µôÔÀ´µÄ¼´¿É¡£
ÎÒÃǵĿò¼ÜÔÚÀà¼ÓÔØÊ±²ÉÓõÄÊǶà ClassLoader »úÖÆ£¬¿ò¼Ü»á´´½¨Á½ÖÖ ClassLoader¡£µÚÒ»ÖÖÊÇ
BundleClassLoader£¬Ã¿¸ö Bundle °²×°Ê±»á·ÖÅäÒ»¸ö BundleClassLoader£¬¸ºÔð¸Ã
Bundle µÄÀà¼ÓÔØ£»µÚ¶þÖÖÊÇ DispatchClassLoader£¬Ëü±¾Éí²¢²»¸ºÔðÕæÕýÀàµÄ¼ÓÔØ£¬Ö»ÊÇÀà¼ÓÔØµÄÒ»¸ö·Ö·¢Æ÷£¬DispatchClassLoader
³ÖÓÐËÞÖ÷¼°ËùÓÐ Bundle µÄ ClassLoader¡£¹ØÏµÈçͼ 2 Ëùʾ¡£

ͼ2 ²å¼þ»¯¿ò¼Ü ClassLoader
¹ØÏµ
ÈçºÎ Hook ϵͳµÄ ClassLoader£¿
Ó¦ÓÃÀàͨ¹ý PathClassLoader À´¼ÓÔØ£¬PathClassLoader ´æÔÚÓÚ LoadedApk
ÖУ¬ÄÇô£¬ÈçºÎ²ÅÄÜÌæ»» LoadedApk ÖÐ PathClassLoader ΪÎÒÃÇµÄ DispatchClassLoader
ÄØ£¿´ó¼ÒÊ×ÏÈÏëµ½µÄÊÇ·´É䣬µ«¿Éϧ LoadedApk ¶ÔÏóÊÇ @Hide µÄ£¬ÒªÌæ»»Ê×ÏÈÐèÒª Hook
Äõ½ LoadedApk ¶ÔÏó£¬È»ºóÔÙͨ¹ý·´ÉäÌæ»» PathClassLoader¡£Òª·´ÉäÁ½´ÎÌØ±ðÊÇ
LoadedApk ¶ÔÏóµÄ»ñÈ¡ÎÒÃÇÈÏΪ·çÏպܸߣ¬ÄÇ»¹ÓÐûÓÐÆäËû·½°¸¿ÉÒÔ×¢Èë DispatchClassLoader£¿ÎÒÃÇÖªµÀ
Java Àà¼ÓÔØÊ±»ùÓÚË«Ç×ίÅÉ»úÖÆ£¬¼ÓÔØÓ¦ÓÃÀàµÄ PathClassLoader Æä Parent
Ϊ BootClassLoader£¬ÄÜ·ñÔÚµ÷ÓÃÁ´ÉϲåÈë DispatchClassLoader ÄØ£¿

ͼ3 ClassLoader ίÅɹØÏµ
´Óͼ 3 ´ó¼Ò¿ÉÒÔ¿´µ½£¬ÎÒÃÇͨ¹ýÐÞ¸ÄÀàµÄ¸¸×Ó¹ØÏµ³É¹¦µØ°Ñ DispatchClassLoader ²åÈëµ½ÀàµÄ¼ÓÔØÁ´ÖС£ÐÞ¸ÄÀàµÄ¸¸×Ó¹ØÏµÖ±½Óͨ¹ý·´ÉäÐÞ¸Ä
ClassLoader µÄ parent ×ֶμ´¿É£¬ËäȻҲÊÇ·´ÉäµÄ˽ÓÐÊôÐÔ£¬µ«Ïà¶ÔÓÚ Hook LoadedApk
Õâ¸ö˽ÓжÔÏóµÄ˽Óз½·¨£¬·çÏÕÒªÏà¶ÔСºÜ¶à¡£
Àà¼ÓÔØÓÅ»¯
²»¹ÜÊÇ DispatchClassLoader »ò BundleClassLoader£¬¶ÔÓÚÒÀÀµ
Bundle ÀàµÄ²éÕÒ¶¼ÊÇͨ¹ý±éÀúÀ´ÊµÏֵġ£ÓÉÓÚÎÒÃÇ°Ñ Network¡¢Cache µÈ»ù´¡×é¼þÒ²½øÐÐÁ˲å¼þ»¯£¬ËùÒÔ
Bundle ÒÀÀµ»á±È½Ï¶à£¬Õâ¸ö±éÀú¹ý³Ì»áÓÐÒ»¶¨µÄÐÔÄÜËðºÄ¡£ÎÒÃÇÏë¼ÓÔØÀàʱÄÜ·ñ¸ù¾Ý ClassName
¿ìËÙ¶¨Î»µ½¸ÃÀàÊôÓÚÄÄÒ»¸ö Bundle£¿×îÖÕ£¬ÎÒÃDzÉÓõķ½°¸ÊÇ£ºÔÚ±àÒë½×¶Î»áÊÕ¼¯ Bundle Ëù°üº¬µÄ
PackageName ÐÅÏ¢£¬ÔÚ²å¼þ°²×°½×¶Î¹¹ÔìÒ»¸ö PackageName Óë Bundle µÄ¶ÔÓ¦±í£¬ÕâÑù¼ÓÔØ
Class ʱ£¬¸ù¾Ý°üÃû¿É¿ìËÙ¶¨Î»¸Ã Class ÊôÓÚÄÄÒ»¸ö Bundle¡£µ±È»£¬ÓÉÓÚ»ìÏýµÄÔÒò£¬²»Í¬²å¼þµÄ°üÃû¿ÉÄÜÖØ¸´£¬¶Ô´Ë£¬ÎÒÃÇͨ¹ý¹æ·¶À´½øÐб£Ö¤¡£
×ÊÔ´¼ÓÔØ
×ÊÔ´¼ÓÔØ·½°¸¿ÉÑ¡ÔñµÄÓàµØ²»¶à£¬¶¼ÊÇÓà AssetManager µÄ @hide ·½·¨ addAssetPath£¬Ö±½Ó¹¹Ôì²å¼þ
Apk µÄ AssetManager ºÍ Resouce ¶ÔÏó¡£ÐèҪעÒâµÄÊÇ£¬ÎÒÃDzÉÓõÄÊÇ×ÊÔ´ºÏ²¢µÄ·½°¸£¬Í¨¹ý
addAssetsPath ·½·¨Ìí¼Ó×ÊԴʱ£¬ÐèҪͬʱÌí¼Ó²å¼þ³ÌÐòµÄ×ÊÔ´ÎļþºÍËÞÖ÷³ÌÐòµÄ×ÊÔ´£¬¼°ÆäÒÀÀµµÄ×ÊÔ´¡£ÕâÑù¿ÉÒÔ½«
Resource ºÏ²¢µ½Ò»¸ö Context ÖУ¬½â¾ö×ÊÔ´·ÃÎÊʱÐèÒªÇл»ÉÏÏÂÎĵÄÎÊÌâ¡£ÁíÍ⣬Èô²»½øÐÐ×ÊÔ´ºÏ²¢£¬²å¼þÒ²ÎÞ·¨ÒýÈëËÞÖ÷µÄ×ÊÔ´¡£
×ÊÔ´ ID ³åÍ»ÎÊÌâ
ÓÉÓÚÎÒÃÇÔÚ¹¹Ôì AssetManager ʱ£¬»á°ÑËÞÖ÷¡¢²å¼þ¼°ÒÀÀµ²å¼þµÄ×ÊÔ´ºÏ²¢ÔÚÒ»Æð£¬ÄÇôËÞÖ÷×ÊÔ´
ID Óë²å¼þ×ÊÔ´ ID£¬»ò²å¼þ×ÊÔ´ ID Ö®¼ä¶¼ÓпÉÄÜÖØ¸´¡£ÎÒÃÇÖªµÀ×ÊÔ´ ID ÊÇÔÚ±àÒëʱÉú³ÉµÄ£¬ÆäÉú³ÉµÄ¹æÔòÊÇ
0xPPTTNNNN£¬Òª½â¾ö³åÍ»¾ÍÐèÒª¶Ô×ÊÔ´½øÐзֶΣ¬×ÊÔ´·Ö¶Î³£ÓõÄÓÐÁ½ÖÖ·½Ê½£¬·Ö±ðΪ¹Ì¶¨ PP ¶ÎÓë¹Ì¶¨
TT ¶Î¡£µ±Ê±²ÉÓÃÄÄÖÖ×ÊÔ´·Ö¶Î·½°¸¶ÔÓÚÎÒÃÇÀ´ËµÊÇÒ»¸ö±È½Ï¾À½áµÄÑ¡Ôñ£¬¹Ì¶¨ PP ¶ÎÐèÒªÐÞ¸Ä AAPT£¬´ú¼Û±È½Ï´ó£¬¹Ì¶¨
TT ¶ÎÏà¶ÔÀ´ËµÔò½ÏΪ¼òµ¥¡£³õʼÎÒÃDzÉÓõÄÊǹ̶¨ TT ¶Î£¬µ«ºóÀ´Ëæ×Ųå¼þµÄÔö¶à£¬TT ¶ÎÃ÷ÏÔ²»¹»Ó㬺óÀ´»¹ÊDzÉÓÃÐÞ¸Ä
AAPT ¹Ì¶¨ PP ¶Î¡£´ó¼ÒÒªÉϲå¼þ»¯£¬Èç¹û¿ÉÔ¤¼ûºóÐø²å¼þ±È½Ï¶à£¬½¨ÒéÖ±½Ó²ÉÓù̶¨ PP ¶Î·½°¸¡£
³ýÁË ID ³åÍ»ÒÔÍ⣬×ÊÔ´ÃûÒ²ÓпÉÄÜÖØ¸´£¬¶ÔÓÚ×ÊÔ´ÃûÖØ¸´µÄÎÊÌâÎÒÃÇͨ¹ý¹æ·¶À´Ô¼Êø£¬ËùÓеIJå¼þ¶¼·ÖÅäÓй̶¨µÄ×ÊԴǰ׺¡£
ÈçºÎ Hook ×ÊÔ´¼ÓÔØ¹ý³Ì
android ͨ¹ý Resources ¶ÔÏóÍê³É×ÊÔ´¼ÓÔØ£¬Òª Hook ×ÊÔ´¼ÓÔØ¹ý³Ì£¬Ê×ÏÈÏëµ½µÄÊÇÄÜ·ñÌæ»»ÏµÍ³µÄ
Resources ¶ÔÏóΪÎÒÃÇ×Ô¶¨ÒåµÄ Resources ¶ÔÏó¡£
µ÷Ñз¢ÏÖÒªÌæ»» Resouce ¶ÔÏó£¬ÖÁÉÙÒªÌæ»»Á½¸öϵͳ¶ÔÏó LoadedApk¡¢ContextImpl
µÄ mResources ÊôÐÔ£¬²¢ÇÒ LoadedApk ¼° ContextImpl ¶¼ÊÇ˽ÓжÔÏ󣬻ùÓÚ¼æÈÝÐԵĿ¼ÂÇÎÒÃÇ·ÅÆúÁËÕâÖÖ·½°¸£¬¶ø²ÉÓÃÖ±½Ó¸´Ð´
Activity ¼° Application µÄ»ñÈ¡×ÊÔ´µÄÏà¹Ø·½·¨À´Íê³É Bundle ×ÊÔ´µÄ¼ÓÔØ¡£ÓÉÓڸ÷½°¸¶Ô
Application ¼° Activity ¶¼ÓÐÇÖÈ룬ËùÒÔ»á´øÀ´Ò»¶¨µÄ½ÓÈë³É±¾¡£Îª´Ë£¬ÎÒÃÇÔÚ±àÒë¹ý³ÌÖÐÓôúÂë×¢ÈëµÄ·½Ê½Íê³É×ÊÔ´¼ÓÔØµÄ
Hook£¬×ÊÔ´µÄ¼ÓÔØ²Ù×÷¶Ô²å¼þ¿ª·¢À´ËµÊÇÍêȫ͸Ã÷µÄ¡£
×¢£º×ÊÔ´ Hook Éæ¼°µ½¸´Ð´µÄ·½·¨ÓÐÈçϼ¸¸ö£º
Override
public Resources getResources() {
}
Override
public AssetManager getAssets() {
}
Override
public Resources.Theme getTheme() {
}
@Override
public Object getSystemService(String name)
{
if (Context.LAYOUT_INFLATER_SERVICE.equals(name))
{
// ×Ô¶¨Òå LayoutInflater
}
return super.getSystemService(name);
} |
×é¼þÉúÃüÖÜÆÚ
¶ÔÓÚ Android À´Ëµ£¬²¢²»ÊÇÀà¼ÓÔØ½øÀ´¾Í¿ÉÒÔʹÓÃÁË£¬ºÜ¶à×é¼þ¶¼ÊÇÓÐÉúÃüµÄ¡£Òò´Ë¶ÔÓÚÕâЩÓÐѪÓÐÈâµÄÀ࣬±ØÐë¸øËüÃÇ×¢ÈëÉúÃüÁ¦£¬Ò²¾ÍÊÇËùνµÄ×é¼þÉúÃüÖÜÆÚ¹ÜÀí¡£ºÜ¶à²å¼þ»¯¿ò¼Ü£¬±ÈÈç
DroidPlugin ͨ¹ý´óÁ¿ Hook AMS¡¢PMS µÈÀ´ÊµÏÖ×é¼þµÄÉúÃüÖÜÆÚ£¬´Ó¶øÊµÏÖÎÞÇÖÈëÐÔ¡£µ«¼¼Êõ¿Ï¶¨ÊÇ·þÎñÓÚÒµÎñ£¬ËÄ´ó×é¼þÕæµÄ¶¼ÐèÒª×ö²å¼þ»¯Âð£¿ÔÚÎÞÇÖÈëÐԺͼæÈÝÐÔÉϸÃÈçºÎ¾ñÔñ£¿¶ÔÓÚÕâ¸öÎÊÌâÎÒÃǸø³öµÄ´ð°¸ÊÇÎȶ¨Ñ¹µ¹Ò»ÇС£×ۺϵ±Ç°µÄÒµÎñÐÎ̬£¬ÎÒÃDzå¼þ»¯¿ò¼Ü¶¨Î»Ö»ÊµÏÖ
Activity ¼° BroadCastReceiver ²å¼þ»¯£¬ÎþÉü²¿·Ö¹¦ÄÜÒÔÇóÎȶ¨ÐԿɿء£BroadCastReceiver
²å¼þ»¯Ö»ÊǰѾ²Ì¬¹ã²¥×ªÎª¶¯Ì¬¹ã²¥£¬ÏÂÃæÖØµã·Ö½âһϠActivity ²å¼þ»¯¡£
Activity ²å¼þ»¯
Activity ²å¼þ»¯ÊµÏÖ´óÖÂÓÐÒÔÏÂÁ½ÖÖ·½Ê½£º
Ò»ÖÖÊǾ²Ì¬´úÀí£¬Ð´Ò»¸ö PluginActivity ¼Ì³Ð×Ô Activity »ùÀ࣬°Ñ Activity
»ùÀàÀïÉæ¼°ÉúÃüÖÜÆÚµÄ·½·¨È«¶¼ÖØÐ´Ò»±é£»
ÁíÒ»ÖÖ·½Ê½ÊǶ¯Ì¬Ìæ»»£¬ËÞÖ÷ÖÐԤע²á×® StubActivity£¬Í¨¹ýÔÚϵͳ²»Í¬²ã´Î Hook£¬´Ó¶øÊµÏÖ
StubActivity ºÍ RealActivity Ö®¼äµÄת»»£¬ÒԴﵽ͵Áº»»ÖùµÄÄ¿µÄ¡£
ÓÉÓÚµÚÒ»ÖÖ·½°¸¶Ô²å¼þ¿ª·¢ÇÖÈëÐÔÌ«´ó£¬ÎÒÃDzÉÓõÄÊǵڶþÖÖ·½°¸¡£¼ÈÈ»Èç´Ë£¬ÎÒÃǾÍÐèÒª¶Ôͼ 4 ÖТٺ͢ÚÁ½¸öµã½øÐÐ
Hook¡£

ͼ4 Hook µãѡȡ
¶ÔÓÚ¢ÙHook£ºÒµÄÚÒ»°ãµÄ×ö·¨ÊÇ Hook ActivityThread ÀàÓгÉÔ±±ä mInstrumentation£¬Ëü»á¸ºÔð´´½¨
Activity µÈ²Ù×÷£¬¿ÉÒÔͨ¹ý´Û¸Ä mInstrumentation ΪÎÒÃÇ×Ô¼ºµÄ InstrumentationHook£¬ÔÚÆä
execStartActivity() ·½·¨ÖÐÍê³É RealActivity->StubActivity
µÄת»¯¡£
¶ÔÓÚ¢ÚHook£º²»Í¬µÄ¿ò¼ÜÑ¡ÔñÔÚϵͳ²»Í¬µÄ²ã´ÎÉϽøÐÐ Hook£¬À´Íê³É StubActivity->RealActivity
µÄ»¹Ô¡£

ͼ5 ÏÖÓвå¼þ»¯¿ò¼Ü Hook ²ßÂÔ
´Óͼ 5 ¿ÉÒÔ¿´³öµÚ¶þÖÖ·½°¸²»¹ÜÔÚÄÄÒ»µãÉ쵀 Hook ¶¼»áÉæ¼°µ½ÏµÍ³Ë½ÓжÔÏóµÄ²Ù×÷£¬´Ó¶øÒýÈë²»¿É¿Ø·çÏÕ¡£¶øÎÒÃǵÄÔÔòÊǾ¡Á¿ÉÙµØ
Hook£¬ÈôÊÇÒÔÎþÉüµÍÇÖÈëÐÔΪ´ú¼Û£¬ÓÐûÓÐÒ»ÖÖ¸ü°²È«µÄ·½°¸ÄØ£¿²¢ÇÒÓÉÓÚÖ»¶Ô Activity ½øÐвå¼þ»¯£¬ËùÓÐÆô¶¯
Activity µÄµØ·½¶¼ÊÇͨ¹ý Context µÄ startActivity ·½·¨µ÷Æð£¬ÎÒÃÇÖ»Òª¸´Ð´
Application ¼° Activity µÄ startActivity() ·½·¨£¬ÔÚ startActivity()
·½·¨µ÷ÓÃʱÍê³É RealActivity->StubActivity£¬ÔÚÀà¼ÓÔØÊ±ÊµÏÖ StubActivity->RealActivity
¾Í¿ÉÒÔÁË¡£Í¬Ñù£¬¸´Ð´·½·¨ËùÒýÈëµÄÇÖÈëÐÔÍêÈ«¿ÉÒÔÔÚ±àÒëÆÚͨ¹ý´úÂë×¢ÈëµÄ·½Ê½½â¾öµô¡£
×¢£ºÊµ¼ÊÉÏ£¬ËäÈ» startActivity ÓкܶàÖØÐ´·½·¨£¬µ«ÎÒÃÇÖ»Ð踴дÒÔÏÂÁ½¸ö¾Í¿ÉÒÔÁË£º
@Override
public void startActivityForResult(Intent intent,
int requestCode) {
}
@Override
public void startActivityForResult(Intent intent,
int requestCode, Bundle options) {
} |
ÁíÍ⣬¶ÔÓÚ Activity µÄ LanchMode£¬ÎÒÃÇÊÇͨ¹ýÔÚËÞÖ÷ÖÐÿÖÖ LaunchMode
¶¼Ô¤×¢²áÁ˶à¸ö£¨8 ¸ö£©StubActivity À´ÊµÏÖ¡£ÖµµÃ×¢ÒâµÄÒ»µãÊÇ£¬Èç¹û²å¼þ Activity
Ϊ͸Ã÷Ö÷Ì⣬ÓÉÓÚϵͳÏÞÖÆ²»Äܶ¯Ì¬ÉèÖÃ͸Ã÷Ö÷Ì⣬ËùÒÔ¶ÔÓÚÿÖÖ LaunchMode ÀàÐÍÎÒÃǶ¼Ôö¼ÓÁËÒ»¸öĬÈÏÊÇ͸Ã÷Ö÷ÌâµÄ
StubActivity¡£
ΪÁ˾¡¿ÉÄܵر£Ö¤Îȶ¨ÐÔ£¬ÎÒÃDzå¼þ Activity Ö§³ÖÁ½ÖÖÔËÐÐģʽ£¬Ò»ÖÖÊÇԤע²áģʽ£¬Ò»ÖÖÊÇÃâ×¢²áģʽ¡£¶ÔÓÚ¾²Ì¬²å¼þ£¨Ëæ
App ´ò°ü£©ÎÒÃÇĬÈÏÔËÐÐÔÚԤע²áģʽÏ£¬¶ÔÓÚ¶¯Ì¬²å¼þ£¨·þÎñÆ÷Ï·¢£©²ÅÔËÐÐÔÚÃâ×¢²áģʽÏ¡£ÖµµÃ˵Ã÷µÄÊÇ£¬¾²Ì¬²å¼þÓëËÞÖ÷
AndroidManifest ºÏ²¢ÊÇÔÚ±àÒëÆÚ×Ô¶¯Íê³ÉµÄ¡£
²å¼þ¼äÒÀÀµ
ÎÒÃDzð·Ö²å¼þʱ£¬Ê×ÏÈÃ÷È·µÄÊÇÿ¸ö²å¼þµÄÒµÎñ±ß½ç£¬ÓÐÁ˱߽ç²ÅÓÐËùνµÄÄÚ¾ÛÐÔ£¬²ÅÄÜÇø·ÖÍⲿʹÓÃÕߺÍÄÚ²¿ÊµÏÖÕß¡£»ùÓÚÕâÑù²ð·Ö£¬ÎÒÃÇ¿ÉÒÔ¿´³öÿ¸ö²å¼þ¼È¿ÉÒÔÒÀÀµÓÚÆäËû²å¼þ£¬Ò²¿ÉÄܱ»ÆäËû²å¼þÒÀÀµ¡£ÎªÁ˼ò»¯ÒµÎñ²å¼þÓë»ù´¡²å¼þÖ®¼äµÄÒÀÀµ¹ØÏµ£¬ÎÒÃǹ涨»ù´¡²å¼þ²»ÄÜÒÀÀµÒµÎñ²å¼þ£¬ÒµÎñ²å¼þ¿ÉÒÔÒÀÀµ»ù´¡²å¼þ£¬ÒµÎñ²å¼þÓëÒµÎñ²å¼þÖ®¼ä¡¢»ù´¡²å¼þÓë»ù´¡²å¼þÖ®¼ä¿ÉÒÔ»¥ÏàÒÀÀµ¡£×ܽáÀ´¿´£¬²å¼þÖ®¼äµÄÒÀÀµÖ÷ÒªÓÐÁ½ÖÖÐÎʽ£º
Ò³ÃæÌø×ª£¨±ÈÈçÉÌÆ· Bundle Ìø×ªµ½µêÆÌ Bundle Ä³Ò»Ò³Ãæ£©£ºAndroid ¿ÉÒÔÓà Intent
½âñîÒ³ÃæÌø×ª£¬µ«¿¼Âǵ½¶à¶Ëͳһ£¬ÎÒÃDzÉÓõÄÊÇÀàËÆÓÚ×ÜÏß»úÖÆ£¬ËùÓÐÌø×ª¶¼Í¨¹ý Page Bus ´¦Àí£¬Ã¿¸öÒ³Ãæ¶¼¶ÔÓ¦Ò»¸ö±ðÃû£¬Ìø×ªÊ±¸ù¾Ý±ðÃûÀ´½øÐС£
¹¦Äܵ÷Óã¨ÉÌÆ· Bundle Óõ½µêÆÌ Bundle ÐÅÏ¢£©£ºÎÒÃǰÑÿ¸ö²å¼þ³éÏóΪһ¸ö·þÎñÌṩÕߣ¬²å¼þ¶ÔÍⱩ¶µÄ·þÎñ³ÆÖ®Îª±¾µØ
Service£¬ËüÒÔ Interface µÄÐÎʽ¶¨Ò壬·þÎñÌṩÕß±£Ö¤°æ±¾Ö®¼äµÄ¼æÈÝ¡£±¾µØ Service
ÔÚ²å¼þµÄ AndroidManifest ÖÐÉùÃ÷£¬²å¼þ°²×°Ê±Ïò¿ò¼Ü×¢²á±¾µØ Service£¬ÆäËû²å¼þʹÓÃʱֱ½Ó¸ù¾Ý·þÎñ±ðÃû²éѯ·þÎñ¡£ÎÒÃÇ»á°Ñ±¾µØ
Service µÄ²éѯ¹ý³ÌÖ±½Ó°ó¶¨µ½ Context µÄ getSystemService() ·½·¨ÉÏ£¬Õû¸öʹÓùý³Ì¾ÍºÍµ÷ÓÃ
Android ϵͳ·þÎñÒ»Ñù¡£´ËÍ⣬³ýÁË·þÎñÒÔÍ⣬²å¼þ»¹ÓпÉÄܶÔÍⱩ¶һЩ Class£¬ÎªÁËÔö¼ÓÄÚ¾ÛÐÔ£¬ÎÒÃÇͨ¹ý@annotation
µÄ·½Ê½ÉùÃ÷¶ÔÍⱩ¶µÄ Class£¬ÔÚ±àÒë½×¶Î Export ¹©ÆäËû²å¼þÒÀÀµ£¬Î´±»×¢½âµÄÀà¾ÍËãÊÇ public£¬¶ÔÆäËû²å¼þÒ²ÊDz»¿É¼ûµÄ¡£
²å¼þµÄÒÀÀµ¹ØÏµ¶¨ÒåÔÚÿ¸ö²å¼þµÄ AndroidManifest ÎļþÖС£
¾Ù¸öÀý×Ó£¬ÏÂÃæÊÇ Shop-Management Ä£¿éÔÚ AndroidManifest ÖеÄÉùÃ÷£º
<!-- ÒÔ϶¨ÒåµÄΪ
Shop-Management ÒÀÀµµÄ Bundle-->
<dependent-bundle android:name ="com.koudai.weishop.lib.network"
android:versionName="7.7.0.0"/>
<dependent-bundle android:name ="com.koudai.weishop.lib.location"
android:versionName="7.7.0.0"/>
<dependent-bundle android:name ="com.koudai.weishop.lib.image"
android:versionName="7.7.0.0"/>
<dependent-bundle android:name ="com.koudai.weishop.lib.boostbus"
android:versionName="7.7.0.0"/>
<dependent-bundle android:name ="com.koudai.weishop.lib.base"
android:versionName="7.7.5.0"/>
<dependent-bundle android:name ="com.koudai.weishop.lib.account"
android:versionName="7.7.0.0"/>
<!-- ÒÔ϶¨ÒåµÄΪ Shop -Management ¶ÔÍⱩ¶µÄ·þÎñ-->
<local-service android:name ="ShopManagerService"
android:value= "com.koudai.weishop.shop.management
.impl.ShopManager"/> |
ÆäÖУ¬versionName ΪÉùÃ÷µÄÒÀÀµ²å¼þµÄ×îС°æ±¾ºÅ£¬²å¼þ°²×°½×¶Î»áУÑéÒÀÀµÌõ¼þÊÇ·ñÂú×㣬Èô²»Âú×ã»á½øÐÐÏàÓ¦´¦Àí£¨Debug
ģʽÅ× RuntimException£¬Release ģʽÊä³ö error log ²¢Éϱ¨¼à¿Øºǫ́£©¡£
¶¯Ì¬²¿Êð¼° HotPatch
²å¼þ»¯ÒԺ󣬶¯Ì¬²¿ÊðºÍ HotPatch Ò²ÊÇÐèҪ˵Ã÷µÄÁ½¸öµã£º
¶¯Ì¬²¿Êð
ÎÒÃÇ¿ò¼ÜÖ§³Ö Activity¡¢BroadcastReceiver µÄÃâ×¢²á£¬Èô²å¼þûÓÐÐÂÔöÆäËûÀàÐÍ£¨Service¡¢Provider£©µÄ×é¼þ£¬Ôò¸Ã²å¼þÖ§³Ö¶¯Ì¬²¿Êð¡£ÓÉÓÚÎÒÃDzÉÓöà
ClassLoader »úÖÆ£¬ÀíÂÛÉÏÊÇÖ§³ÖÈȸüÐµģ¬µ«¿¼Âǵ½²å¼þÓжÔÍâµ¼³ö Class£¬ÎªÁ˼õÉÙ·çÏÕ£¬ÎÒÃǶÔÓÚ¶¯Ì¬²å¼þÉúЧʱ¼äÑÓ³Ùµ½Ó¦ÓÃÇл»ÖÁºǫ́ÒԺ󣬵±Óû§Çл»µ½ºǫ́ʱֱ½Ó
Kill ½ø³Ì¡£
×¢£º
²å¼þ¸üÐÂÖ§³ÖÔöÁ¿¸üУ»
¶ÔÓÚ²å¼þ¸üмì²éÓÐÁ½¸ö´¥·¢Ê±»ú£ºÒ»¸öÊǽø³Ì³õʼ»¯Ê±£¨Pull£©£¬ÁíÒ»¸öÊÇÖ÷¶¯ Push ´¥·¢£¨Push£©¡£
HotPatch
²å¼þ»¯ºó£¬App ·ÖΪËÞÖ÷ºÍ²å¼þ£¬ËÞÖ÷ΪԴÂëÒÀÀµ£¬²å¼þΪ¶þ½øÖÆÒÀÀµ¡£¶ÔÓÚËÞÖ÷ºÍ²å¼þ£¬ÎÒÃDzÉÓò»Í¬µÄ
HotPatch ·½°¸£º
²å¼þ¡ª¡ªÒòΪ²å¼þÖ§³Ö¶¯Ì¬²¿Êð£¬Èô²å¼þÐèÒª²¹¶¡£¬ÎÒÃÇÖ±½ÓÉý¼¶²å¼þ¼´¿É¡£¿öÇÒ²å¼þÖ§³ÖÔö
ÊÇÉý¼¶£¬²¹¶¡°üµÄ´óСҲ¿ÉÒԵõ½ÓÐЧ¿ØÖÆ£»
ËÞÖ÷¡ª¡ªËÞÖ÷²»Ö§³Ö¶¯Ì¬²¿Êð£¬Ö»ÄÜ×ß´«Í³µÄ HotPatch ·½°¸£¬¾¹ý¶àÖÖ·½°¸µÄ¶Ô±È£¬ÎÒÃDzÉ
ÓõÄÊÇÀàËÆÓÚ Tinker ·½°¸£¬¾ßÌåÔÒò´ó¼Ò¿ÉÒԲο¼¡¶Î¢ÐÅÈȲ¹¶¡ÑݽøÖ®Â·¡·¡£
µ«ÎÒÃDz¢²»ÊÇÖ±½ÓʹÓÃµÄ Tinker£¬¶øÊÇÔÚʵÏÖ˼·ÉÏÓë Tinker Ò»Ö£¬²ÉÓÃÈ« Dex Ìæ»»µÄ·½Ê½À´¹æ±ÜÆäËû·½°¸µÄÎÊÌâ¡£ÓÉÓÚÎÒÃDz»½öÒµÎñ×é¼þʵÏÖÁ˲å¼þ»¯£¬¶øÇҴ󲿷ֻù´¡×é¼þ£¨Network¡¢Cache
µÈ£©Ò²ÊµÏÖÁ˲å¼þ»¯£¬ËùÒÔËÞÖ÷²¢²»ÊǺܴó£¨<2.5M£©£¬¿öÇÒËÞÖ÷ÀïµÄ´úÂë¶¼±È½ÏÎȶ¨¡£
΢ÐÅµÄ Tinker ·½°¸ÔÚ²¹¶¡°üµÄ´óСÉϵÄÈ·ÓкܴóµÄÓÅÊÆ£¬ÎÒÃǾ´ÅåÆä¼¼Êõ̽¾¿µÄ¾«Éñ£¬µ«¶ÔÓÚÆäÎȶ¨ÐÔ³ÖÓл³ÒÉ̬¶È£¬»ùÓÚËÞÖ÷°ü¿É¿ØµÄǰÌáÏ£¬ÎÒÃÇÑ¡ÔñÎþÉüÁ÷Á¿À´±£Ö¤Îȶ¨ÐÔ¡£
´úÂë¹ÜÀí
ÎÒÃǶ¨Î»Ã¿¸ö²å¼þ¶¼ÊÇ¿ÉÒÔ¶ÀÁ¢µü´ú App£¬²å¼þ»¯ÒÔºó£¬Õû¸öµÄ¹¤³Ì×éÖ¯·½Ê½ÎªÈçͼ 6 µÄÐÎʽ¡£

ͼ6 ΢µê¹¤³Ì×éÖ¯·½Ê½
ÔÚ´ËÖ®ÖÐÿ¸ö¹¤³Ì¶¼¶ÔÓ¦Ò»¸ö Git ¿â£¬Ö÷¿â°üº¬¶à¸ö×ӿ⣬¶ÔÓÚÕâÖÖ¹¤³Ì½á¹¹£¬ÎÒÃǺÜ×ÔÈ»µØÏëµ½Óà SubModule
À´¹ÜÀí΢µê¹¤³Ì¡£È»¶øÊÂÓëԸΥ£¬Ê¹ÓÃÒ»¶Î SubModule ºó·¢ÏÖÓÐÁ½¸öÎÊÌâÑÏÖØÓ°Ï쿪·¢Ð§ÂÊ£º
¿ª·¢Ä³¸ö²å¼þʱ£¬¶ÔÓÚÆäËû²å¼þÓ¦¸Ã¶¼ÊǶþ½øÖÆÒÀÀµ£¬²»ÔÙÐèÒªÆäËû²å¼þµÄÔ´Â룬µ« SubModule »á°ÑËùÓÐ×Ó¹¤³ÌµÄÔ´Âë¶¼
Checkout ³öÀ´¡£¿¼Âǵ½ Gradle µÄÉúÃüÖÜÆÚ£¬ÕâÑùÑÏÖØÓ°ÏìÁ˱àÒëËÙ¶È£»ÁíÍ⣬Ö÷¹¤³Ì°üº¬ËùÓÐ×Ó¹¤³ÌµÄÔ´ÂëÒ²Ôö¼ÓÎó²Ù×÷µÄ·çÏÕ£¨È«Á¿±àÒë¡¢ÒýÓñ¾µØ°ü¶ø·Ç
Release °ü£©£»
´úÂëÌá½»¸´ÔÓÇÒ¾³£³öÏÖ³åÍ»£ºÎÒÃÇÖªµÀÿ´Î git Ìá½»¶¼»á²úÉúÒ»¸ö Sha Öµ£¬Ö÷¹¤³Ì¹ÜÀíËùÓÐ×Ó¹¤³ÌµÄ
Sha Öµ£¬Ã¿´Î×Ó¹¤³Ì±ä¶¯£¬³ýÁËÌá½»×Ó¹¤³ÌÒÔÍ⣬»¹ÐèҪͬ²½¸üÐÂÖ÷¹¤³ÌµÄ Sha Öµ¡£ÕâÑùÿ´Î×Ó¹¤³ÌµÄ±ä¶¯¶¼Éæ¼°µ½Á½´Î
Commit£¬¸üÑÏÖØµÄÊÇ£¬Èç¹ûÁ½¸öÈËͬʱ¸Ä¶¯Í¬Ò»¸ö×Ó¹¤³Ì£¬µ«Íü¼ÇÁËͬ²½Ìá½»Ö÷¹¤³ÌµÄ Sha Öµ£¬Ôò»á²úÉú³åÍ»£¬¶øÇÒÕâÖÖÇé¿öÏÂÎÞ·¨¸üС¢ÎÞ·¨»Ø¹ö¡¢ÎÞ·¨ºÏ²¢£¬±ÀÀ£¡¡
Õë¶ÔʹÓà Submodule ¹ý³ÌÖÐÓöµ½µÄÎÊÌ⣬ÎÒÃÇÒýÈëÁË Repo À´¹ÜÀí¹¤³Ì´úÂë¡£Repo ²»Ïñ
Submodule ÄÇÑù£¬Í¨¹ý½¨Á¢Ò»ÖÖÖ÷´Ó¹ØÏµ£¬ÓÃÖ÷ Module ¹ÜÀí×Ó Module¡£ÔÚ Repo
ÀËùÓÐ Module ¶¼ÊÇÆ½¼¶¹ØÏµ£¬Ã¿¸ö Module µÄ°æ±¾¹ÜÀíÍêÈ«¶ÀÁ¢ÓÚÈÎºÎÆäËû Module£¬²»»áÏñ
Submodule ÄÇÑù£¬Ìá½»ÁË×Ó Module ´úÂ룬Ҳ»á¶ÔÖ÷ Module Ôì³ÉÓ°Ïì¡£
ÁíÍ⣬ÎÒÃÇÔÚʹÓùý³ÌÖУ¬»¹·¢ÏÖÁËÁíÍâһЩºÃ´¦£º
°þÀëÁËÖ÷ Module ºÍ×Ó Module µÄ¹ØÏµ£¬¼ì³ö¡¢Í¬²½¡¢Ìá½»µÈ²Ù×÷¶¼±È Sumodule
Òª¿ìºÃ¶à±¶£»
Ä£¿é¹ÜÀíÅäÖÃÓÉÒ»¸öİÉúµÄ .gitmodules ±ä³ÉÁËËùÓÐÈ˶¼¸üÊìϤµÄ XML Îļþ£¬±ãÓÚÅäÖùÜÀí¡£
¿ª·¢µ÷ÊÔ
²å¼þ»¯ÒÔǰ£¬ÎÒÃǶÔËùÓÐÄ£¿é¶¼ÊÇÔ´ÂëÒÀÀµ¡£²å¼þ»¯ÒÔºó£¬ÔËÐÐijһģ¿éʱ£¬½ö¶ÔËÞÖ÷¼°µ±Ç°Ä£¿éÊÇÔ´ÂëÒÀÀµ£¬¶ÔÓÚÆäËûÄ£¿éÈ«²¿ÊǶþ½øÖÆÒÀÀµ¡£¼¯³É·½Ê½µÄ¸Ä±ä¾ÍÉæ¼°µ½ÈçÏÂÁ½¸öÎÊÌ⣺
´ò°üʱÈçºÎ¼¯³É²å¼þ°ü£¿
ÈçºÎ½øÐжϵãµ÷ÊÔ£¿ ²å¼þ°ü¼¯³É
ÎÒÃDzå¼þµÄ¶þ½øÖưüÊÇ so °ü£¬ÆäʵÕâЩ so ¶¼ÊÇÕý³£µÄ Apk ½á¹¹£¬¸ÄΪ so ·ÅÈë lib
Ŀ¼ֻÊÇΪÁ˰²×°Ê±½èÓÃϵͳµÄÄÜÁ¦´Ó Apk Öнâѹ³öÀ´£¬·½±ãºóÐø°²×°¡£ÎÒÃÇĿǰËùÓеĿⶼÊÇ»ùÓÚ Maven
À´¹ÜÀí£¬²å¼þ¼ÈÈ»ÊÇ so °ü£¬ÕýºÃ½èÓà Maven ¹ÜÀíÄÜÁ¦Í¬Ê±£¬»ùÓÚ¿ªÔ´µÄ Gradle ²å¼þ android-native-dependencies
ʵÏÖÁ˲å¼þµÄ¼¯³É¡£
¶Ïµãµ÷ÊÔ
¿ª·¢²å¼þʱ£¬¶ÔÓÚÆäËû²å¼þµÄ¶þ½øÖưü¶¼ÊÇÒÀÀµµÄÒÑ·¢²¼°æ£¬ËùÓÐÒÑ·¢²¼µÄ²å¼þ¶¼ÊÇ»ìÏý°ü¡£Èô¿ª·¢¹ý³ÌÖÐÉæ¼°µ½ÆäËû²å¼þµÄ¶Ïµãµ÷ÊÔ£¬Ôò»á³öÏÖÎÞ·¨¶ÔÓ¦Ô´Âë¡£
¶ÔÓÚÕâÖÖÇé¿ö£¬ÎÒÃÇÖÆ¶¨ÁËÒ»¸ö²ßÂÔ£¬ÔÚ Debug ģʽÏ£¬»áÓÅÏÈʹÓñ¾µØ±àÒëµÄ°ü¡£ÈôÒªµ÷ÊÔÆäËû²å¼þ£¬¿ÉÒ԰Ѳå¼þÔ´Âë¼ì³öÀ´±àÒë±¾µØ°ü£¨µÃÒæÓÚ
Repo ¼ì³ö¹ý³Ì·Ç³£·½±ã£©£¬´ò°ü¹ý³ÌÈô¼ìË÷µ½Óб¾µØ°ü£¬»áÌæ»»µô´Ó Maven Ô¶³Ì²Ö¿âÏÂÔØµÄ°ü£¬µ±È»£¬Õâ¸öÌæ»»¹ý³ÌÊÇͨ¹ý±àÒë½Å±¾×Ô¶¯Íê³ÉµÄ¡£
×ܽá
ËäÈ» Android ²å¼þ»¯ÔÚ¹úÄÚ·¢Õ¹Óм¸Ä꣬¸÷ÖÖ·½°¸°Ù»¨Æë·Å£¬µ«ÕæµÄÒªÔÚÒµÎñ¿ìËÙµü´úµÄ¹ý³ÌÖÐÍê³É²å¼þ»¯¸ÄÔ칤×÷£¬ÆäÖÐËáˬҲֻÓÐÇ×ÀúÕß²ÅÄÜÌå»áµ½¡£½üÄêÀ´Ëæ×Å
React Native¡¢Weex ¼°Î¢ÐÅС³ÌÐòµÄÐËÆð£¬ºÜ¶àÒÔǰÐèÒª²å¼þ»¯²ÅÄܽâ¾öµÄÎÊÌ⣬ÏÖÔÚ»òÐíÓÐÁ˸üºÃµÄ½â¾ö·½Ïò¡£µ«£¬¼¼Êõ·þÎñÓÚÒµÎñ£¬Îȶ¨Ñ¹µ¹Ò»ÇУ¬Óë´ó¼Ò¹²Ãã¡£
|