- 如果给了一个apk,我们如何将另一个Apk或者aar里面的res资源合并到一起呢,首先我们必须了解res目录下都有些哪些目录和资源文件,我们找一个apk文件,然后将其拖进Android Studio里面就可以看到apk的目录结构,也可以使用apktool 命令解析apk来查看里面的结构,我们重点关注res目录,看下里面有哪些东西
- res下主要就是drawable、layout、color、anim、values、xml等目录
- 如果是将apk的res合并进母包apk,这个就很简单了,非values文件夹下的所有目录,直接拷贝过去就行了,如果有相同的文件,我们不覆盖,因为首先得保证母包里面的文件再保证合入的资源文件,如果是values下的资源文件则需要做特殊的处理了,因为在使用apktool进行解析的时候,values目录里面的资源文件已经被分类存放在不同的xml文件中了
- 现在另一个apk解析后的values目录也是这样的,我们不能直接拷贝过来,而是需要将这些相同文件名称的xml文件进行合并处理,如果母包的res里面不存在相同名称的xml文件,则直接拷贝过来就行了
- 相同xml资源文件的合并需要注意同名的资源ID需要保留母包的就行,当然合并xml可以使用dom4j等框架
- 有一个比较特殊的资源文件就是declare-styleable了,这个标签的合并需要结合smali代码,请看这篇文章对Android的R$styleab.smali、declare-styleable标签自定义attr属性的还原与逆向开发实践_林慈桥的博客-CSDN博客
- 如果我们需要将aar包当中的res目录合并到apk中去,应该怎么做呢,首先我们看下aar下的res目录有哪些目录和资源文件,还是拖动一个aar包到Android Studio中,看下里面res的结构
- aar包的res目录与apk的res目录是差不多的,一般直接拷贝合并就行,现在我们主要看下values目录下的values.xml文件有哪些东西,下面是我在快手广告SDK的aar包里面找到的一个values.xml文件,里面的元素比较全,啥都有,来看看
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:ns1="http://schemas.android.com/tools"> <attr format="reference" name="loading_anim"/> <attr format="string" name="loading_text"/> <attr format="reference" name="refreshViewLayout"/> <color name="background_pressed">#F0F0F0</color> <color name="edit_orange">@color/p_color_orange</color> <color name="ksad_black_alpha20">#33000000</color> <color name="ksad_black_alpha50">#80000000</color> <color name="ksad_default_dialog_bg_color">#4D666666</color> <color name="ksad_default_privacy_link_color">#FFFFFF</color> <color name="ksad_jinniu_end_origin_color">#FF9C9C9C</color> <color name="ksad_main_color_orange">#FFFF4906</color> <color name="ksad_no_title_common_dialog_negativebtn_color">#666666</color> <color name="ksad_no_title_common_dialog_positivebtn_color">#5181FB</color> <color name="ksad_play_again_desc_text_color">#FF666666</color> <color name="ksad_play_again_desc_text_color_horizontal">#FFFFFFFF</color> <color name="ksad_play_again_horizontal_bg">#B3000000</color> <color name="ksad_play_again_horizontal_bg_light">#4D000000</color> <color name="ksad_play_again_title_text_color">#FF222222</color> <color name="ksad_play_again_title_text_color_horizontal">#FFFFFFFF</color> <color name="ksad_playable_pre_tips_icon_bg">#33FFFFFF</color> <color name="ksad_reward_main_color">#FFFE3666</color> <color name="ksad_reward_main_color_orange">#FFFF4906</color> <color name="ksad_reward_original_price">#FF666666</color> <color name="ksad_reward_undone_color">#FF9C9C9C</color> <color name="ksad_translucent">#00000000</color> <color name="loading_title_color">#c6c6c6</color> <color name="p_color_orange">#ff5000</color> <color name="popup_window_toast_bubble_background">#B3111111</color> <color name="text_default_color">#ffffff</color> <color name="text_orange_color_2">#ff5000</color> <color name="text_popup_window_toast_bubble_color">#ffffff</color> <dimen name="common_popup_view_min_top_offset">120dp</dimen> <dimen name="ksad_action_bar_height">44dp</dimen> <dimen name="ksad_coupon_dialog_height">304dp</dimen> <dimen name="ksad_coupon_dialog_value_prefix_text_size">32sp</dimen> <dimen name="ksad_coupon_dialog_width">263dp</dimen> <dimen name="ksad_install_tips_card_elevation">2dp</dimen> <dimen name="ksad_install_tips_card_height">80dp</dimen> <dimen name="ksad_install_tips_card_margin">8dp</dimen> <dimen name="ksad_install_tips_card_padding_left">10dp</dimen> <dimen name="ksad_install_tips_card_padding_right">12dp</dimen> <dimen name="ksad_interstitial_card_radius">8dp</dimen> <dimen name="ksad_interstitial_download_bar_height">70dp</dimen> <dimen name="ksad_interstitial_icon_radius">4dp</dimen> <dimen name="ksad_jinniu_light_sweep_margin_left">-72dp</dimen> <dimen name="ksad_jinniu_light_sweep_width">72dp</dimen> <dimen name="ksad_play_again_dialog_btn_height">48dp</dimen> <dimen name="ksad_play_again_dialog_card_margin_vertical">12dp</dimen> <dimen name="ksad_play_again_dialog_height">352dp</dimen> <dimen name="ksad_play_again_dialog_img_height">148dp</dimen> <dimen name="ksad_play_again_dialog_width">312dp</dimen> <dimen name="ksad_play_again_end_height">456dp</dimen> <dimen name="ksad_play_again_end_height_with_logo">482dp</dimen> <dimen name="ksad_play_again_end_icon_size">80dp</dimen> <dimen name="ksad_play_again_end_icon_size_download">100dp</dimen> <dimen name="ksad_play_again_end_icon_size_horizontal">54dp</dimen> <dimen name="ksad_reflux_back_height">200dp</dimen> <dimen name="ksad_reflux_card_left_height">106dp</dimen> <dimen name="ksad_reflux_card_left_inner_height">74dp</dimen> <dimen name="ksad_reflux_card_padding">16dp</dimen> <dimen name="ksad_reflux_card_top_img_height">195dp</dimen> <dimen name="ksad_reflux_icon_size">16dp</dimen> <dimen name="ksad_reflux_title_bar_corner">16dp</dimen> <dimen name="ksad_reward_apk_info_card_actionbar_text_size">15dp</dimen> <dimen name="ksad_reward_apk_info_card_height">156dp</dimen> <dimen name="ksad_reward_apk_info_card_icon_size">54dp</dimen> <dimen name="ksad_reward_apk_info_card_margin">16dp</dimen> <dimen name="ksad_reward_apk_info_card_step_area_height">79dp</dimen> <dimen name="ksad_reward_apk_info_card_step_divider_height">16dp</dimen> <dimen name="ksad_reward_apk_info_card_step_icon_radius">12dp</dimen> <dimen name="ksad_reward_apk_info_card_step_icon_size">12dp</dimen> <dimen name="ksad_reward_apk_info_card_step_icon_text_size">8sp</dimen> <dimen name="ksad_reward_apk_info_card_tags_height">18dp</dimen> <dimen name="ksad_reward_apk_info_card_width">343dp</dimen> <dimen name="ksad_reward_author_height">76dp</dimen> <dimen name="ksad_reward_author_icon_anim_start">22dp</dimen> <dimen name="ksad_reward_author_icon_inner_width">44dp</dimen> <dimen name="ksad_reward_author_icon_stroke_width">1dp</dimen> <dimen name="ksad_reward_author_icon_width">61dp</dimen> <dimen name="ksad_reward_author_width">61dp</dimen> <dimen name="ksad_reward_follow_author_icon_margin_bottom">242dp</dimen> <dimen name="ksad_reward_follow_card_height">64dp</dimen> <dimen name="ksad_reward_follow_card_margin">12dp</dimen> <dimen name="ksad_reward_follow_card_width_horizontal">351dp</dimen> <dimen name="ksad_reward_follow_dialog_card_height">222dp</dimen> <dimen name="ksad_reward_follow_dialog_height">243dp</dimen> <dimen name="ksad_reward_follow_dialog_icon_size">80dp</dimen> <dimen name="ksad_reward_follow_dialog_width">280dp</dimen> <dimen name="ksad_reward_follow_end_card_height">247dp</dimen> <dimen name="ksad_reward_follow_end_height">318dp</dimen> <dimen name="ksad_reward_follow_end_width">280dp</dimen> <dimen name="ksad_reward_follow_logo_margin_bottom">87dp</dimen> <dimen name="ksad_reward_followed_card_height">64dp</dimen> <dimen name="ksad_reward_followed_card_width">216dp</dimen> <dimen name="ksad_reward_jinniu_card_btn_height">40dp</dimen> <dimen name="ksad_reward_jinniu_card_height">105dp</dimen> <dimen name="ksad_reward_jinniu_card_height_full">155dp</dimen> <dimen name="ksad_reward_jinniu_card_icon_size">85dp</dimen> <dimen name="ksad_reward_jinniu_card_margin">12dp</dimen> <dimen name="ksad_reward_jinniu_card_padding">10dp</dimen> <dimen name="ksad_reward_jinniu_dialog_close_size">30dp</dimen> <dimen name="ksad_reward_jinniu_dialog_height">334dp</dimen> <dimen name="ksad_reward_jinniu_dialog_icon_size">58dp</dimen> <dimen name="ksad_reward_jinniu_dialog_width">286dp</dimen> <dimen name="ksad_reward_jinniu_end_height">344dp</dimen> <dimen name="ksad_reward_jinniu_end_icon_size">100dp</dimen> <dimen name="ksad_reward_jinniu_end_max_width">355dp</dimen> <dimen name="ksad_reward_jinniu_end_origin_text_size">12sp</dimen> <dimen name="ksad_reward_jinniu_logo_margin_bottom">125dp</dimen> <dimen name="ksad_reward_js_actionbar_height">120dp</dimen> <dimen name="ksad_reward_middle_end_card_logo_view_height">16dp</dimen> <dimen name="ksad_reward_middle_end_card_logo_view_margin_bottom">10dp</dimen> <dimen name="ksad_reward_native_normal_actionbar_height">90dp</dimen> <dimen name="ksad_reward_order_card_coupon_height">18dp</dimen> <dimen name="ksad_reward_order_card_height">102dp</dimen> <dimen name="ksad_reward_order_card_icon_size">82dp</dimen> <dimen name="ksad_reward_order_card_margin">12dp</dimen> <dimen name="ksad_reward_order_card_padding">10dp</dimen> <dimen name="ksad_reward_order_coupon_divider">4dp</dimen> <dimen name="ksad_reward_order_dialog_height">242dp</dimen> <dimen name="ksad_reward_order_dialog_icon_size">60dp</dimen> <dimen name="ksad_reward_order_dialog_width">280dp</dimen> <dimen name="ksad_reward_order_end_dialog_height">236dp</dimen> <dimen name="ksad_reward_order_end_dialog_width">280dp</dimen> <dimen name="ksad_reward_order_logo_margin_bottom">123dp</dimen> <dimen name="ksad_reward_order_original_price_size">12sp</dimen> <dimen name="ksad_reward_order_price_size">15sp</dimen> <dimen name="ksad_reward_playable_pre_tips_default_margin_bottom">40dp</dimen> <dimen name="ksad_reward_playable_pre_tips_height">40dp</dimen> <dimen name="ksad_reward_playable_pre_tips_icon_padding">5dp</dimen> <dimen name="ksad_reward_playable_pre_tips_icon_size">34dp</dimen> <dimen name="ksad_reward_playable_pre_tips_margin_bottom">16dp</dimen> <dimen name="ksad_reward_playable_pre_tips_margin_bottom_without_actionbar">43dp</dimen> <dimen name="ksad_reward_playable_pre_tips_margin_right">-71dp</dimen> <dimen name="ksad_reward_playable_pre_tips_transx">-70dp</dimen> <dimen name="ksad_reward_playable_pre_tips_width">117dp</dimen> <dimen name="ksad_reward_task_dialog_height">264dp</dimen> <dimen name="ksad_reward_task_dialog_width">290dp</dimen> <dimen name="ksad_seek_bar_progress_text_margin">10dp</dimen> <dimen name="ksad_skip_view_divider_height">12dp</dimen> <dimen name="ksad_skip_view_divider_margin_horizontal">8dp</dimen> <dimen name="ksad_skip_view_divider_margin_left">52dp</dimen> <dimen name="ksad_skip_view_divider_margin_vertical">10dp</dimen> <dimen name="ksad_skip_view_divider_width">1dp</dimen> <dimen name="ksad_skip_view_height">32dp</dimen> <dimen name="ksad_skip_view_padding_horizontal">16dp</dimen> <dimen name="ksad_skip_view_radius">16dp</dimen> <dimen name="ksad_skip_view_text_size">14sp</dimen> <dimen name="ksad_skip_view_width">128dp</dimen> <dimen name="ksad_splash_actionbar_height">52dp</dimen> <dimen name="ksad_splash_actionbar_margin_bottom">20dp</dimen> <dimen name="ksad_splash_actionbar_width">280dp</dimen> <dimen name="ksad_splash_rotate_view_height">88dp</dimen> <dimen name="ksad_splash_rotate_view_margin_bottom">34dp</dimen> <dimen name="ksad_splash_rotate_view_margin_top">24dp</dimen> <dimen name="ksad_splash_rotate_view_width">88dp</dimen> <dimen name="ksad_splash_shake_animator_height">8dp</dimen> <dimen name="ksad_splash_shake_view_height">92dp</dimen> <dimen name="ksad_splash_shake_view_margin_bottom">30dp</dimen> <dimen name="ksad_splash_shake_view_margin_top">16dp</dimen> <dimen name="ksad_splash_shake_view_width">92dp</dimen> <dimen name="ksad_title_bar_height">45dp</dimen> <dimen name="kwai_loading_default_size">40dp</dimen> <dimen name="text_size_12">12sp</dimen> <dimen name="text_size_14">14sp</dimen> <dimen name="text_size_15">15sp</dimen> <item name="holder" type="id"/> <item name="loading_view" type="id"/> <item name="tk_animation" type="id"/> <item name="tk_node" type="id"/> <string name="app_name">KSecurityCore</string> <string name="ksad_ad_default_username_normal">可爱的广告君</string> <string name="ksad_data_error_toast">内容获取失败</string> <string name="ksad_deep_link_dialog_content">再次开启 【%s】</string> <string name="ksad_default_no_more_tip_or_toast_txt">更多内容请前往快手App查看</string> <string name="ksad_download_kwai_waiting">下载信息获取中,请稍后再试。</string> <string name="ksad_half_page_loading_error_tip">加载失败,请点击重试</string> <string name="ksad_half_page_loading_no_comment_tip">暂无评论,来抢沙发</string> <string name="ksad_half_page_loading_no_related_tip">无更多内容</string> <string name="ksad_install_tips">“ %1$s ”已下载完毕,请点击免费安装</string> <string name="ksad_launch_tips">您已安装“ %1$s ”,是否打开该应用</string> <string name="ksad_network_error_toast">网络错误</string> <string name="ksad_no_title_common_dialog_negativebtn_title">取消</string> <string name="ksad_no_title_common_dialog_positivebtn_title">确定</string> <string name="ksad_page_load_more_tip">上拉加载更多</string> <string name="ksad_page_load_no_more_tip">无更多内容</string> <string name="ksad_page_loading_data_error_sub_title">内容获取失败请点击重试</string> <string name="ksad_page_loading_data_error_title">空空如也</string> <string name="ksad_page_loading_data_limit_error_title">今日精彩内容已看完,请明日再来</string> <string name="ksad_page_loading_error_retry">重试</string> <string name="ksad_page_loading_network_error_sub_title">请检查网络连接后重试</string> <string name="ksad_page_loading_network_error_title">网络不给力</string> <string name="ksad_page_loading_no_more_data_error_title">暂无内容</string> <string name="ksad_request_install_content">安装后,可以在快手查看商品详情和下单</string> <string name="ksad_request_install_nagative">暂不开启</string> <string name="ksad_request_install_positive">去开启</string> <string name="ksad_request_install_title">授权安装快手</string> <string name="ksad_return_back">返回%1$s</string> <string name="ksad_reward_default_tip">后可领取奖励</string> <string name="ksad_reward_success_tip">领取奖励</string> <style name="Loading_More"> <item name="android:id">@id/loading_view</item> <item name="loading_width">30dp</item> <item name="loading_hight">30dp</item> <item name="android:layout_gravity">center</item> <item name="loading_anim">@drawable/ksad_kwai_loading_view_gray</item> </style> <style name="Theme.Widget.Text" parent="@android:style/TextAppearance"> <item name="android:textSize">@dimen/text_size_15</item> <item name="android:textColor">#434658</item> <item name="android:minHeight">10dp</item> </style> <style name="TransparentDialogActivity" parent="@style/Theme.AppCompat.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:backgroundDimAmount">0</item> <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item> </style> <style name="ksad_RewardCardBtnInstall"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">44dp</item> <item name="android:background">@drawable/ksad_reward_install_btn_bg</item> </style> <style name="ksad_RewardCardTag"> <item name="android:background">@drawable/ksad_reward_card_tag_bg</item> <item name="android:paddingLeft">8dp</item> <item name="android:paddingRight">8dp</item> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">18dp</item> <item name="android:textColor">@color/ksad_reward_main_color</item> <item name="android:textSize">10sp</item> <item name="android:gravity">center</item> </style> <declare-styleable name="CustomRefreshLayout"> <attr format="reference" name="refreshLayout"/> <attr format="dimension" name="refreshViewWidth"/> </declare-styleable> <declare-styleable name="KwaiLoadingView"> <attr name="loading_anim"/> <attr name="loading_text"/> <attr format="dimension" name="loading_width"/> <attr format="dimension" name="loading_hight"/> </declare-styleable> <declare-styleable name="KwaiRefreshView"> <attr name="loading_anim"/> </declare-styleable> <declare-styleable name="ShootRefreshView"> <attr format="color" name="strokeColor"/> <attr format="dimension" name="strokeWidth"/> <attr format="color|reference" name="gradientStartColor"/> <attr format="color|reference" name="gradientEndColor"/> </declare-styleable> <declare-styleable name="ksad_ComplianceTextView"><attr format="dimension" name="ksad_width_in_landscape"/><attr format="color|reference" name="ksad_privacy_color"/></declare-styleable> <declare-styleable name="ksad_DividerView"> <attr format="color" name="ksad_color"/> <attr format="dimension" name="ksad_dashLength"/> <attr format="dimension" name="ksad_dashGap"/> <attr format="dimension" name="ksad_dashThickness"/> <attr format="enum" name="ksad_orientation"> <enum name="horizontal" value="0"/> <enum name="vertical" value="1"/> </attr> </declare-styleable> <declare-styleable name="ksad_DownloadProgressView"> <!-- 下载启动前的文本颜色 --> <attr format="color" name="ksad_downloadTextColor"/> <!-- 下载进行中左侧的文本颜色 --> <attr format="color" name="ksad_downloadLeftTextColor"/> <!-- 下载进行中右侧的文本颜色 --> <attr format="color" name="ksad_downloadRightTextColor"/> <!-- 正常状态下的背景的drawable--> <attr format="reference" name="ksad_backgroundDrawable"/> <!-- 进度条的drawable--> <attr format="reference" name="ksad_progressDrawable"/> <!-- 内部所有的文本的大小 --> <attr format="dimension" name="ksad_downloadTextSize"/> <!-- 下载中显示进度的格式 --> <attr format="string" name="ksad_downloadingFormat"/> </declare-styleable> <declare-styleable name="ksad_JinniuCouponLayout"> <attr format="dimension" name="ksad_outerRadius"/> <attr format="dimension" name="ksad_verticalRadius"/> </declare-styleable> <declare-styleable name="ksad_KSCornerImageView"> <attr format="boolean" name="ksad_leftTopCorner"/> <attr format="boolean" name="ksad_topRightCorner"/> <attr format="boolean" name="ksad_rightBottomCorner"/> <attr format="boolean" name="ksad_bottomLeftCorner"/> </declare-styleable> <declare-styleable name="ksad_KSCouponLabelTextView"> <attr format="dimension" name="ksad_labelRadius"/> <attr format="dimension" name="ksad_sideRadius"/> <attr format="color" name="ksad_strokeColor"/> <attr format="dimension" name="ksad_strokeSize"/> </declare-styleable> <declare-styleable name="ksad_KSLayout"> <attr format="dimension" name="ksad_radius"/> <attr format="boolean" name="ksad_clipBackground"/> <attr format="float" name="ksad_ratio"/> </declare-styleable> <declare-styleable name="ksad_KSRatingBar" ns1:ignore="ResourceName"> <attr format="dimension" name="ksad_starImageWidth"/> <attr format="dimension" name="ksad_starImageHeight"/> <attr format="dimension" name="ksad_starImagePadding"/> <attr format="integer" name="ksad_totalStarCount"/> <attr format="integer" name="ksad_starCount"/> <attr format="reference" name="ksad_starEmpty"/> <attr format="reference" name="ksad_starFill"/> <attr format="reference" name="ksad_starHalf"/> <attr format="boolean" name="ksad_clickable"/> <attr format="boolean" name="ksad_halfstart"/> </declare-styleable> <declare-styleable name="ksad_KsRadiusStrokeTextView"> <attr format="color" name="ksad_textStrokeColor"/> <attr format="dimension" name="ksad_textRadius"/> <attr format="dimension" name="ksad_textLeftTopRadius"/> <attr format="dimension" name="ksad_textLeftBottomRadius"/> <attr format="dimension" name="ksad_textRightTopRadius"/> <attr format="dimension" name="ksad_textRightBottomRadius"/> <attr format="dimension" name="ksad_textStrokeWidth"/> <attr format="reference" name="ksad_textDrawable"/> <attr format="color" name="ksad_textNormalTextColor"/> <attr format="color" name="ksad_textSelectedTextColor"/> <attr format="boolean" name="ksad_textNoLeftStroke"/> <attr format="boolean" name="ksad_textNoRightStroke"/> <attr format="boolean" name="ksad_textNoTopStroke"/> <attr format="boolean" name="ksad_textNoBottomStroke"/> <attr format="color" name="ksad_textPressedSolidColor"/> <attr format="color" name="ksad_textNormalSolidColor"/> <attr format="boolean" name="ksad_textIsSelected"/> </declare-styleable> <declare-styleable name="ksad_KsShakeView"> <attr format="color" name="ksad_outerStrokeColor"/> <attr format="dimension" name="ksad_outerStrokeWidth"/> <attr format="color" name="ksad_solidColor"/> <!-- 是否显示内部圆形 --> <attr format="integer" name="ksad_shakeViewStyle"/> <!-- 内部圆形的颜色 --> <attr format="color" name="ksad_innerCircleStrokeColor"/> <!-- 内部圆形的描边宽度 --> <attr format="dimension" name="ksad_innerCircleStrokeWidth"/> <!-- 内部圆形的padding --> <attr format="dimension" name="ksad_innerCirclePadding"/> <!-- 摇一摇的图标 --> <attr format="reference" name="ksad_shakeIcon"/> </declare-styleable> <declare-styleable name="ksad_KsVerticalMarqueeTextView"> <attr format="boolean" name="ksad_autoStartMarquee"/> <attr format="reference|integer" name="ksad_marqueeSpeed"/> <attr format="reference|string" name="ksad_text"/> <attr format="reference|dimension" name="ksad_textSize"/> <attr format="reference|color" name="ksad_textColor"/> <attr format="reference" name="ksad_textAppearance"/> <attr name="ksad_textStyle"> <enum name="normal" value="0"/> <enum name="bold" value="1"/> <enum name="italic" value="2"/> </attr> <attr name="ksad_typeface"> <enum name="normal" value="0"/> <enum name="sans" value="1"/> <enum name="serif" value="2"/> <enum name="monospace" value="3"/> </attr> </declare-styleable> <declare-styleable name="ksad_SeekBar"> <attr format="color" name="ksad_SeekBarBackground"/> <attr format="color" name="ksad_SeekBarProgress"/> <attr format="color" name="ksad_SeekBarSecondProgress"/> <attr format="boolean" name="ksad_SeekBarDisplayProgressText"/> <attr format="boolean" name="ksad_SeekBarLimitProgressText100"/> <attr format="dimension" name="ksad_SeekBarProgressTextSize"/> <attr format="dimension" name="ksad_SeekBarProgressTextMargin"/> <attr format="dimension" name="ksad_SeekBarWidth"/> <attr format="dimension" name="ksad_SeekBarHeight"/> <attr format="dimension" name="ksad_SeekBarRadius"/> <attr format="dimension" name="ksad_SeekBarPaddingLeft"/> <attr format="dimension" name="ksad_SeekBarPaddingRight"/> <attr format="dimension" name="ksad_SeekBarPaddingTop"/> <attr format="dimension" name="ksad_SeekBarPaddingBottom"/> <attr format="reference" name="ksad_SeekBarThumb"/> <attr format="reference" name="ksad_SeekBarDefaultIndicator"/> <attr format="reference" name="ksad_SeekBarDefaultIndicatorPass"/> <attr format="boolean" name="ksad_SeekBarShowProgressText"/> <attr format="color" name="ksad_SeekBarProgressTextColor"/> </declare-styleable> <declare-styleable name="yoga"><attr format="enum" name="yg_alignContent"> <enum name="auto" value="0"/> <enum name="flex_start" value="1"/> <enum name="center" value="2"/> <enum name="flex_end" value="3"/> <enum name="stretch" value="4"/> <enum name="baseline" value="5"/> </attr><attr format="enum" name="yg_alignItems"> <enum name="auto" value="0"/> <enum name="flex_start" value="1"/> <enum name="center" value="2"/> <enum name="flex_end" value="3"/> <enum name="stretch" value="4"/> <enum name="baseline" value="5"/> </attr><attr format="enum" name="yg_alignSelf"> <enum name="auto" value="0"/> <enum name="flex_start" value="1"/> <enum name="center" value="2"/> <enum name="flex_end" value="3"/> <enum name="stretch" value="4"/> <enum name="baseline" value="5"/> </attr><attr format="float" name="yg_aspectRatio"/><attr format="dimension" name="yg_borderLeft"/><attr format="dimension" name="yg_borderTop"/><attr format="dimension" name="yg_borderRight"/><attr format="dimension" name="yg_borderBottom"/><attr format="dimension" name="yg_borderStart"/><attr format="dimension" name="yg_borderEnd"/><attr format="dimension" name="yg_borderHorizontal"/><attr format="dimension" name="yg_borderVertical"/><attr format="dimension" name="yg_borderAll"/><attr format="enum" name="yg_direction"> <enum name="inherit" value="0"/> <enum name="ltr" value="1"/> <enum name="rtl" value="2"/> </attr><attr format="enum" name="yg_display"> <enum name="flex" value="0"/> <enum name="none" value="1"/> </attr><attr format="float" name="yg_flex"/><attr format="float|string" name="yg_flexBasis"/><attr format="enum" name="yg_flexDirection"> <enum name="column" value="0"/> <enum name="column_reverse" value="1"/> <enum name="row" value="2"/> <enum name="row_reverse" value="3"/> </attr><attr format="float" name="yg_flexGrow"/><attr format="float" name="yg_flexShrink"/><attr format="dimension|string" name="yg_height"/><attr format="enum" name="yg_justifyContent"> <enum name="flex_start" value="0"/> <enum name="center" value="1"/> <enum name="flex_end" value="2"/> <enum name="space_between" value="3"/> <enum name="space_around" value="4"/> </attr><attr format="dimension|string" name="yg_marginLeft"/><attr format="dimension|string" name="yg_marginTop"/><attr format="dimension|string" name="yg_marginRight"/><attr format="dimension|string" name="yg_marginBottom"/><attr format="dimension|string" name="yg_marginStart"/><attr format="dimension|string" name="yg_marginEnd"/><attr format="dimension|string" name="yg_marginHorizontal"/><attr format="dimension|string" name="yg_marginVertical"/><attr format="dimension|string" name="yg_marginAll"/><attr format="dimension|string" name="yg_maxHeight"/><attr format="dimension|string" name="yg_maxWidth"/><attr format="dimension|string" name="yg_minHeight"/><attr format="dimension|string" name="yg_minWidth"/><attr format="enum" name="yg_overflow"> <enum name="visible" value="0"/> <enum name="hidden" value="1"/> <enum name="scroll" value="2"/> </attr><attr format="dimension|string" name="yg_paddingLeft"/><attr format="dimension|string" name="yg_paddingTop"/><attr format="dimension|string" name="yg_paddingRight"/><attr format="dimension|string" name="yg_paddingBottom"/><attr format="dimension|string" name="yg_paddingStart"/><attr format="dimension|string" name="yg_paddingEnd"/><attr format="dimension|string" name="yg_paddingHorizontal"/><attr format="dimension|string" name="yg_paddingVertical"/><attr format="dimension|string" name="yg_paddingAll"/><attr format="dimension|string" name="yg_positionLeft"/><attr format="dimension|string" name="yg_positionTop"/><attr format="dimension|string" name="yg_positionRight"/><attr format="dimension|string" name="yg_positionBottom"/><attr format="dimension|string" name="yg_positionStart"/><attr format="dimension|string" name="yg_positionEnd"/><attr format="dimension|string" name="yg_positionHorizontal"/><attr format="dimension|string" name="yg_positionVertical"/><attr format="dimension|string" name="yg_positionAll"/><attr format="enum" name="yg_positionType"> <enum name="relative" value="0"/> <enum name="absolute" value="1"/> </attr><attr format="dimension|string" name="yg_width"/><attr format="enum" name="yg_wrap"> <enum name="no_wrap" value="0"/> <enum name="wrap" value="1"/> </attr></declare-styleable> </resources>
里面的元素标签太多了,主要就是attr 、color 、dimen 、string、style、declare-styleable、item 等,这个里面就是一个大杂烩,啥元素都有,apktool解析出来的values目录已经为我们分类好了,我们直接合并就行
- 要合并aar的values目录下的values.xml文件,首先就需要将values.xml文件进行分解了,我们需要通过同的元素标签来进行分解,首先遍历values.xml 的所有元素,如果元素标签.xml文件,比如attrs.xml文件不存在,就创建一个attrs.xml文件,然后将这个元素添加进attrs.xml
- 当元素标签是item的时候,需要读取标签的type属性值,然后创建type属性值s.xml文件,并将元素合并到里面
- 当元素标签是array结尾的话,需要创建arrays.xml文件再进行合并元素
- 对于declare-styleable的合并,并不需要做任何处理,按照上面的规则进行合并就行了
- 当valuse.xml的分解完成后,就可以删除了,然后将生成的xml文件通过xml元素合并的方式进行合并就可以了
- res 的合并和特殊处理的点很多,如果在apktool进行回编译的时候,如果回编译不过,需要根据具体的原因来分析处理,另外在合并资源文件后需要使用aapt工具重新生成R.java 文件,最后转成R.smali文件进行合并,资源文件有问题,重复或者遗漏的aapt都会报错的,所以需要小心处理