标签: Android 项目

Android 测试环境噪音分贝

前言:

*近做工具类项目,手机上小工具各种,有一个测量环境噪音分贝值的,个人对机车码表式显示忠爱(有点机车情节),网上和Android APP market 转了一圈尽没发现让人心动了。所以只能自己动手,做图,做定义控件去实现。

具体实现如下:

素材准备:

%title插图%num

自定义控件 xml

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:gravity=”center”
android:orientation=”vertical”>

<ImageView
android:id=”@+id/panel”
android:layout_width=”300dp”
android:layout_height=”300dp”
android:layout_centerHorizontal=”true”
android:layout_centerVertical=”true”
android:scaleType=”fitCenter”
android:src=”@drawable/panel__green” />

<ImageView
android:id=”@+id/pointer”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:layout_centerInParent=”true”
android:layout_gravity=”center_horizontal”
android:alpha=”0.8″
android:scaleType=”centerInside”
android:src=”@drawable/pointer” />

<LinearLayout
android:layout_centerHorizontal=”true”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:paddingTop=”50dp”
android:layout_centerVertical=”true”>

<TextView
android:id=”@+id/value”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:text=”welcome to use Nosy test !” />

<TextView
android:id=”@+id/maxvalue”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:paddingLeft=”20dp”
android:text=”MAX:” />
</LinearLayout>

</RelativeLayout>

自定义控件类:核心思路其实就是对ImageView 图片的旋转

public class PlateView extends RelativeLayout {
public void setmMaxValue(double mMaxValue) {
this.mMaxValue = mMaxValue;
}

private double mMaxValue =0;
private ImageView mPanel;
private ImageView mPointer;
private TextView textView;
private TextView maxTextView;
private Matrix matrix = new Matrix();
private Context mContext;
private double mLastValue = 50;

public double getValue() {
return value;
}

public void setValue(double value) {
mLastValue = this.value;
this.value = value;
if(Math.abs(mMaxValue)<Math.abs(this.value)){
mMaxValue = this.value;
}
show();
}

private double value = 50;

public PlateView(Context context) {
super(context);
}

public PlateView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
LayoutInflater layoutInflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.plate, this);
mPanel = (ImageView) findViewById(R.id.panel);
mPointer = (ImageView) findViewById(R.id.pointer);
textView=(TextView) findViewById(R.id.value);
maxTextView=(TextView) findViewById(R.id.maxvalue);
show();
}

public void show() {

float rotate = (float) (getValue() – this.mLastValue);
if (Math.abs(rotate) > 0.1) {
mPointer.setScaleType(ImageView.ScaleType.MATRIX); //required
matrix.postRotate(rotate*8/5, mPointer.getWidth() / 2, mPointer.getHeight() / 2);
mPointer.setImageMatrix(matrix);
textView.setText(getValueText(getValue()));
maxTextView.setText(“MAX:”+getValueText(this.mMaxValue));
invalidate();
requestLayout();
}

}

private String getValueText(double value){
value+=0.0000001;
String sRes =value+””;
if(sRes.contains(“.”)){
sRes = sRes.substring(0,sRes.indexOf(“.”)+3);
}
return sRes;
}

public int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}

}

分贝测量类:
public class AudioRecordDemo {

private static final String TAG = “AudioRecord”;
static final int SAMPLE_RATE_IN_HZ = 8000;
static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord mAudioRecord;
boolean isGetVoiceRun;
Object mLock;
private WeakReference<MainActivity> mActivity;

public AudioRecordDemo(MainActivity activity) {
mLock = new Object();
mActivity = new WeakReference<>(activity);
}

public void sotp() {
this.isGetVoiceRun = false;
}

public void getNoiseLevel() {
if (isGetVoiceRun) {
return;
}
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
if (mAudioRecord == null) {
}
isGetVoiceRun = true;

new Thread(new Runnable() {
@Override
public void run() {
mAudioRecord.startRecording();
short[] buffer = new short[BUFFER_SIZE];
final MainActivity activity = mActivity.get();
while (isGetVoiceRun) {
int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);
long v = 0;
for (int i = 0; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}
double mean = v / (double) r;
final double volume = 10 * Math.log10(mean);
Log.d(TAG, “db value:” + volume);
if (null != activity) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.plateView.setValue(volume);
}
});
}
// 大概一秒十次
synchronized (mLock) {
try {
mLock.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
if (null != activity) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.plateView.setmMaxValue(0);
activity.plateView.setValue(1);
}
});
}
}
}).start();
}
}

记得加入Manifest 权限:
<uses-permission android:name=”android.permission.RECORD_AUDIO” />

Layout使用控件:
<com.asus.function.antitouch.sound.PlateView
android:id=”@+id/soundplate”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_below=”@+id/start”/>

Activity中代码:
audioRecordDemo = new AudioRecordDemo(this);
plateView = (PlateView) findViewById(R.id.soundplate);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (start.getText().toString().equalsIgnoreCase(STOP)) {
audioRecordDemo.sotp();
start.setText(START);
} else {
audioRecordDemo.getNoiseLevel();
start.setText(STOP);
}
}
});
}

APP 效果图:

%title插图%num
结语:

图片素材质量差了些,但效果算达到预期,由于声音分贝值本身变化是线性的,所以即使这里我没有加入动画效果,指针的转动线性也是令人可以接受的。另外可惜没做好gif 图档上传。

————————————————

Android 项目中用得*多*火的第三方框架可能都在这里了!

平时总会发现一些大家都比较推崇的第三方框架,觉得非常不错暂时又用不到,于是就打算把它们都收藏起来,需要用到的时候就不用到处问到处搜了。收藏得多了,本着热爱分享拥抱开源的思想,于是贴出来给大家分享交流。如有纰漏,敬请拍砖指正。

欢迎众收藏爱好者补充或指正!

 

分类 二级分类 框架名称 简介 Star 数 *近
更新
UI 刷新 SmartRefreshLayout 智能下拉刷新框架 11k 1天
UI 刷新 Android-PullToRefresh 比较早的一款下拉刷新框架 8.6k 5年
UI 刷新 android-Ultra-Pull-To-Refresh 下拉刷新框架 9.0k 2年
UI 刷新 BeautifulRefreshLayout 众多优秀的下拉刷新汇总 2.0k 2年
UI 图表 MPAndroidChart 统计图表库 21k 1天
UI 图表 hellocharts-android 统计图表库 5.7k 1月
UI 图表 smartTable 自动生成表格框架 1.7k 23天
UI 图表 AdaptiveTableLayout 可阅读与编辑CSV文件的库 1.4k 8月
UI 图表 TableView 绘制表格 1.5k 4天
UI 菜单 SlidingMenu 比较早的一款侧滑菜单 10k 4年
UI 菜单 MaterialDrawer 侧滑菜单 9.1k 1月
UI 菜单 SwipeBackLayout 类似QQ侧滑菜单 5.0k 8天
UI 图片 PhotoView 大图展示 12k 3月
UI 图片 subsampling-scale-image-view 大图展示 4.0k 1月
UI 图片 CircleImageView 圆形图片 9.6k 1月
UI 图片 uCrop 图片剪裁 7.0k 24天
UI 图片 android-gif-drawable Gif 加载 6.0k 3天
UI 图片 Matisse 图片\视频选择库 6.7k 1天
UI 文本 richeditor-android 富文本编辑器 3.7k 1年
UI 弹窗 material-dialogs 可定制化的 Dialog API 13k 12天
UI 弹窗 Toasty 定制不一样的 Toast 4.1k 11天
UI 弹窗 DialogUtil Dialog 工具 0.7k 15天
UI 弹窗 android-adDialog 广告弹窗 2.3k 1年
UI 导航 ViewPagerIndicator ViewPager 指示器 9.7k 5年
UI 导航 BottomBar 底部导航栏 7.7k 4月
UI 导航 FlycoTabLayout TabLayout 库 6.3k 1年
UI 布局 flexbox-layout Android 弹性 / 流式布局 11k 1月
UI 布局 AndroidAutoLayout 屏幕适配布局 6.0k 10月
UI 布局 FlowLayout 流式布局 3.6k 1月
UI 布局 vlayout 整套布局方案和组件复用 7.8k 23天
UI 滑动删除 AndroidSwipeLayout 滑动删除 9.9k 9月
UI 滚动 Android-ObservableScrollView 监听可滚动 View 的滚动事件 8.7k 2年
UI 列表 UltimateRecyclerView 功能强大的 RecyclerView 6.5k 1月
UI 选择器 Android-PickerView 仿 iOS 的选择控件 7.1k 19天
UI 选择器 AndroidPicker 安卓选择器类库 3.5k 3月
UI 下拉菜单 DropDownMenu 多条件筛选菜单 2.7k 1年
UI 轮播图 banner 广告图片轮播控件 5.8k 4月
UI 轮播图 Android-ConvenientBanner 通用的广告栏控件 3.5k 5天
UI WebView AgentWeb 高度封装的 WebView 3.6k 14天
UI 高斯模糊 500px-android-blur 高斯模糊控件 2.2k 1年
UI 高斯模糊 BlurKit-Android 高斯模糊控件 2.3k 1年
UI 角标 android-viewbadger 角标 / 徽章 2.9k 5年
UI 角标 BGABadgeView-Android 徽章控件 1.9k 24天
UI 其他 AndroidSlidingUpPanel 上拉面板 7.5k 7月
UI 其他 AppIntro 欢迎页 7.6k 1月
UI 其他 Android-Bootstrap UI框架 6.6k 9月
UI 其他 emojicon 表情文本 3.2k 9月
UI 其他 RippleEffect 水波纹效果 4.6k 2年
UI 其他 InfiniteCycleViewPager ViewPager 4.7k 8月
UI 其他 LoadingDrawable 酷炫的加载动画 3.2k 1年
UI 其他 QMUI_Android 提高 UI 开发效率的 UI 库 4.7k 5天
网络 框架 retrofit 网络框架 27k 16天
网络 框架 okhttp 网络框架 26k 6天
网络 框架 volley 网络框架 1.5k 9天
网络 文件下载 FileDownloader 文件下载引擎 6.5k 13天
网络 进度监听 ProgressManager okhttp 上传下载进度监听 1.5k 5天
图片 框架 glide 图片框架 21k 8天
图片 框架 Android-Universal-Image-Loader 图片框架 16k 2年
图片 框架 picasso 图片框架 15k 14天
图片 框架 fresco 图片框架 14k 6天
图片 压缩 Luban *接近朋友圈的图片压缩算法 7.4k 9天
图片 滤镜 android-gpuimage 图像滤镜框架 4.8k 2年
图片 转换 glide-transformations Glide 图像转换器 6.0k 11天
图片 选择器 Matisse 图片视频选择器 6.7k 1天
图片 选择器 TakePhoto 图片选择 / 剪裁 / 压缩 4.8k 1月
图片 选择器 PhotoPicker 仿微信图片选择器 2.5k 4月
图片 文字识别 tess-two Android 图片文字识别 2.5k 13天
视频 播放器 JieCaoVideoPlayer 节操视频播放器 6.6k 6天
视频 播放器 ijkplayer Bilibili 开源播放器 18k 2月
视频 播放器 GSYVideoPlayer 多功能视频播放器 5.7k 8天
动画 AE lottie-android 展示 AE 工具所作动画的框架 20k 13天
动画 转场 Material-Animations 安卓转场动画演示 11k 3月
动画 View AndroidViewAnimations 安卓视图动画合集 9.3k 9月
动画 多种 animate 多种动画效果 2.8k 2年
动画 列表 recyclerview-animators RecyclerView 条目动画 7.8k 2月
动画 列表 spruce-android 列表视图展现动画 2.6k 3月
动画 粒子 Grav 粒子动画效果 2.2k 1年
动画 爆炸 ExplosionField 爆裂动画效果 3.1k 2年
动画 兼容 Transitions-Everywhere Transitions API 的兼容补丁 3.7k 2月
异步 链式 RxAndroid Android 中的 RxJava 绑定 15k 2月
异步 链式 RxJava 事件驱动的基于异步数据流的编程模式 32k 2天
异步 链式 agera 谷歌开发的安卓链式编程框架 7.0k 2月
数据库 轻量级 realm-java 轻量级数据库 9.4k 3天
数据库 轻量级 greenDAO 轻量级数据库 9.8k 16天
文件 选择器 Android-FilePicker 图片 / 文件选择器 1.4k 19天
json 解析 gson 谷歌官方 Json 库 12k 2天
json 解析 fastjson 阿里巴巴 Json 库 13k 1天
字体 框架 Calligraphy 自定义字体库 7.6k 11月
语言 汉字处理 HanLP 中文分词 、关键词提取等 6.8k 2天
性能 卡顿 AndroidPerformanceMonitor 非侵入式性能监控组件 4.0k 8月
性能 卡顿 BlockCanaryEx UI 卡顿检测 1.7k 8月
性能 卡顿 AndroidDevMetrics 性能检测 1.3k 2月
性能 内存 leakcanary 检查内存泄漏工具 19k 8天
性能 生命周期 RxLifecycle 使用 RxJava 管理生命周期 5.5k 2月
性能 缓存 DiskLruCache 硬盘缓存工具 4.3k 1年
性能 UI框架 litho 高性能安卓 UI 的构建框架 4.8k 1天
热修复 框架 tinker 微信热修复框架 11k 24天
热修复 框架 dexposed 阿里热修复框架 3.8k 2年
插件化 框架 DroidPlugin 360 插件化框架 5.6k 7月
插件化 框架 dynamic-load-apk Apk动态加载框架 5.2k 10月
插件化 框架 atlas 阿里插件化框架 5.9k 5月
插件化 框架 Small 插件化框架 4.1k 9天
工具 工具类 AndroidUtilCode 安卓开发者不得不收集的代码 17k 1天
工具 工具类 android-common 不只是工具类的公共库 4.6k 1年
工具 工具类 android-common 通用 / 辅助 / 工具类的集合 2.9k 11月
工具 工具类 Lazy 常用工具类整理 1.6k 7月
工具 列表 BaseRecyclerViewAdapterHelper RecyclerAdapter 框架 13k 21天
工具 列表 baseAdapter Android 万能的 Adapter 3.7k 1年
工具 列表 FanLayoutManager 风扇扇叶旋转效果列表 1.7k 8月
工具 列表 CarouselLayoutManager 传送带效果列表 1.5k 1年
工具 列表 ChipsLayoutManager 流式布局列表 2.2k 1年
工具 状态栏 StatusBarUtil 设置状态栏的工具库 5.2k 7天
工具 状态栏 SystemBarTint 状态栏着色工具 4.8k 3年
通信 事件 EventBus Android 事件总线 18k 4月
键盘 表情 XhsEmoticonsKeyboard 表情键盘解决方案 2.3k 1年
键盘 冲突 JKeyboardPanelSwitch 解决键盘面板冲突 2.7k 3月
扫描 二维码 zxing 二维码扫描 18k 9天
注解 框架 androidannotations 快速开发框架 10k 5月
注解 绑定 butterknife 为 Android View 设计的绑定注解 20k 17天
注解 注入 dagger2 Android 依赖注入框架 10k 1天
权限 请求 PermissionsDispatcher 基于注解处理权限请求 7.1k 4天
权限 请求 RxPermissions 基于 RxJava 处理权限请求 6.1k 3月
响应式 UI RxBinding 安卓 UI 响应式编程 7.3k 27天
响应式 事件 otto 事件总线框架 5.0k 9天
hybrid 框架 JsBridge Android 与 JavaScript 互调桥梁 4.7k 4月
hybrid 框架 VasSonic 轻量级高性能的 hybrid 框架 7.7k 12天
崩溃 报告 acra 崩溃信息收集框架 4.3k 1天
崩溃 处理 CustomActivityOnCrash 崩溃处理 2.3k 5月
崩溃 预防 NullAway 检测 NullPointerExceptions 2.0k 3天
框架 MVP mosby MVP 框架 4.4k 9天
框架 多主题 MagicaSakura Android 多主题框架 2.6k 9天
架构 Clean Android-CleanArchitecture 一种清晰的 Android 架构 11k 2月
架构 Fragment Fragmentation 多 Fragment 架构的解决方案 6.3k 1月
构建 工具 buck 快速构建工具 5.7k 1天
编译 工具 freeline 秒级编译方案 4.5k 4月
混淆 工具 AndResGuard Android 资源混淆工具 4.6k 1月
测试 单元测试 robolectric Android 单元测试框架 3.9k 1天
测试 单元测试 mockito Android 单元测试框架 6.6k 5天
测试 单元测试 truth 谷歌的断言和命题框架 1.4k 4天
调试 框架 stetho Android 开发调试神器 9.5k 2月
调试 日志 logger 简单实用漂亮的日志打印框架 9.0k 23天
调试 数据库 Android-Debug-Database 调试手机中数据库 4.0k 2月
调试 方法 hugo 方法调试工具 5.9k 2年
反编译 工具 Apktool 反编译 APK 工具 6.1k 7天
Demo Rxjava RxJava-Android-Samples 学习 Android 中 Rxjava 6.4k 9月
反编译 工具 android-classyshark APK 分析利器 4.7k 17天
Demo Dagger u2020 Dagger 高级教学示例 APP 5.4k 5月
Demo MVP androidmvp Android 端 MVP 设计 APP 5.1k 2月
Demo 框架 android-architecture-components Architecture Component 官方演示 7.8k 6天
Demo 测试 android-testing 集成四大自动化测试框架的 Demo 5.3k 14天
Demo 设计模式 java-design-patterns java设计模式指南(英文 32k 4天
APP 仿造 bilibili-android-client 高仿哔哩哔哩动画安卓客户端 3.4k 9月
APP 播放器 android-UniversalMusicPlayer 谷歌教科书级音乐播放器 9.3k 5天
APP 播放器 ExoPlayer 谷歌出品可扩展媒体播放器 9.8k 29天
APP 播放器 Timber 音乐播放器 4.5k 3月
APP 播放器 ListenerMusicPlayer 开源音乐播放器 1.9k 1年
APP 新闻 AndroidFire 新闻阅读 App 框架 1.9k 11月
APP 新闻 GeekNews 涵盖*常用主流框架的阅读应用 2.8k 11月
APP MVP MvpApp MVP 架构学习 App 1.7k 11月
APP 教育 santa-tracker-android 谷歌开源的儿童教育和娱乐 App 1.2k 3月
APP 壁纸 muzei 定时更换桌面精美壁纸 App 3.5k 6天
面试 指南 interviews 软件工程技术面试个人指南 22k 15天
面试 题库 AndroidInterview-Q-A 国内一线互联网公司内部面试题库 7.2k 1月
学习 汇总 LearningNotes 学习笔记 8.9k 1月
学习 汇总 Android_Data Android 学习资料收集 7.1k 7月
学习 翻译 android-tech-frontier 定期翻译国外安卓优质文章 9.3k 1年
学习 源码分析 android-open-project-analysis Android 开源项目源码解析 6.2k 1年
学习 RxJava Awesome-RxJava RxJava 学习资源 4.3k 1年
学习 正则 learn-regex 轻松学习正则 14k 17天
学习 算法 awesome-java-leetcode 学习数据结构和算法、刷 LeetCode 3.7k 1月
学习 ADB awesome-adb ADB 用法大全 3.7k 1月
其他 大全 Android GitHub 上*火的 Android 开源项目 4.1k 6月
其他 大全 awesome-java Java框架、库与软件合集 16k 2月
其他 大全 awesome-android Android 实用资源合集 5.4k 1天
其他 大全 awesome-android-ui Android 好用的 UI 合集 29k 1月
其他 大全 Awesome-MaterialDesign Material Design 资源合集 5.4k 2年
其他 大全 AndroidLibs Android 开源代码大全 3.9k 1月
其他 大全 awesome-android-tips 收集常用的 Android 代码 2.2k 1月
其他 大全 android-open-project Android 开源项目分类汇总 26k 3月
其他 大全 android-architecture 谷歌关于架构的示例合集 26k 1月
其他 交流 android-discuss Android 问题交流讨论坛 3.4k 2年
补充 开发工具 PocketHub Android 版 Github 9.2k 13天
补充 开发工具 ActivityTracker 查看当前栈顶 Activity 0.3k 1年
补充 开发工具 lantern *利器 34k 1月

注:

  1. 『star 数』为该项目在 GitHub 中所获得的 start 数;
  2. 『*近更新』为该项目在 GitHub 中距离*近一次更新的时间;
  3. 『star 数』和『*近更新』是基于:2018-05-03 GitHub 项目数据进行参考。

详细介绍

scwang90 / SmartRefreshLayout

下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有*强的扩展性,集成了几十种炫酷的 Header 和 Footer。

SmartRefreshLayout 是一个“聪明”或者“智能”的下拉刷新布局,由于它的“智能”,它不只是支持所有的 View,还支持多层嵌套的视图结构。它继承自 ViewGroup 而不是 FrameLayout 或 LinearLayout,提高了性能。 也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 SwipeRefreshLayout,其他第三方的 Ultra-Pull-To-Refresh、TwinklingRefreshLayout 。还集成了各种炫酷的 Header 和 Footer。

项目地址:https://github.com/scwang90/SmartRefreshLayout
博客地址:https://segmentfault.com/a/1190000010066071

alibaba / vlayout

VirtualLayout 是一个针对 RecyclerView 的 LayoutManager 扩展, 主要提供一整套布局方案和布局间的组件复用的问题。

通过定制化的 LayoutManager,接管整个 RecyclerView 的布局逻辑;LayoutManager 管理了一系列 LayoutHelper,LayoutHelper 负责具体布局逻辑实现的地方;每一个 LayoutHelper 负责页面某一个范围内的组件布局;不同的 LayoutHelper 可以做不同的布局逻辑,因此可以在一个 RecyclerView 页面里提供异构的布局结构,这就能比系统自带的 LinearLayoutManager、aridLayoutManager 等提供更加丰富的能力。同时支持扩展 LayoutHelper 来提供更多的布局能力。

项目地址:https://github.com/alibaba/vlayout

markzhai / AndroidPerformanceMonitor

AndroidPerformanceMonitor(被称作 BlockCanary)是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。

取名为 BlockCanary 则是为了向 LeakCanary 致敬,顺便本库的 UI 部分是从 LeakCanary 改来的,之后可能会做一些调整。

项目地址:https://github.com/markzhai/AndroidPerformanceMonitor
中文文档:https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README_CN.md

seiginonakama / BlockCanaryEx

记录主线程中执行的所有方法和它们的执行时间,当 app 卡顿时,将所有耗时方法直接展示给开发者,节省开发者定位卡顿问题的时间。 此项目基于 BlockCanary。

BlockCanaryEx 和 BlockCanary 的区别如下:

  • BlockCanaryEx 的运行时代码修改自 BlockCanary,UI 和大部分功能基本一致;
  • BlockCanaryEx 添加了方法采样,知道主线程中所有方法的执行时间和执行次数;
  • 当应用卡顿时,BlockCanaryEx 更关注 app 代码中,哪些方法耗时*多,重点记录和显示这些耗时方法;
  • 添加了 gc 采样,当应用卡顿时,我们可以知道卡顿时是否发生了 gc,以及 gc 的时间;
  • 监控 view 性能,计算卡顿时,view的 measure、layout 和 draw 消耗的时间。

项目地址:https://github.com/seiginonakama/BlockCanaryEx
中文文档:https://github.com/seiginonakama/BlockCanaryEx/blob/master/README_ZH.md

frogermcs / AndroidDevMetrics

AndroidDevMetrics(原先叫 dagger2metrics)是一个性能检测库,用来检测 Activity 生命周期方法执行性能(onCreate(), onStart(), onResume())、帧速率性能和 Dagger 2 注入性能。它会告诉你在 app 中需要花多少时间来显示特定的界面,还有(如果你使用了Dagger 2)在依赖图表中提供每个对象消耗了多少时间。它不会告诉你性能问题或瓶颈的确切原因(目前!),但它可以指出你首先应该去查找的地方。

项目地址:https://github.com/frogermcs/AndroidDevMetrics

rmtheis / tess-two

文字识别一般都用的 Tesseract OCR ,它是由 Google 负责维护,是*好的开源 OCR Engine 之一,并且支持中文。不过因为 Tesseract 使用 C++ 实现的,在 Android 中不能直接使用,需要封装JavaAPI才能在Android平台中进行调用。

tess-two 是 TesseraToolsForAndroid(tesseract-adroid-tools)的一个分支,它添加了一些额外功能。TesseraToolsForAndroid 包含了 Tesseract OCR 和 Leptonica 图片处理库的一整套 API 和 build 文件。

项目地址:https://github.com/rmtheis/tess-two

huangyanbin / smartTable

Android 自动生成表格框架,支持二维数组展示,导入 Excel 表格,合并单元格等。还有很多功能点,包括动态添加首尾数据,分页,格式化字体,背景等。

Android两个项目整合成一个

需求
有两个项目A、B。两个项目相互独立,功能业务逻辑均不同。现在需要实现将两个项目整合成一个,打包出一个apk文件,安装也是只安装一个App的过程,展示上也是只展示为主项目A的App,通过主项目A的某个按钮跳转,启动项目B,然后执行项目B的业务逻辑。直到B项目退出,又回到A项目。

方案

1.将B项目设置成Library类型的项目。B项目右键–Buidle Path–Android 勾选 Is Library。

%title插图%num
2.项目A中将B项目加入进来,也是A项目右键–Buidle Path–Android界面中。

%title插图%num
3.由于项目B设置成了Is Library后导入到A项目中,但是项目的配置文件却无法跟着导入进去,所以需要将B项目的AndroidManifest.xml的配置信息统一整合到A项目的AndroidManifest中。将B项目的权限要求、Server、Activity的申明都整合到A项目的配置文件中。对于在B中申明的形式如“android:name=”.NotificationService””需要改为带上B项目的包命“android:name=”com.drainemer.server.NotificationService””。

 

总结:配置到该程度即已经完成了。在实现过程中,会出现很多问题与冲突。需要一一解决后即可实现项目的整合。

 

错误一:项目报存在两个V4包或者V7包错误,这是两个整合的项目都有相同的V4或者V7包,删除一份即可。

错误二:B中有使用R.id,当A工程引用了B工程时会在A工程的gen目录中生成B的R文件,里面也包含了A的R文件中的内容,但是当B的id定义在layout文件中时需要注意layout的名称,如果A下有个main.xml的layout,B下也有个main.xml的layout,那么A编译时就会将B的main.xml中的所有id忽略,导致混淆报错提示找不到id。所有问题出在,被引用的项目和当前项目之间的资源冲突。假如当前项目存在与被引用项目相同的资源(除了layout外,还包括图片,styles等等)就会默认使用当前项目的资源,完全忽略被引用项目的资源。

创建Android工程的目录结构

工程目录结构

%title插图%num

1. Src:该目录中存放的是该项目的源代码,这个目录包含了你即将创建的Java源代码文件,这个目录里的文件是根据package结构管理的,它与普通java项目中的/src目录很相似。

2.Gen:自动生成的文件目录。该目录下的文件全部都是ADT自动生成的,一般并不需要去修改,实际上该目录下只定义了一个R.java文件,该文件相当于项目的字典,为项目中用户界面、字符串、图片等资源都会在该类中创建其惟一的ID,当项目中使用这些资源时,会通过该ID得到资源的引用。

3.Android {版本号}:这个目录包含了项目需要的库文件(Jar文件),这和普通Java项目中的/lib目录很相似。同时其中还包含项目打包时需要的META-INF目录.

4.Android Private Libraries: 所有的第三方JAR包引入都被放入了Android Private Libraries中

5.assets:资源路径,不会在R文件注册。该目录用于存放项目相关的资源文件,这个目录和res包含的xml文件差不多,也是应用中引用到的一些外部资源。但主要区别在于这些资源是以原始格式保存,且只能用编程方式读取。例如文本文件,视频文件,MP3音频等媒体文件。

6.bin:编译生成目录。二进制文件,包括class、资源文件、dex、apk等

7.res:该目录用于存放应用程序中经常使用的资源文件,其中包括图片、布局文件以及参数描述文件等,其中包括多个目录

(1)其中以drawable开头的三个文件夹用于存储.png、.9.png、.jpg等图片资源(.9.png是Android特有的图片格式,可以根据情况进行拉伸,达到不变形的效果),他们的分变率从高到低,如果你打算在android应用中包含一个图片或者图标,就应该把它们放在这个目录。

(2)layout文件夹存放的是应用程序的布局文件,这些layout是以xml形式保存的,关于layout的进一步信息,你可以参考android文档中的UI layout。

(3)raw用于存放应用程序所用到的声音等资源。raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;相比较assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

(4)values 这个目录也包含了一些xml文件,但主要是应用中要引用的key-value对。这些XML文件声明了数组(Array)、颜色(color)、度量(Dimension)、字符串。之所以把这些东西分别放在单独的xml文件中主要是考虑到这些值能够在不更改源代码的情况下用于多语言环境。例如,根据用户语言的不同应用程序中的信息可以有多种语言版本。

8.AndroidManifest.xml:安卓清单文件 这个XML文件包含了android应用中的元信息,是每个android项目中的重要文件。在软件安装的时候被读取 ,Android中的四大组件(Activity、ContentProvider、BroadcastReceiver、Service)都需要在该文件中,以及运行这个android应用程序需要的用户权限列表,例如:电话、短信、互联网、访问SD卡,同时也详细描述了android应用的项目结构。

9. proguard-project.txt:代码混淆相关文件

10.project.properties:工程属性的配置文件,配置编译的版本等。ADT14 以后, project.properties和default.properties合并成了project.properties。供Eclipse使用,读取该项目使用Android版本号

XDM 有用 Mac M1 开发 Android 和 Flutter 的吗?

LZ 入手了 10 天左右,android 开发环境搭好了,跑 Android 项目没问题,比之前公司 i5+16G 内存的快。
之前 i5+16Gclean 后编译项目要 8 分钟,现在 Mac m1 16G 编译花费 2 分多。
Android 项目目前能正常开发。

Git 工具是用的是 SmartGit,也能正常使用。

Flutter 环境目前有点问题,使用的是 beta 分支的 SDK,flutter doctor 检测命令正常,AndroidStuio Flutter 和 Dart 插件也安装正常。但是连接真机跑代码时,却一直卡在“Running Gradle task ‘assembleDebug’…”,查看了下 Gradle 的目录,发现 Gradle-6.7-all.zip 下载正常。

XDM 有遇到 Flutter 卡在这一步的吗???

 

16 条回复    2021-02-04 22:42:42 +08:00
wuliaoshixia
    1

wuliaoshixia   63 天前

Android 开发的 JDK 使用的是 Zulu OpenJDK
leo7723
    2

leo7723   63 天前   ❤️ 1

单独打开安卓项目 RUN 一遍看下,至少报错会更详细一些。
有可能和机器没有关系。
zeropercenthappy
    3

zeropercenthappy   63 天前

这描述没法判断是机器的问题。
flutter-sdk/packages/flutter_tools/gradle/flutter.gradle 设置好镜像。
试试挂代理或者用手机热点再试试,可能是网络问题,其它依赖没下下来。
Carver9527
    4

Carver9527   63 天前 via iPhone

加个编译参数 v,把详细的日志打出来,看看卡在哪一步了
bullettrain1433
    5

bullettrain1433   63 天前

flutter 安装时候 termimal 用 rossetta 打开
HarryQu
    6

HarryQu   63 天前

M1 的编译速度可以提升这么多的吗?
hongch
    7

hongch   63 天前

“发现 Gradle-6.7-all.zip 下载正常“
那不就是正在下载 gradle 吗,你直接用 android studio 打开 Android 工程,在 android 工程下跑./gradlew assembleDebug 看进度
DGideas
    8

DGideas   63 天前

XDM 是啥,“兄弟们”?没别的意思哈,看着怎么这么奇怪呢 。。
janxin
    9

janxin   63 天前

之前看了一下 M1 下面这么折腾,我都是劝人还不如暂时不要用它做安卓相关开发。

Flutter 的支持目前也不好,开发的 M1 设备才拿到没几天,要完全兼容大概一段时间。而且现在要跑在 Rosetta 2 下面,不如 LZ 你看一下你的所有的环境是不是都跑在 Rosetta 2 下了?

unmois
    10

unmois   63 天前

宁是胡萝卜大佬吗
limerence12138
    11

limerence12138   63 天前

Android studio 还是没有原生适配啊,用起来卡卡的,还有一些页面会卡死
Richy
    12

Richy   63 天前

Android:目前 Android Studio 还没有适配 M1,可以用 IDEA 代替,不过目前 AGP 版本 4.1.1 无法直接安装 apk,需要新建 gradle 任务 [installDebug] ,每次安装后要手动打开 app,不知道有没有同学有解决方案

Flutter: 目前在用 VS Code Insiders 版本,暂时没有什么问题。gradle 运行慢大多是因为下载 gradle 太慢了。

wuliaoshixia
    13

wuliaoshixia   62 天前

@Carver9527
flutter doctor -v
[✓] Flutter (Channel beta, 1.25.0-9.0.pre.2, on macOS 11.2 20D64 darwin-arm,
locale zh-Hans-CN)
• Flutter version 1.25.0-9.0.pre.2 at /Users/sheep/Project/flutter_beta
• Framework revision 5d36f2e7f5 (3 weeks ago), 2021-01-14 15:57:49 -0800
• Engine revision 7a8f8ca02c
• Dart version 2.12.0 (build 2.12.0-133.7.beta)
• Pub download mirror https://pub.flutter-io.cn
• Flutter download mirror https://storage.flutter-io.cn

[✓] Android toolchain – develop for Android devices (Android SDK version 30.0.3)
• Android SDK at /Users/sheep/Library/Android/sdk
• Platform android-30, build-tools 30.0.3
• Java binary at: /Applications/Android
Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build
1.8.0_242-release-1644-b3-6915495)
• All Android licenses accepted.

[✓] Xcode – develop for iOS and macOS
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 12.4, Build version 12D4e
• CocoaPods version 1.10.1

[✓] Android Studio (version 4.1)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
? https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
? https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build
1.8.0_242-release-1644-b3-6915495)

[✓] Connected device (1 available)
• SKW A0 (mobile) • 7692d5ee • android-arm64 • Android 10 (API 29)

wuliaoshixia
    14

wuliaoshixia   62 天前

@hongch gradle 应该是下载下来了,执行 flutter run -v,发现卡在下面这个步骤了
[ +914 ms] Welcome to Gradle 6.7!
[ ] Here are the highlights of this release:
[ ] – File system watching is ready for production use
[ ] – Declare the version of Java your build requires
[ ] – Java 15 support
[ ] For more details see https://docs.gradle.org/6.7/release-notes.html
[ +187 ms] Starting a Gradle Daemon, 3 busy Daemons could not be reused, use –status for details
wuliaoshixia
    15

wuliaoshixia   62 天前

找到原因了,原来是依赖没有下载下来?
[+378206 ms] FAILURE: Build failed with an exception.
[ +12 ms] * What went wrong:
[ ] A problem occurred configuring root project ‘android’.
[ ] > Could not resolve all artifacts for configuration ‘:classpath’.
[ ] > Could not download kotlin-compiler-embeddable-1.3.50.jar (org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.50)
[ ] > Could not get resource ‘https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.3.50/kotlin-compiler-embeddable-1.3.50.jar’.
[ ] > Read timed out
[ ] > Could not download kotlin-daemon-embeddable-1.3.50.jar (org.jetbrains.kotlin:kotlin-daemon-embeddable:1.3.50)
[ ] > Could not get resource ‘https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.3.50/kotlin-daemon-embeddable-1.3.50.jar’.
[ ] > Could not GET ‘https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.3.50/kotlin-daemon-embeddable-1.3.50.jar’.
[ +17 ms] > Remote host closed connection during handshake
[ ] * Try:
[ ] Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output. Run with –scan to get full insights.
[ ] * Get more help at https://help.gradle.org
[ ] BUILD FAILED in 6m 19s
wuliaoshixia
    16

wuliaoshixia   62 天前

@zeropercenthappy 果然还是得用梯子先下一下依赖。。。
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速