o
    iC                     @   s   d dl mZ d dl mZ d dlmZ d dlmZ d dlmZ d dl m	Z	 d dl m
Z
 d dlZd dlZd d	l mZ d
d Zdd Zdd Zdd Zdd Zdd ZdddZdd Zdd ZdS )    )custom_image)custom_pbxproj)oc_util)delete_debug_macros)
md_to_html)custom_util)custom_replaceN)custom_projectc                 C   s   t d t  t d t d t  t d t d tj dtj d}t|tj t d t d	 t	| t
j}t| | t d
 t d ttjd}t d t
jdkr_t d t| t d t| t  d S )Nu   j资源加密处理开始...u   j资源加密处理完成u+   j删除所有 XXGPLAYKIT_DEBUG 宏定义块u1   j删除所有 XXGPLAYKIT_DEBUG 宏定义块完成uC   j清空 Target 的预处理器定义 (GCC_PREPROCESSOR_DEFINITIONS)/.xcodeproj/project.pbxprojuI   j清空 Target 的预处理器定义 (GCC_PREPROCESSOR_DEFINITIONS)完成u   j处理SDK对接文档开始...u   j处理SDK对接文档完成u    j修改XXGThirdMiddlewares名字XXGThirdMiddlewaresu&   j修改XXGThirdMiddlewares名字完成Tu   j处理podfile文件u,   j提取需要导出的 .a 文件名白名单)printr   initr   r   path_mix_projectname_current_projectr   %clear_target_preprocessor_definitionsget_needed_sdks_from_optionsr   sdk_optionshandle_sdk_docr	   custom_modify_project_name	need_podshandle_podfileextract_exported_lib_nameshandle_script)sdk_cn_or_os	proj_pathneeded_sdksnew_thirdmiddlewares_name r   A/data/storage/obfuscation/tool/ObjectiveC/oc_custom/custom_end.pyr      s:   


r   c              
   C   s  t j d}d}dD ]}| d| }tj|r|} nq
|du r+td|  dS td}|s7td dS zst|dd	d
}| }W d   n1 sNw   Y  dd| dfdd|  dfg}|}	t	
||}||	krt|dd	d
}|| W d   n1 sw   Y  td|  td|  td|  d W dS td W dS  ty }
 ztd|
  W Y d}
~
dS d}
~
ww )u   
    处理podfile文件，将XXGAppLovinMiddleware相关内容替换为新的名称

    Args:
        new_thirdmiddlewares_name: 新的ThirdMiddlewares项目名称
    z/XXGPlayKitOSDemoN)Podfilepodfiler
   u7   Podfile文件不存在(已尝试 Podfile 和 podfile): XXGAppLovinMiddlewareuC   未找到XXGAppLovinMiddleware的混淆名称，跳过Podfile处理rutf-8encodingztarget 'XXGAppLovinMiddleware'ztarget ''zAproject '\.\./XXGThirdMiddlewares/XXGThirdMiddlewares\.xcodeproj'z project '../XXGThirdMiddlewares/z.xcodeproj'wu   已更新Podfile文件: zXXGAppLovinMiddleware -> z!XXGThirdMiddlewares.xcodeproj -> z
.xcodeproju.   Podfile文件中未找到需要替换的内容u   处理Podfile文件时出错: )r   r   ospathexistsr   get_obfuscated_name_from_logopenreadr   $replace_multiple_patterns_in_contentwrite	Exception)r   podfile_dirpodfile_pathcandidate_namecandidate_pathnew_applovin_namefilecontentpattern_replacementsoriginal_contenter   r   r   r   7   sX   	





r   c                 C   s   t tjpg }|std g t_dS g }|D ]+}t|}|r(|d| d qt| |}|r9|d| d qtd| d q|t_td|  dS )u  
    解析混淆改名后的 XXGThirdMiddlewares.xcodeproj，
    根据 custom_util.exported_lib_names 中登记的原始 Middleware target 名，
    提取对应的混淆后 productName，组装成 lib<混淆名>.a 列表，
    覆盖写回 custom_util.exported_lib_names，供 handle_script 注入 build.sh。

    策略:
    - 改名后原 target 名 'XXGAppLovinMiddleware' 已不存在，
      但每个 Middleware target 都有一个与原名同名的 .m 源文件,
      通过文件名混淆日志反查新名即可得到混淆后的 target/product 名。
    - 若日志缺失，再兜底尝试读取 pbxproj 的 productReference.path。
    u6   没有保留的 Middleware，跳过 .a 白名单提取Nlibz.au   警告: 无法找到 u(    的混淆后名字，白名单将缺失u   需要导出的 .a 白名单: )listr   exported_lib_namesr   r,   append_get_product_name_from_pbxproj)r   original_names	lib_namesoriginalnew_namefallbackr   r   r   r   v   s$   r   c              
   C   sv   z ddl m} tj d|  d}tj|sW dS ||}W dS  ty: } zt	d|  W Y d}~dS d}~ww )uS  
    兜底：从改名后的 XXGThirdMiddlewares pbxproj 中，
    按 productName 的 basename 反查 target 对应的混淆后产品名。
    因为 target 名此时已经是混淆后的随机名，无法直接按 original_target_name 查，
    这里只能做尽量多的匹配（保留给将来扩展），失败返回 None。
    r   )XcodeProjectz/XXGThirdMiddlewares/r   Nu   读取 pbxproj 失败: )
pbxprojrF   r   r   r)   r*   r+   loadr1   r   )r   original_target_namerF   pbx_pathprojectr;   r   r   r   r@      s   
r@   c              
   C   s2  t j d}tj|std|  dS zit|dddO}|D ]D}| }d|  d|v rdd	|v rd|d	}t	|d
krd|d  }|
drd|dd }td|  d|  |  W  d   W S q W d   n1 sow   Y  td|  d W dS  ty } ztd|  W Y d}~dS d}~ww )u   
    从文件名混淆日志中查找原始名称对应的混淆后名称

    Args:
        original_name: 原始名称，如 'XXGAppLovinMiddleware'

    Returns:
        混淆后的名称，如果未找到则返回None
    u   /文件名混淆日志.txtu    文件名混淆日志不存在: Nr#   r$   r%   u   原文件名:z.mu   被修改为:      u   从混淆日志中找到: z -> u   在混淆日志中未找到 u
    的记录u&   读取文件名混淆日志时出错: )r   path_mixr)   r*   r+   r   r-   stripsplitlenendswithr1   )original_namelog_file_pathr7   linepartsnew_filenamerD   r;   r   r   r   r,      s6   

r,   c                 C   s   dg}|st d |S | dkrddddddddd	}nd
ddddddddddd}dd |dD }|D ]<}||v rX|| rX|| }||vrW|| t d| d| d q5||v ri|| sit d| d q5t d| d q5t dd|  |S )u  
    根据用户选择的SDK选项生成需要保留的文档篇章列表

    Args:
        sdk_cn_or_os: '1' 表示国内版，其他表示海外版
        sdk_options: 用户选择的SDK选项字符串，用逗号分隔

    Returns:
        需要保留的篇章名称列表
    u   基础u'   未指定SDK选项，只保留基础篇1 u   巨量CSJu	   穿山甲ShareSDK)u   ShanYanSDK(一键登录)
ShanYanSDKu   BDASignalManager(巨量归因)BDASignalManagerr[   u   CSJ(激励广告)u   ShareSDK(分享)r\   	AppsFlyerFacebookFirebaseAdjustVKAppLovinPoopoADP)r_   r`   ra   rb   u   VK(俄罗斯VK登录)rc   u   AppLovin(Max广告)rd   u   Poopo(渠道)rf   u   ADP(IAA项目)c                 S   s   g | ]}|  qS r   )rP   ).0sdkr   r   r   
<listcomp>  s    z0get_needed_sdks_from_options.<locals>.<listcomp>,u   添加篇章: u    (对应SDK: )zSDK u+    集成在基础篇中，无需额外篇章u   警告: 未找到SDK u    对应的文档篇章u   最终保留的篇章: , )r   rQ   r?   join)r   r   r   sdk_mappingselected_sdksrh   chapter_namer   r   r   r      sN   
r   c           
      C   s   t j d}| d}| d}| dkr|}|}n|}|}tj|r/t| td|  |rdtj|rdt||}|rdt|ddd}|	| W d	   n1 sUw   Y  td
d
|  tj|r|t|}	t| td|  d	S d	S )u  
    处理SDK对接文档

    Args:
        sdk_cn_or_os: '1' 表示国内版，其他表示海外版
        needed_sdks: 需要保留的SDK篇章列表，例如 ['基础', 'Facebook', 'Firebase']
                    如果为None，则保留所有篇章
    u   /SDK对接文档/u/   闲闲SDK-国内版-iOS接入文档（3.0）.mdu/   闲闲SDK-海外版-iOS接入文档（3.0）.mdrY   u   已删除文档: r(   r$   r%   Nu&   已过滤文档篇章，保留的SDK: rl   u   已删除原始Markdown文档: )r   r   r)   r*   r+   remover   filter_sdk_chaptersr-   r0   rm   r   )
r   r   doc_dircn_docos_dockeep_doc
delete_docfiltered_contentr7   	html_filer   r   r   r     s.   





r   c              
   C   s.  z|t | ddd}| }W d   n1 sw   Y  td|}t|dk r/td |W S |d }td	t|d
D ]>}|d	 t|k ry||  }||d	  }d}	|D ]}
|
 | v rcd}	 nqU|	rr||7 }td|  q;td|  q;|W S  t	y } ztd|  W Y d}~dS d}~ww )u   
    根据需要的SDK列表过滤文档篇章

    Args:
        doc_path: 文档路径
        needed_sdks: 需要保留的SDK列表，例如 ['基础', 'Facebook', 'Firebase']

    Returns:
        过滤后的文档内容
    r#   r$   r%   Nz=== \[([^\]]+)\] ===   u6   文档中未找到篇章分隔符，保留原始内容r   rM   rL   FTu   保留篇章: u   移除篇章: u   过滤文档篇章时出错: )
r-   r.   rerQ   rR   r   rangerP   lowerr1   )doc_pathr   r7   r8   chaptersrx   irp   chapter_contentshould_keep
needed_sdkr;   r   r   r   rr   J  s<   
rr   c               
   C   s  t j} tj d}| dkrd}d}nt jdkrd}nd}d}tj}t j}zt|d	d
d}| }W d    n1 s;w   Y  t	t j
pEg }|rZddd |D }	d|	 d}
nd}
dd| dfdd| dfdd| dfdd| dfd|
fg}t||}t|dd
d}|| W d    n1 sw   Y  td|  td| d td| d td| d td| d W d S  ty } ztd|  W Y d }~d S d }~ww )Nz/scripts/build.shrY   XXGPlayKitCNDemou	   国内版TzXXGPlayKitOSDemo-PodsXXGPlayKitOSDemou	   国际版r#   r$   r%    c                 s   s    | ]	}d | d V  qdS )"Nr   )rg   namer   r   r   	<genexpr>  s    z handle_script.<locals>.<genexpr>zEXPORTED_LIBS=(rk   zEXPORTED_LIBS=()zSDK_NAME="[^"]*"z
SDK_NAME="r   zSDK_VERSION="[^"]*"zSDK_VERSION="vzCN_OR_OS="[^"]*"z
CN_OR_OS="zSCHEME_NAME="[^"]*"zSCHEME_NAME="zEXPORTED_LIBS=\([^)]*\)r(   u   已更新脚本文件: u   处理脚本文件时出错: )r   r   r   r   r   r   sdk_versionr-   r.   r=   r>   rm   r   r/   r0   r   r1   )r   script_pathproject_namecn_or_os_textsdk_namer   r7   r8   rB   libs_strexported_libs_liner9   r;   r   r   r   r     sR   

r   )N)ObjectiveC.oc_customr   r   
ObjectiveCr    ObjectiveC.oc_custom.custom_filer   &ObjectiveC.oc_custom.custom_md_to_htmlr   r   r   r)   r{   r	   r   r   r   r@   r,   r   r   rr   r   r   r   r   r   <module>   s&    (?&)
A0;