• 本文介绍了DDMS中 Dump View Hierarchy for UI Automator 工具的使用方法,通过该工具找到一些应用的布局,快速定位我们需要修改源码位置。本文修改了下拉通知栏宽度。

    最近项目需要修改下拉通知栏面板的宽度,完成后,写个Blog做个总结,也提供给需要的开发人员参考。


    本文介绍了DDMS中 Dump View Hierarchy for UI Automator 工具的使用方法,通过该工具找到一些应用的布局,快速定位我们需要修改的源码位置。

    1 先看下效果图

    修改前,横屏状态的下拉通知栏,距离屏幕左右两边还有段距离。(模拟器中的截图,Android原生的状态)
    修改前

    修改后,横屏状态的下拉通知栏,宽度铺满屏幕。(真实设备截图, 修改后刷机效果)
    修改后

    2 找到这部分的相关布局。

    SystemUI下拉通知栏的布局为super_status_bar.xml
    super_status_bar.xml

    代码如下

    <!-- This is the combined status bar / notification panel window. -->
    <com.android.systemui.statusbar.phone.StatusBarWindowView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    
        <com.android.systemui.statusbar.BackDropView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="gone"
                >
            <ImageView android:id="@+id/backdrop_back"
                       android:layout_width="match_parent"
                       android:scaleType="centerCrop"
                       android:layout_height="match_parent" />
            <ImageView android:id="@+id/backdrop_front"
                       android:layout_width="match_parent"
                       android:layout_height="match_parent"
                       android:scaleType="centerCrop"
                       android:visibility="invisible" />
        </com.android.systemui.statusbar.BackDropView>
    
        <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:importantForAccessibility="no" />
    
        <include layout="@layout/status_bar"
            android:layout_width="match_parent"
            android:layout_height="@dimen/status_bar_height" />
    
        <FrameLayout android:id="@+id/brightness_mirror"
                     android:layout_width="@dimen/notification_panel_width"
                     android:layout_height="wrap_content"
                     android:layout_gravity="@integer/notification_panel_layout_gravity"
                     android:paddingLeft="@dimen/notification_side_padding"
                     android:paddingRight="@dimen/notification_side_padding"
                     android:visibility="gone">
            <FrameLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:elevation="2dp"
                    android:background="@drawable/brightness_mirror_background">
                <include layout="@layout/quick_settings_brightness_dialog"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content" />
            </FrameLayout>
        </FrameLayout>
    
        <com.android.systemui.statusbar.phone.PanelHolder
            android:id="@+id/panel_holder"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/transparent" >
            <include layout="@layout/status_bar_expanded"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="gone" />
        </com.android.systemui.statusbar.phone.PanelHolder>
    
        <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_in_front"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:importantForAccessibility="no" />
    
    </com.android.systemui.statusbar.phone.StatusBarWindowView>
    

    几个关键的字眼:
    | “@layout/status_bar” --------------> 状态栏
    | “@+id/brightness_mirror” --------> 下拉通知栏中调节亮度时,只剩下亮度调节弹出框,位置与下拉通知栏亮度调节位置一样的。
    | “@+id/panel_holder”--------------->下拉通知栏载体
    | “@layout/status_bar_expanded”->下拉通知栏布局

    super_status_bar.xml包含了状态栏,下拉通知栏等布局

    3 找到下拉通知栏相关布局

    通过 DDMS 的 Dump View Hierarchy for UI Automator 工具,我们可以抓取一些布局的ID。
    Dump View Hierarchy for UI Automator

    -3.1 header

    通知栏上半部分是 com.android.systemui:id/header,那我们在SystemUI的res中,搜索这个**“header”** 。
    找到布局ID为header

    搜索到layout中带有header的,有status_bar_expanded_header.xml,只有这个布局有这个ID

    <com.android.systemui.statusbar.phone.StatusBarHeaderView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:systemui="http://schemas.android.com/apk/res-auto"
        android:id="@+id/header"
        android:layout_width="@dimen/notification_panel_width"
        android:layout_height="@dimen/status_bar_header_height"
        android:layout_gravity="@integer/notification_panel_layout_gravity"
        android:paddingStart="@dimen/notification_side_padding"
        android:paddingEnd="@dimen/notification_side_padding"
        android:baselineAligned="false"
        android:elevation="4dp"
        android:background="@drawable/notification_header_bg"
        android:clickable="true"
        android:focusable="true"
    
    

    如果需要修改header的尺寸,可将

    android:layout_width="@dimen/notification_panel_width"
    

    修改为

    android:layout_width="match_parent"
    

    重新编译,这个header的宽度就和屏幕一样了。

    -3.2 scroll_view

    可上下滑动的快捷开关布局。
    scroll_view

    上图所示的布局代码如下

    <com.android.systemui.statusbar.phone.ObservableScrollView
         android:id="@+id/scroll_view"
         android:layout_width="@dimen/notification_panel_width"
         android:layout_height="match_parent"  
         android:layout_gravity="@integer/notification_panel_layout_gravity" 
         android:scrollbars="none" 
         android:overScrollMode="never" 
         android:fillViewport="true">
    

    将宽度属性改成:

    android:layout_width="match_parent"
    

    -3.3 notification_stack_scroller

    通知列表布局
    通知列表

    上图所示的布局代码如下

    <com.android.systemui.statusbar.stack.NotificationStackScrollLayout           
    android:id="@+id/notification_stack_scroller"           
    android:layout_width="@dimen/notification_panel_width"           
    android:layout_height="match_parent"  
    android:layout_gravity="@integer/notification_panel_layout_gravity"           
    android:layout_marginBottom="@dimen/close_handle_underlap"           
    android:importantForAccessibility="no" />
    

    宽度属性改成:

    android:layout_width="match_parent"
    

    4 重新编译,打包ROM

    make源码,重新刷机查看效果,可以看到文章开头的gif图所示的效果


    感谢阅读,如果觉得对您有帮助的话,请点个赞,顶一个。谢谢。

    展开全文
  • 想通过修改android源码实现系统root,不知道该如何修改android系统是4.4.2的? 另外我在网上找资料都说修改su代码进行setuid和setgid就可以了,但是我都是失败的,是我理解错了吗,求大神指教以下,谢谢!
  • Android系统定制源码修改 - MTK平台  1.修改开机弹出欢迎使用SIM  \frameworks\base\packages\Keyguard\src\com\mediatek\keyguard\Telephony\KeyguardDialogManager.java

                                         Android系统定制源码修改 -  MTK平台


     1.修改开机弹出欢迎使用SIM

         MTK工程/mediatek/packages/apps/Stk1/src/com/android/stk/StkAppService.java

           (\frameworks\base\packages\Keyguard\src\com\mediatek\keyguard\Telephony\KeyguardDialogManager.java)


           case DISPLAY_TEXT:

    省略...

    //显示SIM卡信息

    launchTextDialog(slotId);

    break;


    2.关闭通知栏通能

    \frameworks\base\core\java\android\app\NotificationManager.java


       /**
         * Post a notification to be shown in the status bar. If a notification with
         * the same id has already been posted by your application and has not yet been canceled, it
         * will be replaced by the updated information.
         *
         * @param id An identifier for this notification unique within your
         *        application.
         * @param notification A {@link Notification} object describing what to show the user. Must not
         *        be null.
         */
        public void notify(int id, Notification notification)
        {
       
    boolean close=false;
        if(close)

       
    {
              notify(null, id, notification);
       
    }
         }


    3.MTK 开机LOGO

    Android内核开机LOGO:logomediatek/custom/common/uboot/logo

    Android系统开机logo:/mediatek/custom/common/lk/logo

    logo_folder:定义在..\mediatek\config\XXXX\ProjectConfig.mk中 BOOT_LOGO=wsvganl


    4.Android frameworks去掉熄屏前先变暗的功能

    设置>显示:这里可以设置自动休眠超时时间。

    当设置为30s时,到24s左右屏幕会先变暗,告知用户屏幕快熄灭了,6s以后才会真正熄屏。


    现在需要去掉这个功能,在PowerManagerService里可以看到:

        private int getScreenDimDurationLocked(int screenOffTimeout) {
            return Math.min(SCREEN_DIM_DURATION,
                    (int)(screenOffTimeout * MAXIMUM_SCREEN_DIM_RATIO));
        }
    

    30S是系统里最短的超时时间,也就是说其他screenOffTimeout乘以0.2是比6要大的,所以就不用考虑了。

    要想去掉DIM这个Feature,直接把SCREEN_DIM_DURATION设为0,这样getScreenDimDurationLocked()的返回值也就是0,这样就不再有屏幕先变暗这个步骤了。

    实测可行。

    (取自:http://blog.csdn.net/zhoumushui/article/details/51443492)

    5.调整Android的默认亮度

    调整手机的默认亮度,我们只需要修改frameworks\base\packages\SettingsProvider\res\values\defaults.xml文件中的def_screen_brightness值。

    如想把手机的默认亮度调整为90%,则

    修改之前

       <integer name="def_screen_brightness">102</integer> 

    修改之后

       <integer name="def_screen_brightness">230</integer> 

    注意全亮是255。因此,255*90=29.5,对29.5取整就是230


     <!-- Default screen brightness, from 0 to 255.  102 is 40%. -->屏蔽掉下拉通知栏和状态栏


    6.屏蔽掉下拉通知栏和状态栏

    ..\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarView.java


        @Override
        public void addPanel(PanelView pv) {
            super.addPanel(pv);
    //        if (pv.getId() == R.id.notification_panel) {
    //            mNotificationPanel = pv;
    //        } else if (pv.getId() == R.id.settings_panel){
    //            mSettingsPanel = pv;
    //        }
            pv.setRubberbandingEnabled(!mFullWidthNotifications);
        }


    7.默认配置

    1.gps 默认是打开的,有些产品需要默认关闭,主要是为了省电。

          修改:

                   /frameworks/base/packages/SettingsProvider/res/values/defaults.xml

                 将:

                      <string name="def_location_providers_allowed" tanslatable="false">gps</string>

                     改为:

                     <string name="def_location_providers_allowed" tanslatable="false"></string>

    2.修改系统默认时间。

         修改

              rtc-mt6573.h  cust_rtc.h 这是四个文件,将里面的时间改为自己需要的时间。(这个是我在mtk6573的代码上看到这么修改的,具体在android原生态代码,我还没用看)

    3.修改设备默认名字。

          修改:

             build/tools/buildinfo.sh 在这个文件里面修改,具体修改那些项,我就不在这了说了。

    4.修改系统默认时区及默认语言

           修改:

               build/tools/buildinfo.sh在这个文件的最后一行的前面添加以下代码:

                         echo "persist.sys.language=zh"
                         echo "persist.sys.country=CN"
                         echo "persist.sys.localevar="
                         echo "persist.sys.timezone=Asia/Shanghai"
                         echo "ro.product.locale.language=zh"
                         echo "ro.product.locale.region=CN"

     

    5.修改屏幕默认休眠时间:

       

    在frameworks/base/packages/SettingsProvider/res/values/default.xml


    会看到下面的代码:

    <integer name="def_screen_off_timeout">60000</integer>

    数字的单位是毫秒,可以修改为 10分钟,15分钟,或30分钟。


    6.默认关闭usb debug

    在packages/apps/Provision/src/com/android/provision/DefaultActivity.java

    在这个里面的oncreate方法里面添加:

     Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0);  /0代表关闭,1代表打开



    7.mtk修改默认字体大小 

    在frameworks/base/core/java/android/content/res/Configuration.java

     public void setToDefaults()里面的

    fontScale = 1.10f;    1代表默认的大小,1.10f代表大,1.15代表超大


    8.深度配置

    1. *#06#等关键码判断文件

    SpecialCharSequenceMgr.java

    2.音效
    ControlPanelEffect.java
    3.版本号修改
    bulid/core/build_id.mk
    4.默认墙纸修改
    framework/base/core/res/res/ drawable-nodpi/default_wallpaer.jpg
    5.其他墙纸修改
    package/apps/Launcher2/res/drawable-nodpi/ wallpaper_01.jpg
    6.音频参数调整
    mediatek/custom/commin/cgen/inc/audio/mt6575_phone/audio_volume_custom_default.h
    mediatek/custom/commin/cgen/inc/audio_volume_custom_default.h

    7.机器型号直接修改
    build/tools/buildinfo.sh
    #ro.product.model = 公司内部手机名
    #ro.product.name = 手机正式名称
    #ro.product.device = 采用的设备名称
    #ro.product.board = 采用的处理器
    #ro.build.product = 旧代码,等同于设备名称
    #ro.custom.build.version = 编译版本号

    8.公司基本命令修改
    target_build.sh   usr_build.sh 注意修改相关机型名

    9.主make文件常用配置
         a.  语言
              mediatek/config/ pd715/ProjectConfig.mk
              #MTK_PRODUCT_LOCALES=zh_CN en_US es_ES zh_TW  #什么语言放在前面就是默认什么语言
          b.输入法
              DEFAULT_INPUT_METHOD=com.sohu.inputmethod.sogou.SogouIME
              MTK_LATINIME_SUPPORT = yes#开启yes 搜狗输入法不起作用,开启no搜狗输入法起作用.
              MTK_INPUTMETHOD_PINYINIME_APP = yes#用搜狗输入法,一般no
           c.通话3秒自动屏灭
              CUSTOM_NO_INCALL_SCREEN_OFF = yes
           d.全局宏定义
              AUTO_ADD_GLOBAL_DEFINE_BY_NAME
           e.开关机logo定义目录
              BOOT_LOGO =  pda700
            f.来电归属地
               MTK_PHONE_NUMBER_GEODESCRIPTION = yes
             e.重力传感器
                    MTK_ACCELEROMETER_SUPPORT = yes

    10.常用缺省配置文件
              framework/base/packages/SettingsProvider/res/values/defaults.xml
              a.屏灭时间  def_screen_off_timeout    60000(60s)  -1(永不)
              b.缺省时间格式 time_12_24
              c.背光等级 def_screen_brightness
              d: 屏幕切换 def_accelerometer_rotation

    11.字体,字库更换
    framworks/base/data/fonts/ DroidSansFasllback.ttf

    12.如果现实有误,除字库外需要注意的地方是安卓字型相关解析
    external\harfbuzz\src\ harfbuzz-myanmar.c

    13.蓝牙一般修改
         a .去掉wireless input  
              删除 <category android:name="android.intent.category.LAUNCHER" />
         b.蓝牙设备默认名称修改
              framworks\base\core\jni\Android_bluetooth_common.h
              #define BTMTK_ANDROID_DEFAULT_LOCAL_NAME "ANDROID BT"
          c. buluetooth HostName(蓝牙改名)
              mediateck/config/common/custom.conf
              bluetooth.HostName =  VENERA 907       
      
    14.桌面默认缺省修改
              package/apps/Launcher2/res/ xml_sw600dp/default_workspace.xml
               launcher:packageName=" com.google.android.youtube
               launcher:className=" com.google.android.youtube.HomeActivity"

    15.内存容量大小
               mediatek/build/tools/ptgen/ MT6575/partition_table_MT6575.xls

    16.Music参数位置修改
               packages/apps/MusicFX/src/com/musicfx/ControlPanelEffect.java

    17.铃声修改
              frameworks/base/data/sounds/ AudioPackage2.xml
              指定拷贝方式

    18.全局系统配置
                mediatek/config/ pd700/system.prop
            a.默认时区修改
                persist.sys.timezone = Asia/Shanghai
             b.设置向导默认关闭
                 ro.setupwizard.mode=DISABLED
             c.屏幕分辨率
                 ro.sf.lcd_density=160

    19.开关机动画
             verdor/mediatek/ pd700/artifacts/out/target/product/ pd700/system/media/bootanimation.zip
              verdor/mediatek/ pd700/artifacts/out/target/product/ pd700/system/media/shutanimation.zip

    注意关机动画和关机铃声需要在 system.pro 加入 ro.operator.optr=CUST

    20.开关机铃声
            verdor/mediatek/ pd700/artifacts/out/target/product/ pd700/system/media/bootaudio.mp3
            verdor/mediatek/ pd700/artifacts/out/target/product/ pd700/system/media/shutaudio.mp3
          并确认frameworks/base/core/java/com/android/internal/app/ShutdownThread.java 中 283行 mShutOffAnimation 的初始值为true

    21.缺省提示/闹钟/ring铃声
         build/target/product/core.mk
       ro.config.notification_sound= Proxima.ogg \ 
        ro.config.alarm_alert= Alarm_Classic.ogg \ 
        ro.config.ringtone= Elves.mid

    22.工程指令修改等
       mediatek/packages/apps/EngineerMode/src/com/mediatek/engineermode/EngineerModeRecevier.java
       mediatek/packages/apps/FactoryMode/src/com/mediatek/factorymode/FactorymodeReceiver.java

    23.输入法布局相关修改
        package/inputmethods/LatinIME/java/res/下
         
    24.WAP相关
         a.wap主页不显示导航以及yahoobookmark
              packages/apps/Bcore\mt_devs.c
    开启宏 CONFIG_MTK_USB_UNIQUE_SERIALrowser/src/com/android/browser/BrowserFeatureOption.java

    25.uboot logo
              mediatek\custom\common\lk\logo\ pda700_wsvga\pda700_wsvga_kernel.bmp
    (./mk r dr  >> system.img) 
              mediatek\custom\common\lk\logo\ pda700_wsvga\pda700_wsvga_uboot.bmp
    (./mk uboot >> logo.bin) 

    26.开机默认时间
    framework/base/services/java/com/android/server/NetworkTimeUpdateService.java //自动校时修改
    cust_rtc.h 
    rtc-mt6575.h(跟平台对应文件)文件中 

    27.手机唯一SN显示
         mediatek\platform\mt6577\kernel\

    28.默认字体大小
         frameworks\base\core\java\android\content\res\Configuration.java
         public void setToDefaults()
         fontScale = 1.10f; 1代表默认的大小,1.10f代表大,1.15代表超大// 不一定,高分辨率0.9是normal
         在/system/build.prop文件里面加入


         ro.sys.def_font_scale = ?(值可以设置成如:100, 130)

         PS:ro.sys.def_font_scale = 130,即fontScale = 1.3时,相应的字体大小为“大”。 

    Settings中系统的字体大小,在/packages/apps/Settings/res/values/arrays.xml 或者 values-sw600dp等文件中的  
    arrays.xml ”entryvalues_font_size”这个tag中分别有定义对应的数值,  
    Small:0.9    
    Normal:1.0  
    Large:1.1  
    Extra Large:1.15   

    600dp不同

    29.plmn
       mediatek\frameworks\base\telephony\etc\spn-conf.xml

    30.时间格式修改
    frameworks\base\core\res\res\values\donottranslate-cldr.xml 
    <string name="numeric_date_format">M/d/yyyy</string> //不同语言不同目录,不同格式 

    31.默认音量修改
    frameworks\base\media\java\android \media\AudioManager.java
    修改DEFAULT_STREAM_VOLUME 数组 

    32.pa修改( modem 
    mediatek\custom\common\modem下目录
    ProjectConfig.mk内指定目录 如 CUSTOM_MODEM=pd775_hspa

    33. 修改移动数据开关默认状态

    \frameworks\base\services\java\com\android\server\ConnectivityService.java
      public boolean getMobileDataEnabled() {
            enforceAccessPermission();
            boolean retVal = Settings.Secure.getInt(mContext.getContentResolver(),
                  //  Settings.Secure.MOBILE_DATA, 1) == 1;//数据开关默认打开
                  Settings.Secure.MOBILE_DATA, 0) == 1; //add by boardcon 数据开关默认关闭
            if (DBG) Slog.d(TAG, "getMobileDataEnabled returning " + retVal);
            return retVal;
        } 

    mtk只需要修改make,MTK_DEFAULT_DATA_OFF=yes

    34.分区修改

      A 修改分区文件mediatek\build\tools\ptgen\partition_table.xls

      B 修改分区头文件mediatek\custom\project\common\partition_define.h


    35. 默认照片修改,驱动层修改无效?原因未知
    packages\apps\Camera\src\com\android\camera\CameraSetting.java
    initialCameraPictureSize 函数中
    修改为
    if(candidate.equals("640x480"))
       {
                     SharedPreferences.Editor editor = ComboPreferences
                          .get(context).edit();
                    editor.putString(KEY_PICTURE_SIZE, candidate);
                    editor.apply();
                    return;
        } 
     
    36.logo
    mediatek\custom\common\uboot\logo\ 

    37.版本号时间自动按时间生成方法
    echo "ro.custom.build.version=P730-G-tab-4G-`date +%Y%m%d-%H:%M`" 

    38. android 如何修改MTP在PC端显示的制造商信息
    1. 修改build/tools/buildinfo.sh中的 ro.product.manufacturer
    2.frameworks\av\media\mtp\MtpServer.cpp 的doGetDeviceInfo()
    property_get("ro.product.manufacturer", prop_value, "unknown manufacturer");
    string.set(prop_value);
    修改此处的prop_value

    39. 72 factory mode 字体变大问题

    此现象只在6572平板项目中,非平板是正常的。。
    修改了font.mk中
    ifeq ($(LCM_WIDTH),800)
            LOCAL_CFLAGS += -DFEATURE_FTM_FONT_24x44
    改成
              LOCAL_CFLAGS += -DFEATURE_FTM_FONT_16x28
    即可,如果想方便平板和非平板的维护,加个平板控制宏就好 

    40. 72开关机动画
    mediatek/operator/OP02/prebuilt/bootanim/bootanimation

      ??

    41.修改按键唤醒配置
    mediatek/config/m709/mtk-kpd.kl

    42. exif
    照片信息里面加入的头文件信息
    extractExifInfo 

    43.默认动态壁纸
    framework/base/core/res/res/values/config.xml
    原来:
    <string name="default_wallpaper_component">@null</string>  
    现在:
    <string name="default_wallpaper_component" translatable="false">com.android.wallpaper/com.android.wallpaper.grass.GrassWallpaper</string>    
    如:
    com.android.wallpaper 在 AndroidManifest 文件中的 packagename,
    com.android.wallpaper.grass.GrassWallpaper 在 AndroidManifest 文件中的 service name
    需要注意的是:静态的图片壁纸和动态壁纸是两个不同的系统,加载的时候是完全两套机制,
    静态图片通过 launcher 里面的一个 xml 文件配置来管理系统默认静态壁纸,
    动态壁纸则是通过 intent 机制向系统搜寻所有匹配 Activity,
    所以,这里的默认值为 null,而不是那个系统默认静态壁纸的地址,系统是读 config.xml 文件的设置。
    若为 null 才继续查找静态壁纸配置内容。设置之后没有效果的话,恢复下出厂设置即可。
    另外将需要用到第三方动态壁纸,提前预置到sytem/app中; 
    44. 第一次开机会走的文件(恢复出厂设置也会走)
    packages/apps/Provision/src/com/android/provision/DefaultActivity.java
    在这个里面的oncreate方法里面添加需要处理第一次开机配置

    45.系统启动默认值修改
    如果想修改系统启动后加载的默认值

    修改SettingsProvider默认值,Settings能够配置Android系统的各种设置,这些设置的默认值都是由frameworks中的SettingsProvider从数据库中读取的,那么第一次开机的时候这些数据都是从哪儿来的呢?

    frameworks/base/packages/SettingsProvider/res/values/defaults.xml

    这个文件就是用来存储Android系统的默认设置

    例如:

    <integername="def_screen_off_timeout">600000</integer>设置关屏超时时间的默认值

    <integername="def_screen_brightness">102</integer>设置亮度的默认值

    <boolname="def_install_non_market_apps">false</bool>设置是否允许安装非Market应用程序的默认值

    如果想定义defaults.xml中没有的,在这里添加后,需修改

    frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java,加入自己的存储代码。




    展开全文
  • 一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常调试了。这里进行一些总结和分享。 Android源码到模拟器运行,主要有的四个步骤: 下载源码 搭建编译环境 准备...

    一直想下载、编译、调试一下Android源码 ,加强对一些framework的理解,搞了好多次,终于可以正常调试了。这里进行一些总结和分享。

    Android源码到模拟器运行,主要有的四个步骤:

    1. 下载源码
    2. 搭建编译环境
    3. 准备编译

    我使用的环境是Ubuntu16.04 、openJDK8、Android 8.0.0

    硬件软件要求

    官方文档:要求

    硬件要求:

    • 如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
    • 如果要检出代码,至少需要 250GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
    • 如果在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。

    我的电脑是双系统,ubuntu 空间划分不集中,分区空间不够,导致编译失败。我在实践过程中,发现不需要官方声明的那么多空间,下载初始化包.repo 40G左右,检出代码(Android 8.0.0),又占用了40G左右,编译用了60G左右。总共算下来160G的分区空间应该是够用了。

    一、 下载源码

    Android 源码是非常庞大的,而且每个模块都是用git来进行管理 ,整个Android源码是由很多个git项目构成,Google对Android代码的更新也是更新到相应模块的git项目上。

    那对于需要编译Android的开发者来说,要分别clone 每个git项目而且还要放到固定的位置确实是件惨绝人寰的事,所以Google就开发了一个基于Python编写的帮助开发者管理多个项目的工具,这个工具就叫repo,repo就是封装了git命令的python脚本。

    由于国内网络的原因,我们使用国内的清华源下载源码和repo工具

    1.1、下载repo

    下面的命令,是从清华源下载repo工具,这样脚本中的路径就是指向清华源的aosp

    mkdir ~/bin   # 在home下创建bin文件夹
    PATH=~/bin:$PATH   # 把bin文件夹加入环境变量的
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo  > ~/bin/repo #下载repo脚本
    chmod a+x ~/bin/repo #添加权限
    

    repo 工具讲解

    我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,…Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:

    在这里插入图片描述

    项目Pre进行分库的好处就是,只需要创建需要开发的模块分支,代码量减少了很多。检出的时候也可以只检出某一模块的代码。

    会遇到这么一个问题:如果我们想要创建Pre分支来做feature开发,这就意味着,我们需要到每个子项目中分别创建对应的分支,这个过程如果纯粹靠手工做,那简直是个灾难,于是会写个自动化处理程序(我们假设这个工具叫做RepoUtil)来帮助我们解决这个问题。这个RepoUtil也会有版本管理之类的需求,因此我们也用Git对其管理,并为其创建对应的仓库。此时整个项目的结构如下:

    在这里插入图片描述

    这里RepoUtil知道整个项目Pre下的每个子项目(即维护子项目的列表),同时提供对这些子项目的管理功能,比如统一创建分支等。但是从"单一职责"角度来看,RepoUitl这个工具的功能过于复杂,我们完全可以将维护子项目列表这个功能抽取出来作为一个新项目sub_projects,因为子项目也会变化。因此,为其创建对应的仓库,并用Git管理,RepoUtil只需要通过简单的对ub_projects进行依赖即可,此时整个项目的结构如下:
    在这里插入图片描述

    AOSP项目结构

    • .repo工具对应RepoUtil
    • mainfest对应sub_projects

    在mainfest文件夹中,执行git branch -a 就可以看到所有的分支

    1.2、下载源码

    下载源码有两种方法:

    1)Android 官方下载源代码

    官方文档:下载源代码

    2)使用初始化包(建议)

    初始化包每月都会进行更新,由于首次同步需要下载约 30GB 数据,如果上面的方法,过程中任何网络故障都可能造成同步失败,我第一次是使用官方的方法,失败过一次。后来都是用这个方法。

    下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

    由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

    使用方法如下:

    wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
    tar xf aosp-latest.tar
    cd AOSP   # 解压得到的 AOSP 工程目录
    # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.1_r1 # 可选命令,指定版本,如果未指定,则使用最新的版本
    repo sync # 正常同步一遍即可得到完整目录
    # 或 repo sync -l 仅checkout代码
    

    Android各版本列表:https://source.android.google.cn/setup/start/build-numbers.html#source-code-tags-and-builds

    二、搭建编译环境

    官方文档:搭建编译环境

    安装openJDK8

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    

    安装软件包

    官方文档没有介绍Ubuntu 16.04所需的软件包。使用Ubuntu 16.04的小伙伴,需要安装下面的软件

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential  
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
    sudo apt-get install libc6-dev-i386 
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache
    
    

    三、准备编译

    设置环境

    使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

    source build/envsetup.sh
    

    或者

    . build/envsetup.sh
    

    选择目标

    使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。

    lunch aosp_arm-eng
    

    直接运行 lunch (没有参数),会列出所有支持的类型,输入对应的序号来进行选择。
    在这里插入图片描述

    所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

    编译类型 使用情况
    user 权限受限;适用于生产环境
    userdebug 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型
    eng 具有额外调试工具的开发配置

    源码编译

    您可以使用 make 编译任何代码。GNU make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -j32 之间的命令。

    make -j4
    

    如果编译完一个版本后想重新编译一个,可以使用 make clobber清除之前编译生成的文件。我们编译产生的文件都在 out文件夹下。

    四、如何查看源码的版本

    1、 从代码中查看当前版本,找到如下文件

    build\make\core\version_defaults.mk
    

    搜索关键字 PLATFORM_VERSION

    # This is the canonical definition of the platform version,
    # which is the version that we reveal to the end user.
    # Update this value when the platform version changes (rather
    # than overriding it somewhere else).  Can be an arbitrary string.
    
    # When you add a new PLATFORM_VERSION which will result in a new
    # PLATFORM_SDK_VERSION please ensure you add a corresponding isAtLeast*
    # method in the following java file:
    # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java
    
    # When you change PLATFORM_VERSION for a given PLATFORM_SDK_VERSION
    # please add that PLATFORM_VERSION to the following text file:
    # cts/tests/tests/os/assets/platform_versions.txt
    PLATFORM_VERSION.OPR1 := 8.0.0
    

    五、错误及解决方法

    由于在Ubuntu上开发,很多常用软件都没有,所以后来又在mac上编译源码,遇到不少问题,下面来分享一下

    错误 1、Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13” “10.14”]

    两种解决方法:

    1. 把当前系统有的sdk 版本,加入到这个列表中
    2. 下载列表中的sdk

    具体操作,下载地址,可以参考这里

    错误 2、在mac 10.15.4 上编译Android 8.0.0_r1 ,出现bad cpu type in executable

    这篇文章 也遇到这个错误,但是报错细节、Android版本号 和我的不一样,所以我暂时没有去尝试

    在苹果官网看到 关于bad cpu type in executable 回复 的,

    想了一下,既然Mac 10.15 支持64位,不支持32位,那就用新版Android吧,免得Android 8.0.0_r1 上越改问题越多

    错误3、在mac 10.15.4上编译Android10.0.0_r1,

    Android10.0.0_r1 是支持64位的,但是在编译过程中一定会遇到这个错误

    FAILED: build out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
    Outputs: out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests
    Error: exited with code: 1
    Command: /bin/bash -c "(out/host/darwin-x86/bin/sepolicy_tests -l out/host/darwin-x86/lib64/libsepolwrap.dylib       -f out/target/product/generic_x86_64/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts  -f out/target/product/generic_x86_64/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts  -p out/target/product/generic_x86_64/obj/ETC/sepolicy_intermediates/sepolicy ) && (touch out/target/product/generic_x86_64/obj/ETC/sepolicy_tests_intermediates/sepolicy_tests )"
    Output:
    /bin/bash: line 1: 28159 Segmentation fault: 11  ( out/host/darwin-x86/bin/sepolicy_tests -l out/host/darwin-x86/lib64/libsepolwrap.dylib -f out/target/product/generic_x86_64/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts -f out/target/product/generic_x86_64/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts -p out/target/product/generic_x86_64/obj/ETC/sepolicy_intermediates/sepolicy )
    

    这个错误是与mac 10.15 兼容问题,可通过这个临时解决

    make SELINUX_IGNORE_NEVERALLOWS=true
    

    还有个官方方案,打上下面的patch:(我是使用这个方法解决的)
    1f944107a3341ab593c93bbdf09e22436cc0e3d3

    官方就是修改 system/sepolicy/tests/Android.bp 去掉stl: “libc++_static”,

    下面这个是Catalina MacOS SDK 10.15的patch:
    89dad60ed5ec30b0f732b612d454151abdb4e449

    出自这篇文章:AOSP SELinux error

    错误4、Mac 下编译 关于 文件格式

    注意在mac 上编译,磁盘格式最好使用 Mac OS扩展(区分大小写,日志式),我在APFS 上解压aosp-laster.rar、同步代码、编译,完整操作了两次都不行。遇到同样的错误,也没再网上找到答案。也有可能是其它原因,按照官方的最好

    六、使用Android studio 查看源码

    Android Studio 导入 Android 源码

    IntelliJ IDEA导入Android源码

    注意:执行命令的时候,需要在bash 环境下,不能再zsh 环境下

    参考:
    官方文档:准备编译
    自己动手编译Android源码(超详细)
    Android 源码下载 到 编译全过程
    从源码中查看当前android版本

    展开全文
  • 在之前的工作中,由于不仅要分析和调试Android系统源码中Framework以及Telephony部分的Java代码,而且还要兼顾RIL和Modem相关的C/C++代码。然而Android Studio对于C/C++代码的支持并不是很好,...

    转载请注明出处:https://blog.csdn.net/turtlejj/article/details/83857897,谢谢~

     

            在之前的工作中,由于不仅要分析和调试Android系统源码中Framework以及Telephony部分的Java代码,而且还要兼顾RIL和Modem相关的C/C++代码。然而Android Studio对于C/C++代码的支持并不是很好,所以我一直使用的是Source Insight来阅读代码。

            后来由于工作的调整,对于C/C++代码的关注少了很多,因此转而使用Android Studio来阅读代码。不得不说,Android Sutdio对于Android的开发跟调试要优于Source Insight太多太多。不仅可以快速的查找到想要查找的类和方法,更可以对系统进程打断点进行单步调试,从而在遇到问题时,不再需要进行“对出问题的模块加入debug log -> 重新编译模块 -> adb push -> 复现问题 -> 抓log -> 重新分析log”的操作,极大地提升了分析问题的效率。

            本篇文章会讲解如何使用Android Studio导入系统源码。关于如何使用Android Studio对系统源代码进行单步调试,请看文章《使用Android Studio对Android系统源码进行单步调试》。

     

    使用Android Studio导入系统源码

            在这里我们默认大家已经下载好了Android系统的源代码,关于如何下载,网上有很多详尽的教程,我这里就不再过多的赘述,不会的同学可以自行百度。

            PS: 使用Android Studio导入系统源代码需要对代码进行一定的编译操作,如果有些同学使用的是Windows系统,可以尝试在Cygwin下进行编译,或者将在Linux下编译生成的三个产物拷贝到Windows的源代码根目录下,也可以起到一样的效果。

            进入正题,在下载好代码之后,我们需要对代码进行编译操作,对于目前比较新的Android 8.0以及9.0版本,我这里推荐使用Ubuntu 16.04的版本进行编译,编译过程中一般不会遇到什么问题 (使用Ubuntu 18.04的话,可能会遇到一些坑,我在《Ubuntu 18.04 编译安卓系统源码 及 adb连接手机遇到的问题详解》里列举了所有我遇到的问题以及解决方法,有需要的同学可以参考)。

            这里需要执行以下四条命令:

            1. "source build/envsetup.sh" (source可以用 . 代替,即". build/envsetup.sh")

            2. "lunch",并选择要编译的项目

            3. "make idegen -j4" (这里的 -j4 表示用4线程来编译,可以不加)

            4. "sudo development/tools/idegen/idegen.sh" (我的电脑需要管理员权限才能执行成功,所以我一般会在前面加上"sudo")

     

            下面进行分布讲解:

            1. 进入系统源码的根目录(即可以看到frameworks、kernel等等文件夹的那一级目录),执行". build/envsetup.sh"命令:

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ . build/envsetup.sh 
    including device/generic/mini-emulator-arm64/vendorsetup.sh
    including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
    including device/generic/mini-emulator-x86_64/vendorsetup.sh
    including device/generic/mini-emulator-x86/vendorsetup.sh
    including device/qcom/common/vendorsetup.sh
    including vendor/qcom/proprietary/common/vendorsetup.sh
    including sdk/bash_completion/adb.bash

            2. 而后,继续执行"lunch"命令,并选择你想要编译的那个项目,这里我选了2,即编译 aosp_arm64-eng:

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ lunch
    
    You're building on Linux
    
    Lunch menu... pick a combo:
         1. aosp_arm-eng
         2. aosp_arm64-eng
         3. aosp_mips-eng
         4. aosp_mips64-eng
         5. aosp_x86-eng
         6. aosp_x86_64-eng
    
    Which would you like? [aosp_arm-eng] 2
    
    ============================================
    PLATFORM_VERSION_CODENAME=REL
    PLATFORM_VERSION=8.1.0
    TARGET_PRODUCT=aosp
    TARGET_BUILD_VARIANT=arm64-eng
    TARGET_BUILD_TYPE=release
    TARGET_PLATFORM_VERSION=OPM1
    TARGET_BUILD_APPS=
    TARGET_ARCH=arm64
    TARGET_ARCH_VARIANT=armv8-a
    TARGET_CPU_VARIANT=kryo300
    TARGET_2ND_ARCH=arm
    TARGET_2ND_ARCH_VARIANT=armv7-a-neon
    TARGET_2ND_CPU_VARIANT=cortex-a9
    HOST_ARCH=x86_64
    HOST_2ND_ARCH=x86
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-4.15.0-38-generic-x86_64-with-Ubuntu-18.04-bionic
    HOST_CROSS_OS=windows
    HOST_CROSS_ARCH=x86
    HOST_CROSS_2ND_ARCH=x86_64
    HOST_BUILD_TYPE=release
    BUILD_ID=OPM1.171019.026
    OUT_DIR=out
    AUX_OS_VARIANT_LIST=
    ============================================

            3. 前面两步是对编译环境进行配置,接下来执行"make idegen -j4",并等待(屏幕会输出很多log,这里只贴出最后部分):

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ make idegen -j4
    ......
    
    [100% 765/765] Install: out/host/linux-x86/framework/idegen.jar
    
    #### make completed successfully (03:16 (mm:ss)) ####

            4. 看到以上输出以后,执行"sudo development/tools/idegen/idegen.sh",并继续等待,这个过程可能比较长,不要着急

    xxxxxx@xxxxxx-Ubuntu:~/code/android$ sudo development/tools/idegen/idegen.sh
    [sudo] xxxxxx 的密码: 
    Read excludes: 9ms
    Traversed tree: 127108ms

            完成以上四个步骤之后,会发现在源码根目录下出现了三个新的文件(也有可能是两个)

            1. android.iml (记录项目所包含的module、依赖关系、SDK版本等等,类似一个XML文件)

            2. android.ipr (工程的具体配置,代码以及依赖的lib等信息,类似于Visual Studio的sln文件)

            3. android.iws (主要包含一些个人的配置信息,也有可能在执行上述操作后没有生成,这个没关系,在打开过一次项目之后就会自动生成了)

     

            "android.iml"和"android.ipr"一般是"只读"的属性,我们这里建议大家,把这两个文件改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况,执行如下两条命令即可。

    sudo chmod 777 android.iml
    sudo chmod 777 android.ipr

     

            如果你的电脑性能足够好(内存大于16G,代码下载在SSD上),那么可以直接打开Android Studio,点击"Open an existing Android Studio project"选项,找到并选中刚刚生成的"android.ipr"文件,点击OK,就可以开始导入项目了。 第一次导入,这个过程可能会持续很久,几十分钟或者超过一个小时。不过成功之后,以后再打开项目就会快很多了。

            如果电脑性能一般的话,我建议,可以在导入项目前,手动对"android.iml"文件进行一下修改,可以使我们导入的时间尽可能的缩短一些。

            首先,要保证"android.iml"文件已经添加了"可写入"的属性(上文中已经介绍了如何修改文件属性)。

            接下来,使用文本编辑器打开"android.iml"文件,并执行以下修改(仅代表我的个人习惯,也可以根据同学们的喜好自己调整):

            1. 搜索关键字"orderEntry",我一般会将所有带有这个关键字的标签项全部删除,仅保留以下三行,大概如下

    ......
        </content>
        <orderEntry type="sourceFolder" forTests="false" />
        <orderEntry type="inheritedJdk" />
        <orderEntryProperties />
      </component>
    </module>

            2. 搜索”excludeFolder“关键字,对这里进行一些修改,将我们不需要看的代码Exclude掉。通过这个步骤,能极大地提升第一次加载项目的速度。

            等项目加载完成后,我们还可以通过Android Studio对Exclude的Module进行调整,所以也不用害怕这里Exclude掉了有用的代码,或少Exclude了一部分代码,在项目加载完以后再进行调整就行了。

            以下是我的配置,大家可以参考(由于我比较关注Framework以及Telephony相关的代码,所以重点保留了这两部分,而其他一些如kernel、bootloader的代码,我就Exclude掉了,同学们也可以根据自己的需求来进行修改)。

    <excludeFolder url="file://$MODULE_DIR$/.repo" />
    <excludeFolder url="file://$MODULE_DIR$/art" />
    <excludeFolder url="file://$MODULE_DIR$/bionic" />
    <excludeFolder url="file://$MODULE_DIR$/bootable" />
    <excludeFolder url="file://$MODULE_DIR$/build" />
    <excludeFolder url="file://$MODULE_DIR$/compatibility" />
    <excludeFolder url="file://$MODULE_DIR$/dalvik" />
    <excludeFolder url="file://$MODULE_DIR$/developers" />
    <excludeFolder url="file://$MODULE_DIR$/developers/samples" />
    <excludeFolder url="file://$MODULE_DIR$/development" />
    <excludeFolder url="file://$MODULE_DIR$/device/google" />
    <excludeFolder url="file://$MODULE_DIR$/device/sample" />
    <excludeFolder url="file://$MODULE_DIR$/docs" />
    <excludeFolder url="file://$MODULE_DIR$/external" />
    <excludeFolder url="file://$MODULE_DIR$/flashing-files" />
    <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
    <excludeFolder url="file://$MODULE_DIR$/kernel" />
    <excludeFolder url="file://$MODULE_DIR$/libcore" />
    <excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
    <excludeFolder url="file://$MODULE_DIR$/out" />
    <excludeFolder url="file://$MODULE_DIR$/pdk" />
    <excludeFolder url="file://$MODULE_DIR$/platform_testing" />
    <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
    <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
    <excludeFolder url="file://$MODULE_DIR$/shortcut-fe" />
    <excludeFolder url="file://$MODULE_DIR$/test" />
    <excludeFolder url="file://$MODULE_DIR$/toolchain" />
    <excludeFolder url="file://$MODULE_DIR$/tools" />

            完成之后,按照上面说的步骤,使用Android Studio选中"android.ipr"打开项目即可。

     

    优化Android Studio的配置

            在打开系统源代码后,我们还可以对Android Studio进行一些配置,使得我们可以更好的进行代码阅读。

        1. Exclude不需要的代码目录

            点击"File -> Project Structure...",中间的窗口选择"android"(首字母小写的那一个),在弹出的窗口中左边栏中选择"Modules",而后在右边的窗口中选择"Sources"。在这里我们可以看到项目的所有代码目录,我们可以选中不需要的module,并点击上面的"Excluded"按钮,当被选中的目录变为橙色,即表示完成Exclude操作;如果想要取消对某代码目录的Exclude操作,选中该目录,再次点击"Excluded"按钮,等待目录变为蓝色即可。

     

        2. 选择项目的SDK版本

            点击"File -> Project Structure...",中间的窗口选择"android"(首字母小写的那一个),在弹出的窗口中左边栏中选择"Modules",而后在右边的窗口中选择"Dependencies"。在下拉菜单中选择系统源代码相应的SDK版本(如:8.0的代码就选择API 26,9.0的版本就选择API 28)。

            如果在下拉菜单中没有找到相应的SDK版本,就打开Android Studio自带的SDK Manager下载即可。

            PS: 这步非常关键,如果这里不选择Android API,而是使用JDK 1.8之类的话,无法进行系统源码的单步调试。

     

        3. 指定项目的minSdkVersion

            在阅读源代码的时候,经常会看到类似的这种错误"Field requires API level xx (current min is 1): android.xx.xx",这是由于我们只对项目指定了targetSdkVersion,但没有指定minSdkVersion。

            解决办法如下:

            点击"File -> Project Structure...",在弹出的窗口中左边栏中选择"Modules",中间的窗口选择"Android"(首字母大写的那一个),而后在右边的窗口中选择"Structure"。如下图所示,将这三行配置改为你自己的代码目录即可(不一定非要使用这个AndroidManifest.xml文件以及res和assets目录,你可以选择你喜欢的任意一个),完成后点击Apply或者OK。

            接下来,找到刚刚选择的那个AndroidManifest.xml,打开并在manifest标签下的任意一行添加如下代码并保存即可

    <uses-sdk android:minSdkVersion="26" />

             这里的数字根据你源代码的版本来填写,比如你导入的是8.0的源代码,就写26;9.0的源代码就写28,以此类推。由于是系统源代码,所以minSdkVersion与前面第2步中设置的Android API版本保持一致即可。

        4. 增加打开代码文件的数量以及对代码标签页显示的优化

            Android Studio默认只能打开10个代码文件,且文件打开多了以后显示不开的文件还会被隐藏,需要点击最右边的箭头才能查看。而最致命的是,如果不小心修改了某个文件,在标签页上,不会有任何的提示

            其实,我们可以通过修改设置改变这种情况,从而使得我们更好的阅读代码。

            点击"File -> Settings...",在弹出的窗口中左边栏中选择"Editor -> General -> Editor Tabs",而后在右边的窗口中修改三个选项:

            1. 取消勾选"Show tabs in single row"    ->   使得文件可以在多行进行显示,而不会被隐藏

            2. 勾选"Mark modified tabs with asterisk"    ->    在标签栏中,对被修改但尚未保存的文件加上一个星号进行提示

            3. 将"Tab limit"后面的数字修改为你希望最多同时打开文件的数量,比如"20"

     

            修改后效果如下:

            以上的修改,都是我在阅读Android源代码时遇到的不便,因而总结出来的解决方法,希望能对大家有所帮助。

    展开全文
  • 通常,从事Android开发相关的人员,都需要涉及到Android源码的阅读,尤其是从事Android系统相关开发的。这里介绍下Android studio 如何 导入Android源码,以便更好的学习开发。比较早的时候,阅读学习调试Android...

    1.前言

    通常,从事Android开发相关的人员,都需要涉及到Android源码的阅读,尤其是从事Android系统相关开发的。这里介绍下Android studio 如何 导入Android源码,以便更好的学习开发。比较早的时候,阅读学习调试Android源码通常都是使用eclipse工具,当android studio 问世后,许多人便开始使用Androidstudio 导入源码,使用as笔者有这些优点–代码阅读比eclipse舒心,同时还可以调试相关系统进程等。

    2.步骤

    在导入源码之前,记得一定要正确的通过全部源码的编译。
    这里笔者假设到这里,我们的源码已经全部编译完成。导入工具阅读源码这里是依靠了Android源码自带的idegen神器。

    2.1 生成AS或者ES能够导入的文件,这里只讲AS

    source build/envsetup.sh
    mmm development/tools/idegen/
    development/tools/idegen/idegen.sh
    

    执行完上述命令后,在源码根目录会生成如下文件:

    android.iml (as)(配置文件)
    android.ipr (as)(导入需要的文件)
    .classpath  (eclipse)(导入需要的文件)
    

    按照一般的流程,此时通过as导入android.ipr即可阅读源码了。但是因为电脑硬件配置的原因,笔者这里将剩下的步骤也写出来,供大家参考。

    2.2 修改android.iml 配置包含哪些文件

    用文本编辑器打开android.iml文件,找到作些修改,以下是笔者的修改excludeFolder 开头的地方,根据需要去除掉包含的文件

          <excludeFolder url="file://$MODULE_DIR$/.repo" />
          <excludeFolder url="file://$MODULE_DIR$/abi" />
          <excludeFolder url="file://$MODULE_DIR$/art" />
          <excludeFolder url="file://$MODULE_DIR$/bionic" />
          <excludeFolder url="file://$MODULE_DIR$/bootable" />
          <excludeFolder url="file://$MODULE_DIR$/build" />
          <excludeFolder url="file://$MODULE_DIR$/cts" />
          <excludeFolder url="file://$MODULE_DIR$/dalvik" />
          <excludeFolder url="file://$MODULE_DIR$/developers" />
          <excludeFolder url="file://$MODULE_DIR$/development" />
          <excludeFolder url="file://$MODULE_DIR$/device" />
          <excludeFolder url="file://$MODULE_DIR$/docs" />
          <excludeFolder url="file://$MODULE_DIR$/external" />
          <excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
          <excludeFolder url="file://$MODULE_DIR$/external/chromium" />
          <excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
          <excludeFolder url="file://$MODULE_DIR$/external/webkit" />
          <excludeFolder url="file://$MODULE_DIR$/frameworks" />
          <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
          <excludeFolder url="file://$MODULE_DIR$/hardware" />
          <excludeFolder url="file://$MODULE_DIR$/kernel" />
          <excludeFolder url="file://$MODULE_DIR$/libcore" />
          <excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
          <excludeFolder url="file://$MODULE_DIR$/ndk" />
          <excludeFolder url="file://$MODULE_DIR$/out" />
          <excludeFolder url="file://$MODULE_DIR$/out/eclipse" />
          <excludeFolder url="file://$MODULE_DIR$/out/host" />
          <excludeFolder url="file://$MODULE_DIR$/out/target/common/docs" />
          <excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates" />
          <excludeFolder url="file://$MODULE_DIR$/out/target/product" />
          <excludeFolder url="file://$MODULE_DIR$/pdk" />
          <excludeFolder url="file://$MODULE_DIR$/platform_testing" />
          <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
          <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
          <excludeFolder url="file://$MODULE_DIR$/sdk" />
          <excludeFolder url="file://$MODULE_DIR$/shortcut-fe" />
          <excludeFolder url="file://$MODULE_DIR$/system" />
          <excludeFolder url="file://$MODULE_DIR$/toolchain" />
          <excludeFolder url="file://$MODULE_DIR$/tools" />
    

    2.3 修改Android Studio的配置文件

    由于导入源码时需要消耗大量内存,所以建议修改studio64.vmoptions文件:

    -Xms1024m
    -Xmx1024m
    

    这里的数值1024可以根据实际情况进行调整。

    2.4 打开as开始导入source code

    File -> Open 选择源码目录刚刚生成的android.ipr就可以导入了,这个过程第一次是比较慢的,大家需要耐心等待。
    待到源码正常导入后,还需要做一些配置。

    2.5 as中配置android source code

    project->Open Module Settings
    在这里插入图片描述
    先配置Sources,这里是选择将何文件夹包含进来。点击Exclude即可(和之前修改iml文件同样的效果)
    在这里插入图片描述
    然后配置SDK,选择和自己平台对应的SDK,删除除API外的全部依赖
    在这里插入图片描述
    在这里插入图片描述
    确认保存后,记得等工程配置刷新下,也就是as下方的进度条完。就完了。

    展开全文
  • 最近一段时间在公司项目开发中,遇到了使用蓝牙进行数据传输,但是还必须要求其中的一个搭载android系统的蓝牙设备默认接受所有来进行蓝牙连接的设备。我们知道在如今的android系统中,使用蓝牙进行配对时系统会随机...
  • 通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作。为了更进一步地学习跟研究 Android 系统源码,今天我们来讲讲如何进行 Android 系统源码的调试...
  • 【1、修改默认语言】 以si7537sc_Stylo_k7_M项目为例 修改文件路径在:device/sprd/scx35/sp7731g_1h10/si7537sc.mk 默认语言是里面语言的第一个【2、修改默认时区】 在build/tools/buildinfo.sh脚本里修改默认...
  • Android系统的源代码非常庞大和复杂,我们不能贸然进入,否则很容易在里面迷入方向,进而失去研究它的信心。我们应该在分析它的源代码之前学习好一些理论知识,下面就介绍一些与Android系统相关的资料。 我们知道,...
  • 转载android系统源码中添加app源码(源码部署移植) 涉及到系统定制,需要在系统中加入自己的apk工程,但是上网找了很多资料都是不够全面的,或者看了还是没搞懂,我自己也是一点点摸索过来的,花了不少的时间,也...
  • 对于想看Android系统源码的人来说,可以说有很多编辑工具都可以查看,比如,我看到身边有同事用sourceInsight软件,但我们平时开发Android app一般都是用Eclipse、Android Studio来开发,要查看源码,还要另外下载...
  • 好长时间没有写blog了,之所以没有写,主要还是工作上的事,...就把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看重的不是结果,主要是过程,在这个过程中,我感觉最大的收
  • 现在我修改源码下的dalvik/vm/DvmDex.cpp文件。 根据framework框架图,这明显是属于android运行时层的内容。想要在下次运行模拟器的时候看见 这个改动。从新编译整个源码的时间太长了,我应该怎么样编译一下那部分...
  • 最近买了个Nexus 5 手机准备学习android4.4.4源码。Nexus 5 刷入从第三方下载的ROM后,总是推送各种第三方APP,于是自己打算下载编译一次官方的源码。一、编译环境搭建1.官方推荐环境介绍关于Android各个版本的编译...
  •  《Android系统源代码情景分析》是2012年10月出版的图书,作者是罗升阳。  在内容上,本书结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层...
  • 关联系列 Android AOSP基础系列 Android系统启动系列 前言 在上一篇文章Android AOSP...动态调试Android系统源码 定制Android系统 将最新版本的Android系统刷入到自己的Android设备中 将系统源码导入到Android Stud...
  • 在上一遍文章《使用Android Studio导入Android系统源码》中,我们已经介绍了如何将Android源代码导入Android Studio进行阅读,这篇文章我们开始介绍,如何使用Android Studio对系统源代码打断点并进...
  • 为了进一步的深入Android源码的学习,我们需要去下载android源码到我们的AS里面编译。 当然如果你不想下载下来,那么也可以在线看 https://www.androidos.net.cn/sourcecode 准备环境 安装 git 安装 Python...
  • 本文介绍的Android系统源码并不是像某一个类(比如:Handler)的源码,而是支持整个Android系统能够运行的源码。 这里只对Android系统源码目录进行分析,具体的源码一般都是根据需求来看。 一.Android源码的基本...
1 2 3 4 5 ... 20
收藏数 78,919
精华内容 31,567