Page 314 - 《软件学报》2024年第6期
P. 314

2890                                                       软件学报  2024  年第  35  卷第  6  期


                                                     com.bumptech.glide



                                  disklrucache     load           provider      request


                                  data    engine                resource   animation  target


                           bitmap_recycle  cache  executor  prefill  bitmap  bytes  drawable  file  gif
                                                     (a) 缺省的包结构树

                                                   com.bumptech.glide (AAA)


                                         load (A)             request (B)  disklrucache (C)  provider (D)



                              resource (A)           engine (B)  data (C)  animation (A)  target (B)

                   bitmap (A)  bytes (B)  drawable (C)  file (D)  gif (E)  bitmap_recycle (A)  cache (B)  executor (C)  prefill (D)
                                                    (b) 整形后的包结构树
                                             图 3 glide-3.8.0  的  LRP  对应的包结构树

                                                         arp 对应的  TPL  的判定转化为对它们的包结构树相似性分析
                    对于给定的根包对       < arp,lrp > , 关于  lrp 是否为
                 问题, 本文提出了一种基于包结构树的候选              TPL  识别方法, 综合利用了根包对应的包结构树蕴含的                3  种信息, 即
                 包名、包结构和包结构树签名, 来快速识别候选               TPL, 如算法  2  所示. 算法第  3  行通过两个根包的包名和包结构树

                 签名进行筛选, 若包名和包结构树签名均相同, 则表明                arp 源自于  lrp , 加入候选列表; 否则算法第     6–8  行引入包结
                 构相似度的概念度量两个根包的包结构树相似性, 如定义
                                                               所示.
                                                             6
                 算法  2. 基于包结构树的候选      TPL  识别方法.
                 输入:   arp , TPL = {  lrp ,...,lrp ,...,lrp  };
                                  1     i    n
                 输出: candidate TPLs:   list .
                 1. sortedList = null;

                 2. for   i ← 0  to n do
                                                                           (  )
                 3.   if( isPackageNameMatch(  arp,lrp  ) && isSiganatureMatch(  Sig (arp),Sig  lrp   ) ) // 包名和包结构树签名均匹配
                                            i                    pst      pst  i
                                         lrp ,1 ); // 1 表示相似性度量值, 取值范围  0–1
                 4.    list  = addLRPtoCandidate(
                                           i
                 5.   else
                              (     )
                 6.         sim = sim pss arp,lrp   ;
                                    i
                 7.       if   sim > 0  then
                 8.           list  = addLRPtoCandidate(  lrp ,sim ); // 包结构树中子包匹配个数
                                             i
                 9.       end if
                 10.   end if
                 11. end for
                 12. sortInDescending(  list );
                 13. return   list ;
   309   310   311   312   313   314   315   316   317   318   319