完整开源项目荟萃(Android篇)

Catalogue
  1. 1. Introduction
    1. 1.1. About
    2. 1.2. Contribute
    3. 1.3. History
  2. 2. Categories
    1. 2.1. 新闻/资讯
    2. 2.2. 社交/聊天
    3. 2.3. 读书/图片/音乐/视频
    4. 2.4. 工具/学习
      1. 2.4.1. todo系列
      2. 2.4.2. Android辅助工具
    5. 2.5. 游戏
    6. 2.6. 高仿系列
    7. 2.7. Android组件篇
    8. 2.8. 其它

Introduction

About

  • “【All-OpenSource-Project】” 致力于收集完整优质/优秀/优美完整的Android/iOS/Web等开源项目
  • 欢迎您的加入! Fork or Email to Me, tks!

Contribute

SkySeraph

History

  • 2015.11.30 First Create

Categories


新闻/资讯

  • Github GitHub 客户端
    An elegent Android Client for Github. 不仅仅是Github客户端,而且是一个发现优秀Github开源项目的app

  • GithubTrends GitHub Trending
    GitHub Trending repositories Viewer with Material Design

  • TopNews 头条新闻
    高仿“今日头条”客户端,实现它的大部分功能

  • 36krReader 36氪客户端
    MD风格的36氪Android阅读客户端

  • cnblogs 博客园客户端
    博客园客户端(作者有保留,未完全开源)

  • FanfouDaily 饭否精选

  • Meizhi 干妹子
    每天自动更新一张精选妹纸图、一个小视频、一系列精选程序猿干货(周末不更新)

  • GanHuoIO
    基于Gank.IO提供的API的第三方客户端(RxJava+Retrofit+MVP)

  • ZhiHuDaily-React-Native 知乎日报

  • ZhihuDailyPurify 更纯净的知乎日报

  • ZhuanLan 知乎专栏

  • LookLook 新闻阅读,知乎日报等

  • android-arsenal.com android-arsenal.com客户端


社交/聊天

  • MyDiary 君の名は。, 你的名字


读书/图片/音乐/视频

  • SimplifyReader
    一款基于Google Material Design设计开发的Android客户端,包括新闻简读,图片浏览,视频爽看 ,音乐轻听以及二维码扫描五个子模块

  • shuba 书吧
    专注为用户提供人性化的搜书引擎,快捷,方便,为用户找到最好的小说

  • JamsMusicPlayer 强大的音乐播放器
    A free, powerful and elegant music player for Android.

  • Material-Movies MD风格视频播放器
    An application about movies with material design


工具/学习

todo系列

  • Minimal-Todo
    A fully Material ToDo app with minimal features, just enough to be useful.

  • Todo-Android
    Todo Android App using Realm and Lolipop Material Design.

  • TodayThing
    一款简单的 Material Design 风格的 to do list 应用

Android辅助工具


游戏


高仿系列


Android组件篇


其它

By SkySeraph 11/30/2015

Comments

IT生涯,我记忆中的那些命令

Catalogue
  1. 1. adb 命令
    1. 1.1. APK操作
  2. 2. git 命令
  3. 3. Linux 命令
  4. 4. 批处理 命令

adb 命令

汇总

  • adb kill-server

  • adb devices

  • adb install [-l] [-r] [-s]
    -l 表示锁定该程序;
    -r 表示替换原有的apk安装;
    -s 表示安装在SD卡内,而不是设备内部存储

  • adb uninstall [-k]
    -k 表示不删除程序运行所产生的数据和缓存目录(如软件的数据库文件)

  • adb shell pm clear
    清除应用缓存

  • taskkill /f /im adb*

  • adb shell getprop ro.build.version.release 版本

  • adb shell + cat /system/build.prop 查看手机配置信息

  • adb shell getprop dalvik.vm.heapsize

获取进程号

  • adb shell
  • ps | grep 进程名
  • cat /proc/pid/oom_adj //其中pid是上述grep得到的进程号

查看包名相关

  • adb shell pm list package [-f] 获取手机内所有包名
    -f 包名+路径

  • adb shell dumpsys window w | findstr \/ | findstr name=
    查看包名

  • adb shell dumpsys activity> d:\log.txt
    导出包名(log中搜索 Stack #1,然后寻找cmp=)

  • adb shell + logcat | grep START

APK操作

  • apktool d x.apk

  • apktool b x

  • apkReSign.jar

git 命令

汇总

  • git log 历史记录

  • git status

  • git clean -df

  • git branch -vv

Git配置相关

  • git config -l
    查看Git当前配置信息

  • 配置
    git config –global user.email “you@email.com”
    git config –global user.name “Your Name”
    git config –global core.editor “nano”
    git config –global color.ui true

删除远程分支A

  • git push origin –delete A

  • git push origin :A

回退

  • 远程服务器支持SSH前提下

git reset –mixed // 此为默认方式,不带任何参数的git reset,就是这种方式,它回退到某个版本,只保留源码,回退commit和stage信息

git reset –soft // 回退到某个版本,只回退了commit的信息,不会恢复stage(如果还要提交,直接commit即可)

git reset –hard // 彻底回退到某个版本, 本地的源码也会变为上一个版本的内容

  • 远程服务器不支持SSH

git branch old_master //新建old_master分支 作为备份,以防万一

git push origin old_master:old_master //将本地的old_master分支 推送到远程的old_master

git reset –hard //本地仓库 彻底回退到某一个版本

git push origin :master // 删除远程的master分支

git push origin master //重新创建远程master分支

Linux 命令

批处理 命令

Update time

08/08/2014 Create this page



By SkySeraph-2014
Comments

IT生涯, 我的常用软件清单

Catalogue
  1. 1. Windows篇
    1. 1.1. 装机必备
    2. 1.2. 办公相关
    3. 1.3. 开发相关
    4. 1.4. 设计相关
    5. 1.5. 安全相关
      1. 1.5.1. 反编译/逆向
  2. 2. Mac篇
    1. 2.1. 装机必备
    2. 2.2. 实用软件
    3. 2.3. 开发工具
    4. 2.4. 实用技巧
    5. 2.5. 实用参考
  3. 3. Chrome篇
    1. 3.1. 常用命令
    2. 3.2. 实用插件
    3. 3.3. 实用参考
  4. 4. Linux篇

前两天把系统给重装了下,好像最近一次安装应该是两年前了,一般情况下不愿意再做此类耗时无聊的事情,但没法,拥有SSD和高配置内存,开几个IDE却卡成翔,系统分析折腾了老半天还是决定重装了,重装后的那个清爽真是无与伦比, 至少依旧可以在我的Win 10上折腾不用开发也搬迁到MacBook了。

清爽归清爽,后续软件安装就比较折腾了,电脑上遗留的都是两年前比较老的版本了,没法只能一个一个网上查找,于是重新整理了此篇文章,将自己的软件清单做下梳理,也便于后续持续利用。
此文已更新到Github,希望大家一起维护.

Star Here ~~.

Soft-Tools 目录如下(持续更新,欢迎补充~):

通用篇

目录 简介
Windows Windows Soft Tools
Mac Mac Soft Tools
Linux Linux Tools
Chrome Chrome Tools
Web Web Tools

专题篇

目录 简介
Android Android Tools
iOS iOS Tools
Game Game Dev Tools
Git Git Commands
Adb Adb Commands
测试专场 Test Tools
安全逆向 Reverse Tools

Windows篇

装机必备

代理/翻墙

笔记类工具

系统相关

实用工具

办公相关

开发相关

环境篇

IDE篇

游戏专题

数据库专题

CV & ML 专题

网络抓包

终端工具

开发辅助 & 开发必备

设计相关

UML

思维导图

产品设计

图像专题

安全相关

反编译/逆向

Java & Jar (Android)

  • jd-gui jar包浏览工具,对应的IDE插件,JD-Eclipse/JD-IntelliJ

  • jadx-gui 直接反编译apk

  • Apktool apk的反编译,编译工具(smali格式)

  • dex2jar dex转为jar工具

  • AXMLPrinter XML浏览工具

  • androguard 使用DAD作为反编译器

  • Enjarify Google官方逆向分析工具(Dalvik字节码 -> Java),需python环境

  • ClassyShark Google官方dex/apk/jar/class/aar浏览工具

  • APK Analyzer(AndroidStudio 2.2+) Google官方APK分析工具

  • Smali/baksmali APK文件编辑工具

  • Smali2Java APK图形化浏览工具

  • CodeInspect 支持调试和编辑

  • APKIDE 国人开发综合图形化工具

  • bytecode-viewer 集成了J-RET,JHexPane, Dex2Jar等多个反编译工具

  • JEB 商业反编译软件,支持动态编辑

  • RADARE2 可以反汇编、调试、分析和操作二进制文件

  • Simplify 反混淆工具

  • JAD Java反编译工具

  • Introspy 黑盒测试工具

C++ & So (Android)

C# & Dll & EXE


Mac篇

装机必备

实用软件

  • Homebrew 包管理工具,方便获得各类实用工具
    使用: brew install/uninstall xx

  • iTerm2 终端工具,替代Mac自带Terminal

  • Sublime Text 2

  • tree: 以树状结构显示当前文件或文件夹的命令

  • Mou/MacDown Markdown 编辑器

  • CheatSheet 长按⌘显示当前程序的快捷键列表

  • Alfred 3 快速搜索,No mouse

  • Vimium Google Chrome 扩展, 纯键盘操作 Chrome

  • F.lux 护眼工具

  • The Unarchiver 压缩和解压 rar 格式的文件

  • icdiff 高亮文件差异对比工具

  • CleanMyMac 清理系统、卸载软件,查看系统资源消耗等功能

开发工具

实用技巧

  • 在 Finder 窗口显示更多信息

  • 在 Finder 标题栏显示完整路径
    defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES

  • 显示 Finder 隐藏文件
    defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder

    恢复默认
    defaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder

  • 设置 触发角。 在 Mac 中可以把鼠标/触控板移向屏幕的四个角落时可以触发一个操作,包括“将显示器置入睡眠状态”这个功能,配合“睡眠后需要输入密码唤醒”,可以在匆忙离开座位时滑一下鼠标就关屏,很方便。

实用参考


Chrome篇

常用命令

  • chrome://extensions/

  • chrome://apps/

实用插件

IT民工

实用参考


Linux篇


GitHub stars

GitHub watchers

GitHub followers

Update time
03/12/2017 Update
08/06/2014 Create this page



By SkySeraph-2014
Comments

手掌手指分割算法(源码)

Catalogue
  1. 1. 开发环境
  2. 2. 功能原理
  3. 3. 算法效果

开发环境

开发环境

  • 64 bits Windows OS (Win8.1)
  • VS2013
  • OpenCV 2.4.9

功能原理

算法要求

完成将Camera拍摄的手掌图片中分割出每个手指用于指纹识别

算法流程

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#ifdef TIME_RUN_COST
double duration = static_cast<double>(cv::getTickCount());//time
#endif
cout << "filename=" << filename <<endl;
Mat src = imread(filename, CV_LOAD_IMAGE_COLOR);
if (src.empty())
{
cout << "imread error!!!";
getchar();
return -1;
}
#ifdef BOB_DBG_COM
memset(out_filename, 0, sizeof(out_filename) / sizeof(char));
sprintf(out_filename, "%s-%s.jpg",out_name,"0-0src");
imwrite(out_filename, src);
#endif // BOB_DBG_COM
#if 0
int scaleSize = 4;
resize(src, src, Size(src.cols / scaleSize, src.rows / scaleSize), 0, 0, CV_INTER_AREA);
memset(out_filename, 0, sizeof(out_filename) / sizeof(char));
sprintf(out_filename, "%s-%s.jpg", out_name, "0-0src");
imwrite(out_filename, src);
#endif
#if 1
cout << "cut..." << endl;
int width = src.cols;
int height = src.rows;
float scale = 0.8;
cout << "width=" << width << ",height=" << height << endl;
Rect rect(0, 0, width, height*scale);
Mat imgCut;
imgCut = src(rect).clone();
#endif
//Mat imgCut = src;
cout << "filter..." << endl;
// filter2D(imgCut, imgCut, -1, kernel);
GaussianBlur(imgCut, imgCut, Size(5, 5), 0, 0);
// blur(imgCut, imgCut, Size(5, 5));
#if 0
cout << "EqualizeHist..." << endl;
Mat matOutEqualizeHist = Mat(imgCut.size(), CV_8UC3);
//IplImage* pImgOutEqualizeHist = cvCreateImage(cvSize(cameraFrame.cols, cameraFrame.rows), IPL_DEPTH_8U, 3);
IplImage pImgInEqualizeHist = (IplImage)(imgCut); // Mat-> IplImage
IplImage* pImgOutEqualizeHist = EqualizeHistColorImage(&pImgInEqualizeHist);
matOutEqualizeHist = pImgOutEqualizeHist; //IplImage -> Mat
#endif
// out
Mat imgSrc = Mat(imgCut.size(), CV_8UC1);
imgCut.copyTo(imgSrc);
Mat imgContour = Mat(imgSrc.size(), CV_8UC1);
#ifdef FINGER_EXTRACT_AT_NIGHT
cout << "Nigth,Threshold..." << endl;
Mat imgTmp;// = Mat(imgCut.size(), CV_8UC1);
cvtColor(imgSrc, imgTmp, CV_RGB2GRAY);
cvThresholdOtsu(&((IplImage)imgTmp), &((IplImage)imgTmp));
imgTmp.copyTo(imgContour);
#else
cout << "Day,Skin..." << endl;
Mat imgSkin2 = Mat(imgSrc.size(), CV_8UC1);
IplImage* pImgSkin2 = cvCreateImage(cvSize(imgSrc.cols, imgSrc.rows), IPL_DEPTH_8U, 1);
IplImage pImg2 = (IplImage)(imgSrc); // Mat-> IplImage
cvSkinOtsu(&pImg2, pImgSkin2);
imgSkin2 = pImgSkin2; //IplImage -> Mat
//Mat imgSkin = Mat(imgSrc.size(), CV_8UC1);
imgSkin2.copyTo(imgContour);
#endif
/////////////////////// Contours
cout << "Find Contours..." << endl;
vector<vector<cv::Point> > contours;
vector<Vec4i> hierarchy;
findContours(imgContour, contours, hierarchy,
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
sort(contours.begin(), contours.end(), compareContourAreas);
int contours_num = contours.size();
cout << "contours_num=" << contours_num << endl;
#if 0
vector<vector<Point>>::const_iterator itContours = contours.begin();
//for (int i = 0; i < contours.size(); i++)
for (; itContours != contours.end(); ++itContours)
{
cout << "Size: " << itContours->size() << endl;//每个轮廓包含的点数
}
#endif
#if 1 //usd
// Eliminate too short or too long contours
int cmin = 100; // minimum contour length
//int cmax= 1000; // maximum contour length
vector<vector<Point>>::const_iterator itc = contours.begin();
while (itc != contours.end())
{
//if (itc->size() < cmin || itc->size() > cmax)
if (itc->size() < cmin) {
itc = contours.erase(itc);
}
else
++itc;
}
contours_num = contours.size();
cout << endl << "contours_num after Eliminate=" << contours_num << endl;
#endif
// extract the contour img
cout << "Extract Contours..." << endl;
if (contours_num >= 4)
{
Mat img1, img2, img3, img4;
std::vector<cv::Point> biggest1Contour = contours[contours_num - 1];
std::vector<cv::Point> biggest2Contour = contours[contours_num - 2];
std::vector<cv::Point> biggest3Contour = contours[contours_num - 3];
std::vector<cv::Point> biggest4Contour = contours[contours_num - 4];
std::vector<cv::Point> smallestContour = contours[0];
extractFingerImg2(contours, imgSrc, img1, contours_num, 1);
extractFingerImg2(contours, imgSrc, img2, contours_num, 2);
extractFingerImg2(contours, imgSrc, img3, contours_num, 3);
extractFingerImg2(contours, imgSrc, img4, contours_num, 4);
}
else if (contours_num == 3)
{
Mat img1, img2, img3;
std::vector<cv::Point> biggest1Contour = contours[contours_num - 1];
std::vector<cv::Point> biggest2Contour = contours[contours_num - 2];
std::vector<cv::Point> biggest3Contour = contours[contours_num - 3];
std::vector<cv::Point> smallestContour = contours[0];
extractFingerImg2(contours, imgSrc, img1, contours_num, 1);
extractFingerImg2(contours, imgSrc, img2, contours_num, 2);
extractFingerImg2(contours, imgSrc, img3, contours_num, 3);
}
else if (contours_num == 2)
{
Mat img1, img2;
std::vector<cv::Point> biggest1Contour = contours[contours_num - 1];
std::vector<cv::Point> biggest2Contour = contours[contours_num - 2];
std::vector<cv::Point> smallestContour = contours[0];
extractFingerImg2(contours, imgSrc, img1, contours_num, 1);
extractFingerImg2(contours, imgSrc, img2, contours_num, 2);
}
else if (contours_num == 1)
{
Mat img1;
std::vector<cv::Point> biggest1Contour = contours[contours_num - 1];
std::vector<cv::Point> smallestContour = contours[0];
extractFingerImg2(contours, imgSrc, img1, contours_num, 1);
}
else
{
cout << "error" << endl;
}
#ifdef TIME_RUN_COST
duration = static_cast<double>(cv::getTickCount()) - duration;
duration /= cv::getTickFrequency(); // the elapsed time in ms
cout << "time cost=" << duration << "s"<<endl;
#endif
#ifdef BOB_DBG_COM
memset(out_filename, 0, sizeof(out_filename) / sizeof(char));
sprintf(out_filename, "%s-%s.jpg", out_name, "4-imgContoursInSrc");
imwrite(out_filename, imgSrc);
//imwrite("4-imgContoursInSrc.jpg", imgSrc);
#endif // BOB_DBG_COM

算法效果

白天复杂场景

晚上场景

批量测试场景



By SkySeraph-2014

合作联系:skyseraph00@163.com

Comments