安卓修改大师智改工坊 · 大屏适配实战

平板横屏适配,改的不是一张图,而是三套规则

同一份 APK,在手机上刚好,在平板上却出现大片留白、过长的行宽、被拉伸的启动图。原因通常不是某一个布局写错,而是资源限定符、布局结构和方向配置各走各的。把这三层对齐,平板体验才会从“能用”变成“像专门做过”。

查看智能修改电脑版

只需说话,就能让应用变成你想要的样子。

先判断问题在哪一层:资源、布局还是方向

先看一个具体场景。一块 10 英寸平板横放在桌上,打开自家应用:首页列表只占中间一条窄带,左右是大片浅色背景;每个列表项被拉得很宽,标题和右侧时间之间隔着半个屏幕;点进详情,内容仍是一条竖排长文,字号和手机上差不多。用户第一句话通常不是“限定符错了”,而是“这个应用在平板上怎么这样”。

这类问题不能靠“把界面放大”解决。平板适配至少分成三层:资源层决定系统从哪套目录取尺寸、图片和颜色;布局层决定这些材料怎么摆放;方向层决定启动页、主页和系统栏在横竖屏之间如何衔接。三层里任何一层没对齐,用户都能看出来。

还有一个常被混在一起的概念:宽度。物理屏幕宽、应用窗口宽、内容宽度是三件事。物理宽度用英寸或像素描述,决定设备形态;窗口宽度用 dp 描述,决定系统命中哪些资源限定符;内容宽度由布局约束决定,决定一行能放多少信息。适配主要看后两个,而不是盯着“这台平板是几英寸”。

用户看到的现象 先查哪一层 常见原因
内容挤在左上角,右侧大片空白 布局层 仍是手机单列,内容没有最大宽度
列表一行只有几个词,行非常长 布局层 列表项横跨全屏,没有分栏或宽度上限
启动图被拉扁,或左右有黑边 资源层 只有手机画布的图,没有平板候选
启动先竖后横,画面转一下 方向层 启动页与主页方向配置不一致
按钮离得远,点击费劲 资源层 尺寸和触控目标没有按平板覆盖
分屏后错位、控件重叠 布局层 按屏幕宽写死,没考虑可用窗口变化

Android 用 dp 作为布局的逻辑单位,用 sp 作为字体单位。dp 会随系统密度换算成像素,但保持大致的物理比例;sp 还会叠加用户设置的字体缩放。平板上同样写 16dp 的边距,在不同设备上的像素数不同,视觉比例却接近。这也是为什么改布局时优先用 dp 和 sp,而不是直接写 px。

资源限定符就是这套逻辑尺寸的分拣规则。系统在运行时读取当前设备的最小宽度、可用宽度、方向、密度、夜间模式等配置,再从最匹配的目录取资源。你不需要在代码里写判断,只需要把资源放进正确的目录。规则本身不难,难的是目录之间的优先级和组合方式。

关于“平板”的分界线,最常用的限定符是 sw600dp。sw 是 smallest width,指屏幕最短边;设备旋转时这个值不变,所以它适合判断“这是不是平板形态”。7 英寸级平板常见 600dp,10 英寸级常见 800dp 左右。另一个常用的是 w600dp,w 是当前可用宽度,旋转、分屏、小窗都会改变它,适合处理“这一屏现在到底有多宽”。land 只看方向,手机横屏也会命中。

把三层拆开之后,排查会变得有顺序:图片糊、间距怪,先查资源;一行太长、两栏挤,先查布局;启动闪、旋转跳,先查方向。不要一上来就重写布局,也不要把所有问题都归咎于“平板分辨率太高”。下面的操作按准备、资源、尺寸、布局、启动页、实例、验收、排查的顺序推进,每步都能在设备上看到结果。

平板横屏上的应用界面与留白

图 1:平板上的“空”,往往不是屏幕太大,而是内容没有结构。

本文所有操作只针对自有版权或已获授权的应用。给自家教学应用做平板适配、给客户授权的门店展示应用改横屏,都属于正常维护;请勿用于破解他人付费应用、去除授权校验或绕过安全机制。适配的目标是让正常功能在大屏上更好用。

开工前准备:把 APK 变成能反编译、能回编的工程

智能修改电脑版运行在 Windows 10/11 64 位,需要 .NET Framework 4.6.2 或更高,安装包约 6.86 MB。它把反编译、改代码与资源、回编、对齐、签名、校验和安装串成一条链。对平板适配来说,最大的价值是每次改完都能立刻装到设备上看,而不是在命令行、编辑器和资源管理器之间来回切。

第一次启动,工具会让你设置工作目录。默认会按 D、E、F、G、C 的顺序找第一个可读写且剩余空间不少于 1GB 的盘,自动建 tools 和 Project 两个子目录。如果你有专门的 SSD 或更大的分区,可以在参数设置里手动指定;工具链体检也在设置里,先确认 apktool、aapt、Java 都能被找到,再导入 APK。

把 APK 拖进主窗口。aapt 会先解析图标、应用名、包名、版本号、目标 SDK 和启动页。把包名、versionCode、LaunchableActivity 记在一边,验收时要用。每个项目在 Project 下都有独立目录,里面保留一份 source.apk;反编译结果在 apktool 子目录,日志是 apktool.log。source.apk 是回滚用的原件,不要删。

12 MB 左右的安装包实测约 3 秒完成反编译;超过 10 分钟会中断并报错。失败先看 apktool.log 最后几十行:框架资源版本不匹配、资源文件损坏、加固壳,都会在这里留下线索。不要急着重装工具,先把日志读完。反编译成功后,项目详情页会显示应用信息,确认三件事:包名是不是你要改的那个;versionCode 是不是比测试机上的高;启动页 Activity 是不是主页。

需求输入框旁边有 3000 条常用话术,分界面美化、弹窗引流、去除限制、常规修改、混淆去毒、插件添加六类,每类 500 条。点选一条会填进输入框,你再把它改成具体的设备、页面和数值。话术适合起步,不适合直接提交;“优化平板布局”这种描述,AI 只能猜,写清“左栏 320dp、右栏自适应、中间 24dp”才有可验收的结果。

如果手边有两栏草图、旧版设计稿或平板截图,可以放进附件。一次可以多选文件,每个文件都要写用途,至少 10 个字;工具会校验文件存在、不是目录、不是 0 字节、可读,然后把序号、路径和说明随需求一起发出去。项目历史只保留你的原话,方便回看当时是怎么描述的,右侧“选择”还能把历史需求回填到输入框。

点“立刻修改”,原始需求和日期会记进项目历史,需求进入右侧 AI 工作区。AI 在 apktool 工程里改代码和资源,完成后自动回编、对齐、签名、校验;整个过程写进 pack.log。长需求有 1 小时的等待上限,可以慢慢跑,不用守着进度条。

打包固定四步:apktool b 生成未签名包,zipalign 做 4 字节对齐,apksigner 签名,最后 apksigner verify --print-certs 复核。多一步 verify 是为了确认“到底签没签上”,密钥格式错误时只有它会明确报出来。签名支持 v1/v2/v3/v4,默认是 v1+v2+v3,覆盖 Android 10 到较新的系统。

签名方式有四选一:默认签名、JKS/keystore、PEM+PK8、随机签名。试装可以用默认或随机;只要应用还要覆盖升级,就必须用你自己的 keystore,并把这个文件保存好。签名不一致时,新包不能覆盖旧包,只能卸载重装,本地数据会一起没。口令通过环境变量传入,不会拼进命令行和日志,这一点在多人协作时尤其重要。

项目列表里可以直接打开详情、浏览项目文件,内置的文本查看器能看布局 XML 和日志。改完想确认 AI 动了哪些文件,不必回到资源管理器,在项目里逐个打开对比即可;发现改错,直接改回来或重新提需求,source.apk 始终保底。项目列表还能看历史、删除不再需要的项目,删除范围只限项目目录本身,不会误伤工具链。

安装阶段,工具会通过 adb 找设备、装包、用 am start -W 拉起启动页,再用 dumpsys 复核前台应用。手机可以通过投屏查看;平板建议直接看屏幕,横屏比例和触控手感只有真机最准。第一次连接前,在平板开发者选项里打开 USB 调试,并在弹窗里允许这台电脑。设备找不到时,先换数据线,再查驱动,最后才怀疑工具。

准备阶段的验收很简单:项目能打开、能看到启动页、能成功回编一次、能装到平板并拉起。原包不动,先做一次空改,只改一个字符串资源,走完整条链,确认工具链和签名没问题,再开始真正的适配。这个习惯能省掉后面一半的“到底是工具坏了还是我改坏了”的争论。

反编译工程与平板真机预览

图 2:先让工程能稳定回编、安装,再开始改平板资源。

资源限定符:sw600dp、w、land 与密度怎么组合

资源目录名由资源类型和限定符组成,限定符之间用连字符分隔,顺序必须符合 Android 的规定:最小宽度在前,可用宽度、可用高度在后,屏幕方向再后,密度最后。常见组合是 values-sw600dp、layout-sw600dp-land、drawable-sw600dp-xxhdpi。顺序写反,轻则目录不生效,重则编译直接报错。

下面这张表是平板横屏项目里最值得先建起来的目录。不是每个都要用,但至少要知道它们各自负责什么,以及什么时候不该用。

目录 命中条件 适合放什么
layout 默认兜底 手机竖屏布局,始终保留
layout-land 所有横屏设备 手机横屏也要调整时才用
layout-sw600dp 最短边 ≥600dp,不限方向 平板通用布局,竖屏也保持两栏
layout-sw600dp-land 平板形态且横屏 只给平板横屏做两栏
values-sw600dp 平板形态 尺寸、字号、布尔值、颜色覆盖
drawable-sw600dp-land 平板横屏 启动背景、横屏插画等大图
layout-w600dp 当前窗口宽 ≥600dp 分屏、小窗时要自动换布局

sw600dp 的判定与旋转无关。平板竖着拿,最短边还是 600dp 以上;横着拿,最短边没变,仍然命中。这就是它适合判断设备形态的原因。用它做两栏,平板竖屏也会拿到两栏布局;如果你只想横屏两栏,必须再加 land。反过来说,如果平板竖屏也应该保持两栏,单独一个 layout-sw600dp 就够了,不必再拆横竖两份。

w600dp 看的是当前窗口宽度。平板分屏后,应用可能只剩 500dp,sw600dp 仍然成立,但 w600dp 不成立。用 w 限定符准备布局,可以在分屏时自动回到单栏;用 sw 限定符,则会在分屏时继续用两栏,容易挤。两者不是谁替代谁,而是回答不同问题:sw 回答“设备是不是平板”,w 回答“当前窗口够不够宽”。

在更大的窗口里,还可以再加一级 w840dp。Android 12L 以后,平板分屏和自由窗口更常见,同一个应用可能在 600dp、840dp、1280dp 三种宽度下出现。给 w600dp 准备单栏加宽版,给 w840dp 准备两栏版,给 sw600dp-land 准备横屏满宽版,三层各管一段,比只用一个开关稳。限定符不是越多越好,每多一个目录就多一份要维护的资源;先覆盖最常见的两档,再看测试反馈补。

land 只看方向。layout-land 会被所有横屏设备命中,包括手机横屏。只改平板横屏,用 layout-sw600dp-land;平板不分方向都改,用 layout-sw600dp;手机横屏也要照顾,才用 layout-land。三个目录可以同时存在,系统会选匹配度最高的那个。实际项目里最常见的事故,是只建了 layout-land,结果手机横屏也被改成了两栏,测试范围一下子扩大。

资源匹配按限定符逐级筛选,不是按目录名长短。一个目录写了 sw600dp 和 land,只有两个条件都满足才会进入候选;多个候选都满足时,系统继续按后面的限定符比较。最容易出问题的是旧目录里还留着一张同名图或一份同名布局,新目录写了却被旧资源抢了匹配。改完没效果,先全局搜索这个资源名,看它到底在几个目录里出现。

密度目录解决清晰度,不解决画布比例。drawable-xhdpi、drawable-xxhdpi 表示同一张图的不同像素版本,系统按当前密度挑最接近的。平板密度跨度很大,不能假设平板一定低密度;一张 1200 像素宽的图,在 1280dp 宽的平板上可能只够铺一半,在 2560 像素宽的高密度平板上又可能偏糊。判断标准是目标设备上的实际显示尺寸,不是目录名看起来对不对。

平板专用整图,放在 drawable-sw600dp 或 drawable-sw600dp-land,并且尽量只保留一个候选。如果同一张图在密度目录里还有旧版本,系统会继续按密度挑,最后命中的可能不是你刚放的那张。启动背景、空状态插画、引导页这类大图最容易遇到,改完一定在设备上看实际效果,不要只看目录结构就下结论。

values-sw600dp 适合覆盖 dimens、bool、integer、string 和颜色。把边距、字号、行高、内容最大宽度都做成有名字的资源,布局文件只引用名字;平板目录里只写差异,不复制整份文件。这样后面调一个数值,所有页面一起变,不会出现这页改了那页没改。目录名只能用大写?不行,只能小写字母、数字和下划线;sw600dp 不能写成 sw600、sw600Dp;land 不能写成 landscape。编辑器对目录名往往不报错,资源不生效时先逐字核对目录名。

一个快速的验证方法:在 values-sw600dp 里把一个只在平板上显示的字符串改成明显不同的值,回编安装,在平板和手机上各打开一次。如果平板显示新值、手机显示旧值,说明限定符生效;如果两边都一样,目录名或资源引用有问题。确认链路通了,再改布局和图片,否则你很难分清是限定符没生效,还是布局本身写错了。

资源目录与限定符组合

图 3:先让资源命中正确的平板目录,再谈布局怎么排。

把写死的数字抽出来:尺寸、字号与主题资源

打开 res/layout 下的布局,搜索 dp 和 sp,出现频率最高的数字就是候选:页面左右边距、区块间距、卡片内边距、列表行高、按钮高度、标题和正文字号。不要一次全部替换,先建一套最小可用的尺寸资源,覆盖主要页面,再逐步收口。改包场景里,动的文件越少,回归越容易控制。

尺寸名 手机默认 平板起点 用途
page_margin 16dp 32dp 页面左右边缘
section_gap 16dp 24dp 区块之间
card_padding 16dp 20dp 卡片内边距
list_row_height 64dp 80dp 列表行高
touch_min 48dp 56dp 最小触控目标
body_text 15sp 16sp 正文
title_text 20sp 22sp 页面标题
content_max_width 不设 760dp 正文阅读上限

这些数字只是起点。10 英寸平板横屏的逻辑宽度通常在 1280dp 左右,32dp 的页面边距只占 2.5%,视觉上仍然偏紧;如果内容显得散,可以加到 40dp 甚至 48dp。反过来,8 英寸平板的最短边只有 600dp,32dp 边距已经占 5%,再大就会挤压内容。用 sw600dp 和 sw720dp 两级覆盖,比一套数值打天下稳。

字号不要成倍放大。手机正文 15sp,平板 16sp 到 17sp 就够;标题 20sp 到 22sp,不要直接 32sp。平板的观看距离通常比手机远,字号略大是合理的,但字号变大后一行能放的字变少,原来两行放得下的标题可能变成三行,卡片高度和列表行高要同步留余量。改完看三处:标题是否被截断、正文是否出现孤字、按钮文字是否换行。

列表行高从 64dp 提到 72dp 到 88dp,行内主标题 16sp、副标题 13sp 到 14sp,右侧操作区至少 48dp。行与行之间用 1dp 分隔线或 8dp 间距,不要既画线又留很大的空白,那样列表会显得松散。卡片内边距 16dp 到 20dp,卡片之间 12dp 到 16dp,页面边缘 32dp 左右,这三层间距要拉开层次,用户才能一眼看出分组。

颜色和主题也属于资源。平板横屏时,状态栏和导航栏的位置会变,浅色页面配深色图标、深色启动页配浅色图标,才能保证可读。改主题时只动 windowBackground、statusBarColor、navigationBarColor 和一两个强调色,不要把整套配色推倒重来;品牌色是识别的一部分,适配不是换皮。

夜间模式也要一起考虑。values-night 和 values-sw600dp-night 可以组合,但不要只改背景色不改文字色;平板上大面积浅色卡片在夜间模式下如果仍是白底,会非常刺眼。最省事的做法是让卡片、背景、文字三组颜色都走同一套命名,在 night 目录里成组覆盖,避免出现“背景黑了、字还是黑的”。

布尔和整数资源可以表达结构选择。values/bools.xml 里 two_pane=false,values-sw600dp/bools.xml 里 true;布局里引用同一个名字,代码里也读同一个值。这样“是不是两栏”只有一个来源,不会出现布局按平板排、代码按手机加载的分裂。整数资源可以用来控制列表列数,比如手机 1 列、平板 2 列,但列数变化要配合 item 宽度,不要只改数字。

给 AI 的需求可以这样写:只改资源,不动业务代码;把 activity_main 里写死的 16dp 页面边距替换为 @dimen/page_margin,把 64dp 列表行高替换为 @dimen/list_row_height;在 values/dimens.xml 里补默认值,在 values-sw600dp/dimens.xml 里覆盖为 32dp、80dp;新增 bool/two_pane,默认 false,平板 true;不要重命名现有 id。需求里点名文件、资源名和数值,返工最少。

验收:只改 page_margin 一个值,回编安装,在平板上打开三个主要页面。三页边距都变,说明引用链通了;只有一页变,说明另外两页还写死着数字。再改一次字号,看标题和按钮有没有被截断。资源层验收通过,再进布局层。这个顺序不要颠倒,否则布局改了半天,最后发现尺寸资源根本没命中,白忙一场。

布局:两栏结构怎么排才不别扭

两栏不是把手机页面横过来,而是把“点进去看详情”改成“选中即看详情”。左栏是列表或导航,右栏是内容。这个结构会改变返回键、选中态、空状态和滚动位置:第一次进入时右栏显示什么、点了列表项后右栏怎么更新、按返回是回到列表还是退出应用,都要提前定义。定义不清,布局排得再漂亮也会被用户骂“点乱了”。

以 1280dp 宽的横屏平板为例:左右各 32dp 页面边距,剩 1216dp;左栏 320dp,中间 24dp 分隔,右栏 872dp。右栏超过 760dp 的阅读上限时,把多出来的空间放在右侧或两侧留白,不要让正文铺满。左栏低于 280dp,列表标题容易被截断;高于 360dp,右栏开始局促。280dp 到 360dp 是常用区间,具体看标题长度和操作按钮数量。

左栏可以固定宽度,也可以用权重,但要给右栏一个最小宽度。根布局不要写死 1280dp;用 match_parent 加 weight,右栏才会随窗口伸缩。右栏内部的正文再套一层 maxWidth 约束,保证窗口再宽也不会出现一条横跨全屏的长行。表单类页面尤其需要这个上限,输入框拉得太长,眼睛从左到右扫一遍很累,填错的概率也会上升。

竖屏平板有两种选择:内容关系强,上下排;列表很长,保持单栏。用 layout-sw600dp 作为平板通用布局,竖屏时生效;layout-sw600dp-land 做横屏两栏,两个文件共用同一套 id 和 dimens。不要为了省一个文件,把横屏布局塞进 layout-land,手机横屏也会跟着变,回归范围立刻扩大。改包最怕“本来只想改平板,结果手机用户先炸了”。

列表行高 72dp 到 88dp,主标题 16sp,副标题 13sp 到 14sp;行内右侧按钮至少 48dp 点击区,图标和文字之间留 8dp。列表项被点中时要有明确的选中态,右栏切换后左栏仍然保留选中项,用户才知道自己在看哪一条。空状态也要设计:没有选中项时右栏显示提示,而不是一片白。这个提示最好带一句操作指引,比如“从左侧选择一个账户查看明细”。

触控目标至少 48dp,平板建议 56dp。按钮不要横向拉满,视觉宽度 160dp 到 240dp 就够,外层容器负责点击区;图标按钮加透明内边距,别让 24dp 的图标承担点击面积。平板常放在桌上或支架上,用户可能用指尖侧面或触控笔,目标太小会明显降低效率。手指粗、屏幕远、支架角度低,这三个因素叠加,48dp 只是底线,不是舒适线。

横屏时系统手势条可能在左侧或右侧,前置摄像头挖孔可能压住一角。根布局处理 window insets,或者给内容统一加安全边距;重要按钮不要放在最边缘 24dp 内。用开发者选项里的“显示布局边界”能看到实际裁剪、边距和重叠区域,比肉眼估更准。看完边界再截图对比,能发现很多“看起来没问题、实际被遮住”的控件。

滚动也要重新看。手机上列表一屏只有五六行,平板上可能一屏十几行,滚动到底部的距离变长;如果列表嵌在右栏里,要确认右栏自己能滚,而不是整页一起滚。主从结构里,左栏和右栏最好各自有滚动容器,用户切换列表时右栏的滚动位置要重置,否则点开新条目会停在上一条的中间。嵌套滚动如果处理不好,会出现手指在右栏滑动、左栏跟着动的情况。

如果不想一次上两栏,可以先做低风险三步:第一,把平板上的页面边距、卡片间距、列表行高调大,解决“挤在左上角”;第二,给正文和列表项加最大宽度,解决“一行太长”;第三,把底部导航改成侧边导航,解决“导航占高度”。三步做完再看,如果页面仍然空,再上两栏。小改动先验证方向,比一次性重写整个布局更可控。

给 AI 的两栏需求要具体到文件和 id:只新建 layout-sw600dp-land/activity_main.xml,保留手机布局;左栏沿用 list_container,宽 320dp;右栏沿用 detail_container,0dp 加 weight=1;中间 24dp 分隔;不要改网络请求、数据库和启动页;不要重命名现有 id。写清“不要动什么”,比写十句“优化一下”有用。改完先看 AI 留下的改动文件清单,确认没有顺手改掉业务代码。

失败检查按顺序做:页面打开时右栏是否空白,可能是 id 对不上;点列表项右栏是否更新,可能是点击事件还绑在旧视图;按返回键是否直接退出,主从结构应该先在右栏内返回或回到列表;旋转后选中项是否丢失,状态没有保存。四项都过,两栏才算能交付。任何一项没过,都不要急着加动画或美化,先把结构修对。

平板两栏布局的左右分区

图 4:两栏的关键不是“横过来”,而是左侧有边界、右侧能伸缩。

启动页与方向:第一帧就要对

启动页是用户还没操作就先看到的一帧。它出问题,用户对整款应用的第一判断就定了。平板横屏最常见的三种翻车:启动页竖屏、主页横屏,点开先转一下;启动图按手机比例画,横屏被拉伸或留黑边;系统启动画面和应用自己的启动页颜色不一致,闪一帧白或黑。三种现象都很短,但足够让人得出“这个应用没适配”的结论。

原因通常不在图片本身,而在三处配置各写各的。第一,启动页 Activity 和主页 Activity 的 screenOrientation 不一致;第二,启动背景只有手机画布,没有平板候选;第三,主题里的 windowBackground 和启动页第一屏不是同一个底色。三处任意一处不一致,都会在冷启动时被放大。热启动时系统直接回到原页面,反而看不出问题。

先对齐方向:清单里给启动页和主页写同一个 screenOrientation;如果主页在代码里动态设置方向,启动页也要跟着设。方向值的选择看使用场景,不要一律锁死。手持阅读类应用锁死一个方向,用户把平板倒过来时界面不跟着转,体验同样糟糕;固定壁挂设备则可以锁死,减少意外旋转。

方向值 行为 适合场景
landscape 固定横屏,不随重力翻转 壁挂、门店、车载支架
sensorLandscape 横屏,左右方向随重力切换 手持阅读、教学、演示
userLandscape 尊重用户的旋转锁定 用户可能锁定方向的场景
unspecified 跟随系统,最自由也最不稳定 手机应用,通常不用于固定平板

configChanges 可以避免旋转时重建 Activity,写 orientation、screenSize、screenLayout、smallestScreenSize 即可。但声明了 configChanges,就要保证布局真的能随尺寸变化;否则界面会保持旧宽度,出现半屏空白或控件重叠。没有把握时让系统重建,再用 onSaveInstanceState 或 ViewModel 保存状态,行为更可预测。重建不是问题,重建后丢失用户位置才是问题。

启动背景最稳的做法是纯色底加居中 logo,用 layer-list 组合,logo 用 center 或 centerCrop,不随屏幕比例变形。整张位图铺满时,给平板单独准备 16:10 或 3:2 画布,放在 drawable-sw600dp-land;同时确认密度目录里没有旧图抢匹配。背景图不是越大越好,按目标平板的实际像素准备,避免无谓的内存开销。冷启动多等半秒,比拉伸变形更让人难受。

如果启动图是点九图,拉伸区要沿边缘画黑线,内容区不要压到装饰。反编译日志里偶尔出现“Could not find 9patch chunk… Renaming it to *.png”,这是工具对不规范点九图的标准兜底,改名后仍能回编,不影响产物;看到这行不用慌,但要在设备上确认拉伸后的边缘有没有毛刺。真有问题,换回普通位图加 centerCrop,通常比继续修点九图省事。

Android 12 以后,系统会先画一层统一的启动画面,再交给应用。应用如果还有一个自己的启动 Activity,就会出现两层。处理方式有两种:保留系统启动画面,把自有启动页做成和主页同色的过渡;或者让自有启动页的背景、图标位置和系统画面一致,视觉上接得上。不要在系统画面之后立刻放一张风格完全不同的广告图,用户会以为自己点错了应用。

启动图标也要按大屏检查。系统启动画面会把应用图标放在中间,图标本身如果带透明边,平板上看起来会偏小;自适应图标的前景层如果贴边,圆形遮罩下可能被裁掉。改图标时同时看桌面、最近任务和启动画面三处,不要只改一处。图标换新、启动背景还是旧色,是品牌感最容易被扣分的地方。

主题里的 windowBackground 是布局渲染前画的底色。把它设成和启动页主色一致,冷启动时就不会先闪白。状态栏和导航栏图标颜色要跟背景对比足够;浅色背景用深色图标,深色背景用浅色图标。横屏时系统栏位置会变,验收时横竖各看一次。有些设备在横屏时把手势条放到侧边,底边留白会突然变大,这不是布局错,是系统栏换了位置。

挖孔屏横屏时,挖孔可能在左上或右上。windowLayoutInDisplayCutoutMode 设为 shortEdges 可以让内容延伸到挖孔区,但必须给关键内容留安全边距;默认模式会在挖孔一侧留黑边,看起来像没适配。门店展示这类固定设备,可以接受黑边换稳定;手持设备建议延伸到边缘,再把内容避开采孔。两种选择都要在真机上确认,模拟器的挖孔位置经常和实机不一致。

验收启动页:冷启动三次,录屏逐帧看有没有翻转和跳色;在应用内旋转两次,看启动页是否重新出现、主页是否保持滚动位置;锁屏再解锁,看方向是否被系统锁回竖屏;分屏拖到一半,看布局是否溢出。每次改完启动页都重做这四项,不要只看一次。启动页的问题往往只在冷启动出现,热启动看不出来。录屏比肉眼可靠,逐帧看能抓到那一两帧的闪白。

平板启动页与横屏首页的衔接

图 5:启动页和首页方向一致,用户才不会看到“先竖后横”的翻转。

三个自家应用的改造记录:以前、现在与验收

原理讲完,下面记录三个真实场景的改法。三个应用分别属于自家团队、内部部门和已获授权的客户,改动都只涉及自有版权或授权范围内的资源与配置。每个实例按“以前怎么做、现在怎么做、改完怎么验证”展开,数值可以按你的项目替换,顺序和检查项可以直接照做。

实例一:自家记账 App 的内测版平板横屏

这是一个自有记账应用,手机端单列列表,平板上横屏后列表只占左侧 360dp,右侧大片空白;启动图是 1080×1920 竖图,横屏被拉成扁的;测试同事装的是不同人打的包,签名不一致,覆盖安装经常失败。以前的做法是用命令行反编译,手工改 layout 和 dimens,再依次回编、对齐、签名;一次改三处要来回打包二十分钟,签名有时用默认、有时用同事的 keystore,测试机上一半时间在卸载重装,账本测试数据也跟着没了。

现在把 APK 拖进智能修改电脑版,反编译完成后在需求框里写清楚:自有记账应用,目标 10 英寸平板横屏;新增 layout-sw600dp-land/activity_main.xml,左栏账户列表 320dp,右栏详情自适应,中间 24dp;values-sw600dp 里 page_margin 32dp、card_gap 12dp、list_row_height 80dp;启动页和主页都改 sensorLandscape;启动背景换成 1920×1200 的自有插画;应用名改成“XX 助手 内测版”;不要改数据库和记账逻辑。签名选公司 JKS,点立刻修改,AI 改完自动回编、对齐、签名、校验,再装到平板。

验证分六步:桌面图标和应用名是否为新版;冷启动看启动图有没有拉伸、有没有先竖后横;横屏主页左栏是否在 320dp 左右、右栏是否随窗口伸缩;点账户看右栏是否切换、返回键是否回到列表而不是退出;旋转到竖屏再转回,看选中账户是否保留;用 apksigner verify --print-certs 看证书是不是公司 JKS,再覆盖安装上一版,确认能升级、数据还在。六步全过,才把包发给测试同事。

实例二:内部巡检工具的横屏表单

内部巡检工具,平板固定在支架上横屏使用。底部导航占了 80dp 高度,表单输入框横跨 1200dp,一行字太长;状态栏图标是深色,压在深蓝背景上看不清;应用还连着测试环境接口。以前由一位同事在 Android Studio 里改一版,再打渠道包;每次调整导航位置都要等构建,现场反馈往往第二天才能改。工具本身能用,但迭代速度跟不上巡检节奏。

现在导入 APK,需求写成:自有内部工具,横屏锁定 landscape;底部导航改成左侧 96dp 导航栏,图标加文字;表单内容最大宽度 720dp,居中;状态栏和导航栏改成浅色图标,窗口背景用品牌深蓝;API 地址从测试域名切换到内网正式域名;versionCode 加一;加内部测试标识。AI 改资源与代码,回编后用内部 keystore 签名,装到支架上的平板。整个需求一次提交,改完在项目详情页能看到历史原文,下次要调整可以直接回填再改。

验证:导航是否在左侧、图标是否可点;表单在 1280dp 宽度下是否仍按 720dp 居中,输入时是否横向滚动;键盘弹出后内容是否被遮挡,能不能滚到最后一个字段;状态栏图标在深蓝背景上是否清晰;在关于页看版本号;提交一条测试数据,确认请求打到内网正式环境;最后用 dumpsys 或应用内日志确认前台 Activity 正确。巡检工具的表单字段多,键盘遮挡是最容易被忽略的一项,必须实际输入一遍。

实例三:已授权门店展示 App 的固定横屏

客户授权的门店展示应用,设备壁挂,永远横屏。应用启动时左右各有 90 像素黑边,启动图是竖版海报,看起来像电视信号不满屏。以前的做法是在系统设置里锁定横屏,再用一张海报盖住黑边;应用本身仍按手机比例渲染,换一台屏幕比例不同的设备就要重新做海报,维护成本很高。

现在导入 APK,需求写:已获授权的门店展示应用;只改平板横屏资源;新增 layout-sw600dp-land,根布局 match_parent,内容用 weight 分栏;启动页固定 landscape;启动背景改为 1920×1200 的授权活动图,layer-list 居中裁切;主题窗口背景同色;不要改展示内容和跳转逻辑。回编、签名、安装,整个过程在本地完成,活动图不出工作目录。

验证:重启设备三次,看黑边是否消失、启动图是否满屏不变形;断电再上电,看应用启动后是否仍横屏;检查内容区四角是否被裁掉;用手指点主要按钮,确认触控区没有被系统栏挡住;把设备换成另一台同分辨率平板,确认布局不依赖某一台机器。门店设备最怕“这次好了,下次换屏又坏”,所以至少用两台设备交叉验证。

三个自有应用的平板改造记录

图 6:实例的价值不在数值,而在“改哪一层、怎么验”的顺序。

装到平板之后:一份十四项验收清单

改完不等于做完,平板适配必须过一遍设备。下面按顺序检查,每项都写清通过标准。建议把这份清单打印出来,或者放进团队文档,每次发内测包前逐项打勾。返工最多的项目往往不是布局,而是签名、键盘遮挡和旋转丢状态这三类“看起来没问题”的细节。

  1. 安装与升级:覆盖安装上一版能成功,原有数据还在;如果提示签名冲突,先查 keystore,不要直接卸载。
  2. 图标与应用名:桌面、设置、最近任务里显示的都是新资源,没有旧图标残留。
  3. 冷启动首帧:连续冷启动三次,没有白闪、黑闪或明显跳色;录屏逐帧确认。
  4. 启动方向:启动页和主页方向一致,点击图标后没有先竖后横的翻转。
  5. 启动图比例:横屏满屏不变形,四角内容没有被裁掉;换一台比例不同的平板再看一次。
  6. 主页结构:横屏是两栏或侧栏结构,左栏宽度在 280dp 到 360dp 之间,右栏能伸展。
  7. 行宽与行高:正文不超过 760dp,列表行高不低于 72dp,标题没有被截断。
  8. 触控目标:主要按钮至少 48dp,平板建议 56dp;图标按钮的点击区不只是一张小图。
  9. 系统栏与挖孔:内容不被状态栏、导航栏、手势条或挖孔遮挡;横竖各看一次。
  10. 旋转:横竖切换两次,选中项、滚动位置、输入内容都还在,没有跳回首页。
  11. 分屏与小窗:窗口拖到一半时布局不溢出,能从两栏回到单栏;拖回全屏后结构恢复。
  12. 键盘:输入框不被键盘遮挡,能滚到提交按钮;键盘收起后页面没有留下大块空白。
  13. 返回行为:主从结构里按返回先回列表或退出详情,不会误退出应用;连续返回的行为符合预期。
  14. 签名与日志:pack.log 四步齐全,verify 通过,证书正确;apktool.log 没有未处理错误。

清单里最容易被跳过的是第 11 项分屏和第 12 项键盘。分屏要把应用拖到屏幕一半,观察两栏是否挤成一条缝;键盘要在最后一个输入框上弹出,确认提交按钮还能不能点到。两项都过,才算真正适配了“平板可能不是全屏使用”这个现实。

记录方式:每项留一张截图或一段录屏,文件名带版本号和日期;pack.log、apktool.log 一起归档。下次改版先跑同一份清单,能快速看出有没有回归。测试设备至少一台 10 英寸左右、横屏 1280dp 级的平板;有条件再加一台 8 英寸 600dp 级。两台都过,基本覆盖常见平板。不要只在模拟器上看,模拟器的密度、系统栏和挖孔行为与真机有差异。

如果时间只够做三项,优先做冷启动录屏、旋转状态保留和覆盖安装。这三项分别对应第一眼、日常使用和升级交付,任何一项失败,都会让前面的布局优化白费。其余项目可以在后续版本补齐,但不要跳过签名检查,签错一次可能让测试数据全部丢失。

改完没变化、闪退、黑边:六类问题的排查顺序

适配过程中最常见的问题不是“不会改”,而是“改了没反应”。下面按现象分类,给出排查顺序。每类都先查最可能、最容易验证的一项,不要一上来就重装工具或重写布局。改包是可回滚的,source.apk 在手,任何一次失败都不该演变成事故。

一、改完没变化

先查目录名和限定符是否匹配:平板是不是真的达到 sw600dp,横屏目录是不是写成了 layout-land。再全局搜索资源名,看是否存在同名资源在默认目录或密度目录里抢匹配。然后确认安装的是新包:版本号是否加一,是否被系统“应用未安装”静默回退。最后看 AI 的改动清单,确认它改的是你指定的文件,而不是另一个同名布局。

二、启动或进入页面闪退

先看 logcat 第一条崩溃栈,通常是资源找不到、XML 格式错误、控件 id 对不上,或者主题属性在旧系统上不存在。改包时最容易犯的错是删了旧布局里的控件,却在代码里继续引用;AI 改布局前,把“不要删除现有 id”写进需求。确认是这次改动引起后,直接用 source.apk 回滚,再把改动拆小,一次只改一类资源。

三、横屏仍有黑边

黑边可能来自应用固定了方向或宽高比,也可能来自系统的兼容模式。先看清单里有没有把 resizeableActivity 设为 false、有没有 maxAspectRatio 限制;再看应用是否强制竖屏,横屏时系统只能给它一个居中窗口。门店展示这类固定横屏应用,如果黑边来自系统栏,调主题和 insets;如果来自应用自身的比例限制,改清单和根布局。改完重启设备再看,有些兼容模式只在冷启动时生效。

四、图片糊或拉伸

糊通常是像素不够或命中了低密度图,拉伸是画布比例不对或 scaleType 用了 fitXY。先按目标平板的实际显示尺寸算需要多少像素,再决定放哪个目录;如果同一张图有多个候选,删到只剩一个,避免系统挑错。启动背景优先用纯色加居中 logo,整图铺满时用 centerCrop,不要用 fitXY 硬拉。

五、旋转后状态丢失

系统重建 Activity 是正常行为,丢状态才是问题。先确认代码有没有保存选中项、滚动位置和输入内容;如果用了 configChanges,确认布局真的适配了新尺寸,而不是保持旧宽度。主从结构还要保存“当前选中哪一条”,否则转屏后右栏回到空白,用户会以为数据丢了。

六、触控不灵或误触

先看点击目标是不是太小,再看有没有透明视图盖在上面,最后看系统栏区域是否吞掉了触摸。用“显示布局边界”检查控件实际范围;列表项里如果有按钮,给按钮单独留点击区,不要让整行和按钮抢事件。平板横屏时手指移动距离长,误触往往来自两个可点区域挨得太近,间距至少 8dp。

回滚策略贯穿始终:每次改之前保留 source.apk;一组改动一次回编,不要把资源、布局、启动页、业务代码混在一次需求里。出问题时能明确知道是哪一组引起。打包日志和反编译日志都留着,下一次遇到同样现象,能直接对照上次的改动。适配是工程活,不是一次灵感。

还有一种情况是“这版好了,下版又坏”。多个人同时改资源时,最容易出现同名目录各写一份。建议在项目里约定:平板资源只在一个分支或一个目录集合里维护,合并前先跑一遍清单;每次打包记录 versionCode 和改动摘要,出问题能定位到具体版本。改包工具能帮你回编签名,但版本纪律还是要团队自己定。

用户评价:平板适配之后,他们最先注意到什么

“以前平板横屏像把手机界面摊在桌上,现在左边列表右边详情,巡检时不用来回点。最明显的变化是现场同事愿意用了。”
—— 阿岚 · 企业 IT 运维
“启动图不再先竖后横,客户第一眼就说这个版本像专门给门店做的。黑边没了,海报也不用每次都重做。”
—— 小柯 · 门店运营
“我最满意的是签名统一了,测试机覆盖安装不用先卸载,账本数据保住了。以前每次换人打包都要重新装一遍。”
—— 老秦 · 独立开发者
“把 page_margin 抽成 dimens 之后,调平板间距只改一个文件,回编一次全站生效。比以前十几个布局里逐个找数字省太多。”
—— 林工 · Android 开发
“按清单验收比凭感觉靠谱,十四项过完再发内测,返工少了一半。冷启动录屏这一项抓出过两次跳色。”
—— 周姐 · 测试负责人

平板横屏适配没有神秘技巧,就是把资源、布局、方向三层拆开,一层层改、一层层验。资源限定符决定取哪套材料,布局决定材料怎么排,启动页和方向决定第一眼是否连贯。三层对齐,用户看到的就是一个自然的平板应用,而不是被拉宽的手机界面。

本文的步骤都在智能修改电脑版里完成:导入、反编译、写需求、AI 修改、回编、对齐、签名、安装。你也可以把同一套需求拆成更小的批次,一次只改一层,验收通过再进下一层。改包不是越快越好,而是每次改动都能解释、能回滚、能复现。做到这三点,平板适配就从一次性救火变成了可重复的日常维护。

最后再强调合规:只处理自有版权或已获授权的应用;请勿用于破解他人付费应用、去除授权校验或绕过安全机制。适配是为了让正常功能在大屏上更好用,不是绕过任何限制。给客户交付时,也把授权范围和改动记录留档,后续维护会轻松很多。

安卓修改大师智改工坊,官网 www.apkeditor.cn。想了解电脑版的工作流,可以打开 https://www.apkeditor.cn/ai-version.aspx 查看说明和下载。只需说话,就能让应用变成你想要的样子。

安卓修改大师智改工坊 · 下载

把平板适配放进下一次迭代

智能修改安卓版:在 ARM64 手机或平板上导入 APK,本地完成反编译、改包、回编、对齐与签名,成品可直接安装或分享。Android 10 及以上,首次使用按需下载运行环境。

立即下载

只用于自有版权或已获授权的应用,请勿用于破解或绕过安全机制。