当前位置: 首页 > 工具软件 > Go UI > 使用案例 >

Android的soog_ui的调试(go语言)

董俊
2023-12-01

1 .源码

soog_ui程序的源码的位置在:build/soong/cmd/soong_ui目录下,有main.go和Android.bp。

2. Go基础

2.1 变量声明

变量名在左,类型在右
var config build.Config

2.2 包引用

在main.go函数中引用build包,build中Config类型的定义。

 15 package main                                                                    
 16                                                                                 
 17 import (                                                                        
 18         "context"                                                               
 19         "flag"                                                                  
 20         "fmt"                                                                   
 21         "os"                                                                    
 22         "path/filepath"                                                         
 23         "strconv"                                                               
 24         "strings"                                                               
 25         "time"                                                                  
 26                                                                                 
 27         "android/soong/ui/build"                                                
 28         "android/soong/ui/logger"                                               
 29         "android/soong/ui/tracer"                                               
 30 )  

78         var config build.Config                                       
 79         if os.Args[1] == "--dumpvars-mode" || os.Args[1] == "--dumpvar-mode" {  
 80                 config = build.NewConfig(buildCtx)                              
 81         } else {                                                                
 82                 config = build.NewConfig(buildCtx, os.Args[1:]...)              
 83         }  

在文件build/soong/ui/build/config.go中

 15 package build                                                                   
 16                                                                                 
 17 import (                                                                        
 18         "io/ioutil"                                                             
 19         "log"                                                                   
 20         "os"                                                                    
 21         "path/filepath"                                                         
 22         "runtime"                                                               
 23         "strconv"                                                               
 24         "strings"                                                               
 25         "time"                                                                  
 26                                                                                 
 27         "android/soong/shared"                                                  
 28 )   

 30 type Config struct{ *configImpl }                                               
 31                                                                                 
 32 type configImpl struct {                                                        
 33         // From the environment                                                 
 34         arguments []string                                                      
 35         goma      bool                                                          
 36         environ   *Environment                                                  
 37                                                                                 
 38         // From the arguments                                                   
 39         parallel   int                                                          
 40         keepGoing  int                                                          
 41         verbose    bool                                                         
 42         checkbuild bool                                                         
 43         dist       bool                                                         
 44         skipMake   bool                                                         
 45                                                                                 
 46         // From the product config                                              
 47         katiArgs     []string                                                   
 48         ninjaArgs    []string                                                   
 49         katiSuffix   string                                                     
 50         targetDevice string                                                     
 51 }  
 ....
350 func (c *configImpl) Arguments() []string {                                                                                                                                                             
351         return c.arguments                                                      
352 } 

在15行声明了是build包,在30行声明个Config结构,在32行定义这个结构。
如果想访问Config中的arguments成员,通过Arguments()函数,而不是直接访问arguments成员。

2.3 打印

打印信息使用fmt.Fprintln函数,在85行中,使用Arguments()函数打印config中的arguments变量。

 78         var config build.Config                                                                                                                                                                         
 79         if os.Args[1] == "--dumpvars-mode" || os.Args[1] == "--dumpvar-mode" {  
 80                 config = build.NewConfig(buildCtx)                              
 81         } else {                                                                
 82                 config = build.NewConfig(buildCtx, os.Args[1:]...)              
 83         }                                                                       
 84                                                                                 
 85         fmt.Fprintln(os.Stderr, "tom 4=",config.Arguments());   

3. soong_ui生成与运行

在lunch()—>build_build_var_cache()—>soong_ui.bash

 574 function lunch()                                                                                         
 575 {                                                                                                        
 576     local answer 
 ....
  622     TARGET_BUILD_VARIANT=$variant \                                             
 623     TARGET_PLATFORM_VERSION=$version \                                          
 624     build_build_var_cache  
 }

  47 function build_build_var_cache()                                                                         
  48 {                                                                                                        
  49     local T=$(gettop)                                                                                    
  50     # Grep out the variable names from the script.                                                       
  51     cached_vars=`cat $T/build/envsetup.sh | tr '()' '  ' | awk '{for(i=1;i<=NF;i++) if($i~/get_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
  52     cached_abs_vars=`cat $T/build/envsetup.sh | tr '()' '  ' | awk '{for(i=1;i<=NF;i++) if($i~/get_abs_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
  53     # Call the build system to dump the "<val>=<value>" pairs as a shell script.
  54     build_dicts_script=`\builtin cd $T; build/soong/soong_ui.bash --dumpvars-mode \
  55                         --vars="$cached_vars" \                                                          
  56                         --abs-vars="$cached_abs_vars" \                         
  57                         --var-prefix=var_cache_ \                                                        
  58                         --abs-var-prefix=abs_var_cache_`  
  }

soong_ui.sh的内容如下:

 55 soong_build_go soong_ui android/soong/cmd/soong_ui                              
 56                                                                                 
 57 cd ${TOP}                                                                       
 58 exec "$(getoutdir)/soong_ui" "$@"   

在55行中,编译main.go成soong_ui,在58行中执行soong_ui。

4. 调试方法

在main.go添加debug信息,然后执行lunch命令,就可以Debug soong_ui。

5. dumpvars.go调试

在dumpvars.go中,想通过mt.Fprintln(os.Stderr, “tom--------11112222”);需要"fmt"和"os"两个包,只需要添加os包就可以了。

 17 import (                                                                        
 18         "bytes"                                                                 
 19         "fmt"                                                                   
 20         "strings"                                                               
 21         "os"                                                                    
 22 )     

fmt.Fprintln(os.Stderr, "tom--------11112222");

说明:
1)加入包"os",同时要使用这个包,使用语句fmt.Fprintln(os.Stderr, “tom--------11112222”);.
2)fmt.Printf("")语句,在lunch的终端无法显示。

 类似资料: