adb常用命令

adb常用命令 1.adb devices , 获取设备列表及设备状态(adb -s 设备号 其他指令 adb -s devicel install xxx.apk) 2.adb get-state , 获取设备的状态 3.adb install 用于安装(此时需要用 -r 参数来重新安装。) 4.adb uninstall 用于卸载(adb uninstall 后面带的是应用的包名,而不是应用名。adb uninstall -k 表示保留数据) 5.adb shell pm list packages –f (查看系统所有应用的包名) 6.adb push 命令将PC机上的文件推到 DLT-RK3288 机器上; 7.adb pull 命令将DLT-RK3288机器上的文件拉到PC机上; { 例如: adb push d:/new.txt /sdcard/ 将D盘下new.txt文件 推到内部存储器 adb pull /sdcard/new.txt d:\ 将DLT-RK3288 内部存储器根目录下的new.txt 拉到D盘 } adb shell pm list package Package Manager , 可以用获取到一些安装在 Android 设备上得应用信息 -s:列出系统应用 -f:列出应用包名及对应的apk名及存放位置 9.adb shell { 通过adb shell 命令,就可以进入设备或者模拟器的shell环境了,在这个Linux shell中,我们就可以执行各种Linux命令了。 如果只想执行一条shell命令,就可以采用:adb shell [shell_command],在实际使用中,经常与grep或findstr一起使用,起到过滤作用,查看自己需要的关键信息。 常见命令: 如 ls, cd, rm, mkdir, touch, pwd, cp, mv, ifconfig, netstat, ping, ps, top等,进入adb shell即可执行,与linux相似 } 10.adb logcat { 一.在cmd窗口查看手机的Log日志 `有时候我们在手机程序上的日志要在其他地方调试,然后要看里面的Log日志。在cmd窗口中输入如下命令: //格式1:打印默认日志数据 ...

2020年8月13日 · 4 分钟 · 天边的星星

pod私有库制作过程

一、创建podspec索引仓库,创建源文件仓库 在自己私有git分别创建上述两个仓库,如果有则不用创建 二、将podspec索引仓库添加到本地pod repo 在终端执行下述命令即可 pod repo add xxxSpecs 仓库地址 注:** 1.**其中xxxSpecs为本地资源文件夹名称,建议与仓库名称一致 2.仓库地址是自己在第一步创建的索引仓库地址 三、克隆源文件仓库并编写项目源码 四.在工程目录下创建podspec文件(注:需在同级目录下创建一个LICENSE文件) 创建podspec文件 1.移动到源文件工程目录 cd XXX/XXXX/XXXXX 2.在该目录下执行创建podspec文件命令 pod spec create [name] 注:[name]就是项目名称 3.在远程仓库的同级目录下创建LICENSE文件 注:使用MIT模板 4.在本地仓库进行更新刚才在远程仓库创建的文件 五、podspec文件每个字段的含义 Pod::Spec.new do |s| s.name = “xxx” 开源库的名称 s.version = “0.0.17″ 开源库版本 s.summary = “xxxx” 摘要 s.description = «-DESC 描述 天利和工具类,里面具有时间,弹框,视图等处理方法 DESC s.homepage = “http://xxxx/ios/xxxxProduct” 开源库首页 s.license = “MIT” 开源库协议文件 # s.license = { :type => “MIT”, :file => “FILE_LICENSE” } ...

2019年4月9日 · 1 分钟 · 天边的星星

Android6.0运行时权限,拒绝了权限还返回获取成功

如题:禁用、询问的权限,居然还返回权限获取成功 推荐一个很好的项目:AndPermission 不用回来感谢了喂! 这个问题在项目中,一直存在, 主要是第三方厂商各种改,返回的状态不正常; 主要解决思路: 在第三方成功获取权限时, 再用系统原生的api去判断一下,是否真正获取了权限: /** 系统层的权限判断 @param context 上下文 @param permissions 申请的权限 Manifest.permission.READ_CONTACTS @return 是否有权限 :其中有一个获取不了就是失败了 */ public static boolean hasPermission(@NonNull Context context, @NonNull List permissions) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true; for (String permission : permissions) { String op = AppOpsManagerCompat.permissionToOp(permission); if (TextUtils.isEmpty(op)) continue; int result = AppOpsManagerCompat.noteProxyOp(context, op, context.getPackageName()); if (result == AppOpsManagerCompat.MODE_IGNORED) return false; result = ContextCompat.checkSelfPermission(context, permission); if (result != PackageManager.PERMISSION_GRANTED) return false; } return true; } ...

2019年1月26日 · 3 分钟 · 天边的星星

Xcode 10 beta3 Error: Multiple commands produce

最近开发一直在使用Xcode10 beta版本的,今天升级到Xcode10 beta3,但是在编译项目时编译失败,报错内容: <div class="image-view" data-width="1326" data-height="390"> ![](//upload-images.jianshu.io/upload_images/2135374-e38dfa85c14dbcd3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp) </div> </div> <div class="image-caption"> 屏幕快照 2018-07-09 上午10.28.06.png </div> `error: Multiple commands produce &lt;span class="hljs-string">'/Users/xiaoyuan/Library/Developer/Xcode/DerivedData/Boobuz-gnxeuntgkenwgdgycqnvabqubafh/Build/Products/Debug-iphoneos/Boobuz.app'&lt;/span>: 1) Target &lt;span class="hljs-string">'Boobuz'&lt;/span> has create directory &lt;span class="hljs-built_in">command&lt;/span> with output &lt;span class="hljs-string">'/Users/xiaoyuan/Library/Developer/Xcode/DerivedData/Boobuz-gnxeuntgkenwgdgycqnvabqubafh/Build/Products/Debug-iphoneos/Boobuz.app'&lt;/span> 2) That &lt;span class="hljs-built_in">command&lt;/span> depends on &lt;span class="hljs-built_in">command&lt;/span> &lt;span class="hljs-keyword">in&lt;/span> Target &lt;span class="hljs-string">'Boobuz'&lt;/span>: script phase “[CP] Copy Pods Resources” ` 引用简友[guifu_tang](/u/3b14b90a886f)的一句话原因是Xcode 10 默认使用的build system是New build system,与Xcode9不同导致。 - 第一种方法 不修改build system 分析build error 日志,错误发生在Copy Pods Resources,而且与output有关,应该是使用了cocoapods导致的,尝试删除该项目target-Copy Pods Resources-Output Files,成功解决问题。 ...

2019年1月1日 · 1 分钟 · 天边的星星

Android图片之处理圆形圆角

# 概述 图片格式概述: BMP:高质量绘图 保证原图质量,用于相机等 BMP格式图片是有一个一个的像素点组成,每一个像素都是一个颜色.而每一个像素显示的颜色用的二进制位也不相同,这个像素位称之为位深,位深越大,表示每一个像素点所用的二进制位越多,显示的图像也就越清晰。 png:较高质量绘图 体积小,适用于网络传输 png图片是将bmp图片进行压缩,其压缩格式类似于rar压缩——将相同的byte信息合并表示。png图片可以还原,是无损的压缩方式。 jpg:良好的绘图质量 体积小,便于传输 jpg格式图片也是对bmp图片进行压缩,因为眼睛的精度是有限的,jpg利用这一点将很多颜色相近的用同一颜色标识,而对于一大块相同的颜色,则用一个值表示。jpg格式图片不能被还原。 ## 加载大图 <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` hr && wr>1){ r = wr; } if(hr>wr && hr>1){ r = hr; } //压缩图片 options.inSampleSize = r;//设置压缩比 options.inJustDecodeBounds = false;//设置加载图片内容 Bitmap bm = BitmapFactory.decodeFile(path,options); iv.setImageBitmap(bm); " data-snippet-id=“ext.f5fc8efb9581248b791731039403eb80” data-snippet-saved=“false” data-codota-status=“done”>`ImageView iv = (ImageView) findViewById(R.id.iv); <span class=“hljs-comment”>/** 在Android中,每一个应用程序所占用的内存空间大小都会有一个固定的大小限制 假设此处加载的图片是2560*1440像素,图片位深是24的jpg格式图像 虽然此图占用的磁盘空间是1.3M,但图片在加载到内存中时,实际上会先转换成位图图像 那么这张图片加载到内存中的大小就是2560144032(位深24,windows系统中,使用24位字节表示一个颜色值:#000000, 但在Android中,每一个颜色值是用32位字节表示一个颜色值:#00000000),因此,这张图片加载到内存中所需要占用的内存 大小约为:14M,因此,占用内存是极大的.若是直接将图片加载到内存中,容易造成内存溢出 解决方案:按比例压缩图片 *按比例压缩图片首先就是要获取图片的大小 */</span> String path = <span class=“hljs-string”>“mnt/sdcard/1.jpg”</span>; <span class=“hljs-comment”>//用于设置图片渲染器参数</span> BitmapFactory.Options options = <span class=“hljs-keyword”>new</span> Options(); <span class=“hljs-comment”>//设置图片加载属性:不加载图片内容,只获取图片信息</span> options.inJustDecodeBounds = <span class=“hljs-literal”>true</span>; <span class=“hljs-comment”>//加载图片信息</span> BitmapFactory.decodeFile(path,options); <span class=“hljs-comment”>//获取图片宽高</span> <span class=“hljs-keyword”>int</span> picwidth = options.outWidth; <span class=“hljs-keyword”>int</span> picheight = options.outHeight; <span class=“hljs-comment”>//获取屏幕大小</span> <span class=“hljs-comment”>//获取窗口管理器</span> WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); <span class=“hljs-comment”>//获取默认显示设备</span> Display dis =wm.getDefaultDisplay(); <span class=“hljs-comment”>//获取屏幕宽高</span> <span class=“hljs-comment”>//dis.getSize(outSize);此方法适用于新版本Android系统</span> <span class=“hljs-keyword”>int</span> diswidth = dis.getWidth(); <span class=“hljs-keyword”>int</span> disheight = dis.getHeight(); <span class=“hljs-comment”>//计算压缩比</span> <span class=“hljs-keyword”>int</span> wr = picwidth/diswidth; <span class=“hljs-keyword”>int</span> hr = picheight/disheight; <span class=“hljs-keyword”>int</span> r = <span class=“hljs-number”>1</span>; <span class=“hljs-keyword”>if</span>(wr>hr && wr><span class=“hljs-number”>1</span>){ r = wr; } <span class=“hljs-keyword”>if</span>(hr>wr && hr><span class=“hljs-number”>1</span>){ r = hr; } <span class=“hljs-comment”>//压缩图片</span> options.inSampleSize = r;<span class=“hljs-comment”>//设置压缩比</span> options.inJustDecodeBounds = <span class=“hljs-literal”>false</span>;<span class=“hljs-comment”>//设置加载图片内容</span> Bitmap bm = BitmapFactory.decodeFile(path,options); iv.setImageBitmap(bm); ` ...

2018年12月23日 · 6 分钟 · 天边的星星

Retrofit2 使用FastJson作为Converter

Retortfit2 Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,网络服务基于OkHttp 。 个人觉得更为准确的说法是,Retrofit是OkHttp的一个包装工具类,可以更加方便的调用Restful API。 Retrofit2 默认提供的Converter Gson: com.squareup.retrofit2:converter-gson Jackson: com.squareup.retrofit2:converter-jackson Moshi: com.squareup.retrofit2:converter-moshi Protobuf: com.squareup.retrofit2:converter-protobuf Wire: com.squareup.retrofit2:converter-wire Simple XML: com.squareup.retrofit2:converter-simplexml Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars 下面就来讲解如何扩展Converter 首先创建FastJsonConverterFactory 类,并继承Converter.Factory,重写其中的responseBodyConverter方法与requestBodyConverter方法。 import java.lang.annotation.Annotation; import java.lang.reflect.Type; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.Converter; import retrofit2.Retrofit; public class FastJsonConverterFactory extends Converter.Factory{ public static FastJsonConverterFactory create() { return new FastJsonConverterFactory(); } /** 需要重写父类中responseBodyConverter,该方法用来转换服务器返回数据 */ @Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { return new FastJsonResponseBodyConverter<>(type); } /** ...

2018年11月24日 · 1 分钟 · 天边的星星

使用BottomNavigationView底部导航栏、添加数量角标提醒

度娘了一圈发现基本上都是TabLayout或者其他的导航栏添加角标,所以写这篇博客记录下来。 先来看下实现的效果图: 代码也是很简单的 BottomNavigationMenuView中的每一个Tab就是一个FrameLayout,所以我们可以在上面随意添加View、这样也就可以实现我们的角标了。 //获取整个的NavigationView BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0); //这里就是获取所添加的每一个Tab(或者叫menu), View tab = menuView.getChildAt(3); BottomNavigationItemView itemView = (BottomNavigationItemView) tab; //加载我们的角标View,新创建的一个布局 View badge = LayoutInflater.from(this).inflate(R.layout.menu_badge, menuView, false); //添加到Tab上 itemView.addView(badge); menu_badge.xml file: 这里这个布局的大小,其实也就是每一个Tab的大小了。把显示数量的TextView水平居中,这样也就刚好在Tab的中间了(剩下就看你自己想怎么放了….) <?xml version=”1.0″ encoding=”utf-8″?> <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical”> <TextView android:id=”@+id/tv_msg_count” android:layout_width=”15dp” android:layout_height=”15dp” android:layout_gravity=”center” android:layout_marginLeft=”@dimen/dp_10″ android:layout_marginTop=”@dimen/dp_3″ android:background=”@drawable/bg_red_circle_10″ android:gravity=”center” android:textColor=”@color/white” android:textSize=”@dimen/sp_12″ android:visibility=”gone” /> 设置角标的数量 TextView count = (TextView) badge.findViewById(R.id.tv_msg_count); count.setText(String.valueOf(1)); //如果没有消息,不需要显示的时候那只需要将它隐藏即可 count.setVisibility(View.GONE); - 在点击事件中完成各个menu的点击事件,实现Fragment的替换,另外三个点击事件内容类似 <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` `<span class=“hljs-comment”>// 去掉menu大于3个后的动画</span> BottomNavigationViewHelper.disableShiftMode(bottomNavigationView); ...

2018年11月11日 · 2 分钟 · 天边的星星

Android studio项目java文件过大导致的问题记录

最近在做一个项目的时候,出现了一个很奇怪的问题,我的java文件前面出现了一个奇怪的蓝色j, 这使得我的代码其他地方无法对它进行调用,所以程序一运行,调用到它的地方就会报错,(因为我的这个代码是用protobuffer协议自动生成的java文件,比较大,大概有5M多)。 后来上网查了一下,发现是IDEA对能关联的文件大小做了限制,主要是为了保护内存,默认值为2500kb或者5000kb,对于一般的java文件也够用了,只是这里我用protocbuf生成的java文件过大,所以要对它这个默认的值进行修改。 找到Android studio 的安装目录下bin 下的idea.properties文件(默认安装路径:C:\Program Files\Android\Android Studio\bin)。 打开这个文件,对里面的idea.max.intellisense.filesizej进行设置,保存( 单位是kb) 然后重启Android studio即可。

2018年10月28日 · 1 分钟 · 天边的星星

解决 Mac OSX 无法识别 Android 设备

在终端输入命令,进入用户目录 ``` $ cd ~ ``` 测试adb,开启终端,输入命令,显示出”Android Debug Bridge version 1.0.39″ 为配置成功 ``` $ adb version ``` 第二步工作是:创建、修改 adb_usb.ini 文件,这里也分为2小步 打开终端,输入命令,查看设备信息 ``` $ system_profiler SPUSBDataType ``` 1.2 得到自己对应的设备信息,其中Vendor ID 中的信息,需要保留,等下使用 ``` SAMSUNG_Android: Product ID: 0x6753 Vendor ID: 0x05e4 (Samsung Electronics Co., Ltd.) Version: 6.00 Serial Number: 7d0076027c174055 Speed: Up to 420 Mb/sec Manufacturer: SAMSUNG Location ID: 0x13200000 / 10 Current Available (mA): 400 Current Required (mA): 86 Extra Operating Current (mA): 0 </div> 2.创建、修改adb_usb.ini文件,可以在终端输入命令,也可以查找文件 2.1 查找adb_usb.ini文件 2.1.1输入命令 <div class="cnblogs_code"> vi ~/.android/adb_usb.ini ...

2018年10月19日 · 1 分钟 · 天边的星星

Android动态化框架App Bundles

摘要: Android App Bundles 在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),与Instant App不同,AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。 ## Android App Bundles 在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),与Instant App不同,AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。现在只须在 Android Studio 中构建一个应用束 (app bundle),就可以将应用所需的全部内容 (适用于所有设备) 都涵盖在内:所有语言、所有设备屏幕大小、所有硬件架构。 下面是Dynamic Delivery示意效果图: 不过要想体验Dynamic Delivery,需要先下载 Android Studio 3.2 学习Android App Bundles可以将它和Split Apks来对比学习。 Split Apks split apks是Android 5.0开始提供多apk构建机制,借助split apks可以将一个apk基于ABI和屏幕密度两个维度拆分城多个apk,这样可以有效减少apk体积。当用户下载应用程序安装包时,只会包含对应平台的so和资源。因为需要google play支持,所以国内就没戏了。针对不同cpu架构问题,国内应用开发商大部分都会将so文件只放在armabi目录下,如此做虽然可以有效减少包体积,但可能带来性能问题。split apks详细的内容可以访问下面的链接:[https://link.zhihu.com/?target=https%3A//developer.android.com/studio/build/configure-apk-splits%3Fauthuser%3D2](https://link.zhihu.com/?target=https%3A//developer.android.com/studio/build/configure-apk-splits%3Fauthuser%3D2) Split Apks的运作原理有点类似于Android的组件化,安装应用程序时,首先安装base apk,然后安装split apks。为了说明splite apks运作原理,来看一下Android 5.0关于splite apks的源码。 打开[ApplicationInfo](http://androidxref.com/5.0.0_r2/xref/frameworks/base/core/java/android/content/pm/ApplicationInfo.java)类中,可以看到如下信息: `/** * Full paths to zero &lt;span class="hljs-keyword">or&lt;/span> more &lt;span class="hljs-keyword">split&lt;/span> APKs that, &lt;span class="hljs-keyword">when&lt;/span> combined with the base * APK &lt;span class="hljs-keyword">defined&lt;/span> in {@link &lt;span class="hljs-comment">#sourceDir}, form a complete application.&lt;/span> *&lt;span class="hljs-regexp">/ public String[] splitSourceDirs; /&lt;/span>** * Full path to the publicly available parts of {@link &lt;span class="hljs-comment">#splitSourceDirs},&lt;/span> * including resources &lt;span class="hljs-keyword">and&lt;/span> manifest. This may be different from * {@link &lt;span class="hljs-comment">#splitSourceDirs} if an application is forward locked.&lt;/span> *&lt;span class="hljs-regexp">/ public String[] splitPublicSourceDirs;&lt;/span>` [LoadeApk](http://androidxref.com/5.0.0_r2/xref/frameworks/base/core/java/android/app/LoadedApk.java)中有PathClassLoader和Resources创建过程。LoadedApk#mClassLoader是PathClassLoader实例引用,接着看PathClassLoader的创建过程。 zipPaths = new ArrayList<>(); final ArrayList<String> libPaths = new ArrayList<>(); ....... zipPaths.add(mAppDir); //将split apk路径追加到zipPaths中 if (mSplitAppDirs != null) { Collections.addAll(zipPaths, mSplitAppDirs); } libPaths.add(mLibDir); ...... final String zip = TextUtils.join(File.pathSeparator, zipPaths); final String lib = TextUtils.join(File.pathSeparator, libPaths); ...... //如果mSplitAppDirs不为空,则zip将包含split apps所有路径。 mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, lib, mBaseClassLoader); StrictMode.setThreadPolicy(oldPolicy); } else { if (mBaseClassLoader == null) { mClassLoader = ClassLoader.getSystemClassLoader(); } else { mClassLoader = mBaseClassLoader; } } return mClassLoader; } }" data-snippet-id="ext.b0abcb7003a3d76aeb1ae260fba2afe7" data-snippet-saved="false" data-codota-status="done">`&lt;span class="hljs-function">&lt;span class="hljs-keyword">public&lt;/span> ClassLoader &lt;span class="hljs-title">getClassLoader&lt;/span>&lt;span class="hljs-params">()&lt;/span> &lt;/span>{ &lt;span class="hljs-keyword">synchronized&lt;/span> (&lt;span class="hljs-keyword">this&lt;/span>) { &lt;span class="hljs-keyword">if&lt;/span> (mClassLoader != &lt;span class="hljs-keyword">null&lt;/span>) { &lt;span class="hljs-keyword">return&lt;/span> mClassLoader; } &lt;span class="hljs-keyword">if&lt;/span> (mIncludeCode && !mPackageName.equals(&lt;span class="hljs-string">"android"&lt;/span>)) { ...... &lt;span class="hljs-keyword">final&lt;/span> ArrayList&lt;String&gt; zipPaths = &lt;span class="hljs-keyword">new&lt;/span> ArrayList&lt;&gt;(); &lt;span class="hljs-keyword">final&lt;/span> ArrayList&lt;String&gt; libPaths = &lt;span class="hljs-keyword">new&lt;/span> ArrayList&lt;&gt;(); ....... zipPaths.add(mAppDir); &lt;span class="hljs-comment">//将split apk路径追加到zipPaths中&lt;/span> &lt;span class="hljs-keyword">if&lt;/span> (mSplitAppDirs != &lt;span class="hljs-keyword">null&lt;/span>) { Collections.addAll(zipPaths, mSplitAppDirs); } libPaths.add(mLibDir); ...... &lt;span class="hljs-keyword">final&lt;/span> String zip = TextUtils.join(File.pathSeparator, zipPaths); &lt;span class="hljs-keyword">final&lt;/span> String lib = TextUtils.join(File.pathSeparator, libPaths); ...... &lt;span class="hljs-comment">//如果mSplitAppDirs不为空,则zip将包含split apps所有路径。&lt;/span> mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, lib, mBaseClassLoader); StrictMode.setThreadPolicy(oldPolicy); } &lt;span class="hljs-keyword">else&lt;/span> { &lt;span class="hljs-keyword">if&lt;/span> (mBaseClassLoader == &lt;span class="hljs-keyword">null&lt;/span>) { mClassLoader = ClassLoader.getSystemClassLoader(); } &lt;span class="hljs-keyword">else&lt;/span> { mClassLoader = mBaseClassLoader; } } &lt;span class="hljs-keyword">return&lt;/span> mClassLoader; } }` 在创建PathClassLoader时,dex文件路径包含base app和split apps路径,LoadedApk#mResources是Resources实例引用,Resources的源码如下: `&lt;span class="hljs-function">&lt;span class="hljs-keyword">public&lt;/span> Resources &lt;span class="hljs-title">getResources&lt;/span>(&lt;span class="hljs-params">ActivityThread mainThread&lt;/span>) &lt;/span>{ &lt;span class="hljs-keyword">if&lt;/span> (mResources == &lt;span class="hljs-literal">null&lt;/span>) { mResources = mainThread.getTopLevelResources(mResDir, mSplitResDirs, mOverlayDirs, mApplicationInfo.sharedLibraryFiles, Display.DEFAULT_DISPLAY, &lt;span class="hljs-literal">null&lt;/span>, &lt;span class="hljs-keyword">this&lt;/span>); } &lt;span class="hljs-keyword">return&lt;/span> mResources; }` 可以发现:split apks资源路径(LoadedApk#mSplitResDirs)也会被增加至Resources中。 Android App Bundles 下面再来看Android App Bundles,Android App Bundle 支持模块化,通过Dynamic Delivery with split APKs,将一个apk拆分成多个apk,按需加载(包括加载C/C++ libraries),这样开发者可以随时按需交付功能,而不是仅限在安装过程中。 Android App Bundle 通常会包括以下几个文件: - Base Apk:首次安装的apk,公共代码和资源,所以其他的模块都基于Base Apk; - Configuration APKs:native libraries 和适配当前手机屏幕分辨率的资源; - Dynamic feature APKs:不需要在首次安装就加载的模块。 ![这里写图片描述](https://img-blog.csdn.net/20180516221843565) AAB并不是一个插件化框架,它利用的是Android Framework提供的split apks技术来完成的,而所有安装split apk工作均是通过IPC交由google play完成。 具体使用时,在Android Studio新增一项module——Dynamic Feature Module。 在创建dynamic_feature时,有两个选项是默认勾选的,当然我们也可以更改其状态。 ...

2018年10月16日 · 4 分钟 · 天边的星星