OrangePi-PCH3安卓系统定制

一、USB调试开放

1、修改USB0配置 /lichee/tools/pack/chips/sun8iw7p1/configs/dolphin-p1/sys_config.fex

[usbc0]
usb_used = 1
usb_port_type = 0 // 0:device only; 1:host only; 2:OTG,默认是1
usb_detect_type = 0

2、重复lichee编译
3、pack

二、网络调试开放

android/device/softwinner/dophin-common/init.sun8i.rc添加
on boot
setprop service.adb.tcp.port 5555
stop adbd
start adbd

三、精简系统应用

1、android/vendor/fvd/fvd.mk(对应的特殊版本定制的应用)修改
android/build/target/product/tvd_base.mk(基础版本应用)
PRODUCT_PACKAGE += \
2、android/vendor/fvd/packages/
检查各项目下Android.mk文件中的LOCAL_OVERRIDES_PACKAGES值是否覆盖了某个应用

OrangePi-PCH3安卓源码编译

一、源码下载

官方源码
下载的源码文件是分块的压缩包,需要合并再解压
linux环境合并解压

1
$ cat xxx_1 xx_2 > xx.tar.gz

archive菜单直接解压xx.tar.gz

二、编译环境准备(以ubuntu1604为例)

1、python2.7.3
2、GNU Make 3.81-3.82(ubuntu1604自带make版本4.1,需要重新安装)
下载3.81版本make,解压后得到deb包

1
2
$ sudo apt-get remove make
$ sudo dpkg -i xxx.deb

3、JDK安装,只支持jdk1.6
4、平台支持软件安装

1
2
3
4
5
6
$ sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
$ sudo dpkg-reconfigure dash
$ sudo apt-get install gawk
$ sudo apt-get install u-boot-tools
$ sudo apt-get install fakeroot

5、lichee编译(kernel)

1
2
$ cd lichee
$ ./build.sh lunch

选择sun8iw7p1-android-dolphin
6、源码编译

1
2
3
4
5
6
$ cd android
$ source ./build/envsetup.sh
$ lunch dolphin_fvd_p1-eng
$ extract-bsp
$ make -j2
$ pack

在U盘上建立git仓库,移动的“私有云”

一、前言

Git作为版本管理工具,其功能之强大,已无需赘述。一般情况下,我们接触到的git都指远程操作,与远程git服务器协作,完成版本迭代管理。如果没有服务器,是否也能使用git呢?当然可以,这期文章,让我们一起来把git和我们的代码搬到U盘上,建立一个真正属于自己而又移动的“私有云”。

二、环境搭建

1、安装好的git环境,参见Git官网
2、U盘一个,大小容量没有严格要求。

三、命令行操作

1、在U盘上创建空仓库test.git(我的U盘盘符在PC端是I盘)。

1
2
3
4
$ cd /I
$ mkdir test
$ cd test
$ git init --bare

得到如下显示即表明git仓库创建成功

1
Initialized empty Git repository in I:/test/

2、现有git工程与U盘仓库关联(在git工程根目录下执行)

1
$ git remote add usb /i/test

3、版本管理,仓库有了,剩下就是推送和拉取文件了

1
2
$ git push usb master
$ git pull usb master

OpenSSL基础教程二:RSA命令行加解密

一、概述

  在上一篇教程中,讲解了如何生成RSA密钥,提到了密钥长度设定对加密过程的影响问题。本篇文章,让我们来使用RSA密钥对数据进行加解密,并验证一下密钥长度对加密的影响,依赖于OpenSSL强大而丰富的命令行命令,可以简洁清晰的实现这两个目标。为了方便演示讲解,本文中使用的密钥是默认的512比特长度。

二、公钥加密

  公钥私钥是成对出现,一个加密,另一个解密。当然,数据也可以由私钥加密,由公钥解密。所谓公钥,即对外公开的,公钥由私钥生成而来,知道私钥即可知道公钥,在RSA的设计设想中,这是一条单向线,因此,要自己保护好私钥,把公钥公开,一般情况下,公钥持有者用公钥把明文数据加密成密文,将密文发送给私钥持有者,私钥持有者用私钥对密文解密得到明文数据,完成加解密流程。本文的演示流程也将按照这个来进行。
  新建一个空白文档文件 data.txt,用文本编辑器编辑文本内容,输入 Hello RSA 并保存,作为我们的明文数据。
  公钥加密,命令行命令

1
$ openssl rsautl -encrypt -in data.txt -inkey public.key -pubin -out data_en.txt

  • 意思是:RSA工具(rsautl)加密操作(-encrypt),导入(-in)明文数据data.txt,导入密钥(-inkey),声明密钥是公钥(-pubin),加密后密文输出保存到(-out)data_en.txt文件中。
  • 加密时,OpenSSL会默认导入的密钥是私钥,所以,公钥加密需要加上 -pubin 参数以表明加密操作是以公钥进行,私钥加密时因为是默认私钥,所以不需要加相关参数。一定要确认使用的是哪个密钥加密,如果使用公钥而又不加 -pubin 参数,命令行会报错,加密也会失败。

Read more

OpenSSL基础教程一:RSA加解密算法密钥

一、概述

  1、关于OpenSSL的历史及应用领域,这里不作过多阐述,它是一个开源的安全套接字层密码库,由此你可以大致知道它的用处,想更多的了解,请访问OpenSSL官方网站OpenSSL开源代码库。这里,主要讲解一下OpenSSL在RSA加密情景下的应用,如何生成RSA算法密钥及密钥的相关知识。
  2、RSA,即非对称加解密,加解密原理推荐参考RSA算法原理(一)及其系列文章。
  3、OpenSSL作为知名的开源软件包,广泛被各大开源系统收录作为系统级软件包,比如主流版本的UbuntuCentOS等Linux系操作系统,及闭源的MacOS(即苹果操作系统,Unix系),本文涉及的命令行操作均在Linux环境下进行,所以,基础的Linux操作系统知识是必须的。打开命令行工具,执行 openssl version -a 命令,可检测你的操作系统是否具备OpenSSL的执行环境。

1
2
3
4
5
6
7
8
$ openssl version -a

OpenSSL 0.9.8zh 14 Jan 2016
built on: Jan 23 2017
platform: darwin64-x86_64-llvm
options: bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) blowfish(idx)
compiler: -arch x86_64 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O3 -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DMD32_REG_T=int -DOPENSSL_NO_IDEA -DOPENSSL_PIC -DOPENSSL_THREADS -DZLIB -mmacosx-version-min=10.6
OPENSSLDIR: "/System/Library/OpenSSL"

  以上显示即正常。

二、OpenSSL生成RSA密钥对

私钥的生成
1
2
3
4
5
6
$ openssl genrsa -out private.key

Generating RSA private key, 512 bit long modulus
.......++++++++++++
.....++++++++++++
e is 65537 (0x10001)

  openssl genrsa -out private.key 这条命令的意思是:生成一个RSA算法私钥(genrsa),保存到(-out)名为private.key的文件中。
  这是最基本的生成RSA密钥的命令,其中,密钥保存的文件名可自定义,不限后缀,可以指定文件路径,如 ~/Desktop/private.key 当然,这个命令还可以加上一些可选参数,如:

Read more

Kotlin基础教程第四章:Kotlin类 (Android)

  本篇文章,让我们来学习Kotlin类及其属性。
  欢迎你回头学习之前的文章,可以让你更好的继续学习Kotlin知识。

  如果你曾学习过任何一门“面向对象编程”语言,你将对类及其属性很熟悉。

一个类可以比作模板或蓝图,用来创建不同的对象,并定义对象的属性及行为。

在Java中,要创建一个类,需要定义一个类,定义它的构造器、它的gettersetter方法,通过这些方式,简单的给成员变量赋值或取出它们的值。这些乏味的工作不会出现在Kotlin中。

Java
1
2
3
4
5
6
7
8
9
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
Kotlin
1
class Person(val name: String)

  怎么样?是不是很简洁明了?Kotlin一行代码即可实现Java需要九行代码才能实现的功能。写这样的代码,岂能不感叹“人生苦短,快用Kotlin!
  你应该已经注意到了,类的前边没有public关键字,是因为在Kotlin中,所有的类默认都是public的,所以可以丢掉了。

属性

  在定义的类中,一般含有一些成员变量和方法,通常,这些数据都是私有的,不能直接访问,普遍的做法是通过创建getter方法来获取这些数据。在所有的“面向对象编程”语言中,这些做法的结合,通常称为“封装”。在Kotlin中,赋值和取值方法有很大的不同。
  声明一个属性有两种方式,如果是以 val 声明,则这个属性是只读的,而如果是以 var 声明,则这个属性是可变的,你可以在任何时刻修改它。

1
2
3
4
class Person (
val name : String, // 只读,产生成员变量及getter
var age : Int // 可变的,产生成员变量,getter及setter
)

  任何时候,你想声明一个属性,就会产生一个成员变量,一个getter或setter(取决于如何声明)。下边的例子,你可以看到如何创建一个Person实例对象,并访问它的属性。

Read more

Kotlin基础教程第三章:Kotlin运算符 (Android)

  在这篇文章里,你将学习到运算符知识及它们在Kotlin中的运用。
  但是在进入正题之前,我已经在之前的文章里解释了如何在Android Studio中配置Kotlin开发环境及Kotlin语言变量。如果你还有不清楚的地方,请先阅读之前的文章再来进行这篇文章知识的学习。

第一章:在Android Studio中配置Kotlin环境
第二章:Kotlin变量 (Android)

二进制运算符

  在运算符的使用上,Kotlin是一门强大的语言。在其它计算机语言如Java中,是不允许用户在非原始类型数据间使用算术运算符的。你想对ArrayList使用“+”,是不允许的。但Kotlin可以,Kotlin提供了二进制运算符相对应的可重载的方法名。

表达式 方法
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b), a.mod(b)(过时的)
a..b a.rangeTo(b)
注意

  如果你正在使用的Kotlin是1.1版本,请使用rem()方法,mod()方法从1.1版本开始已经过时了。
  如你所见,每一个二进制运算符都有一个方法让它更易读。当你想对自定义的类使用运算方法时,你会感觉很容易使用以及重载。

1
2
3
4
5
6
7
8
9
10
11
12
data class Test(val count: Int) {
operator fun plus(increment: Int): Test {
return Test(count + increment)
}
operator fun times(multiply: Int): Test {
return Test(count + multiply)
}
}

val test = Test(10)
println(test + 10) //输出 -> Test(count=20)
println(test * 2) //输出 -> Test(count=12)

Read more

Kotlin基础教程第二章:Kotlin变量 (Android)

  这篇文章,你将学习到Kotlin变量的相关知识。
  在进入今天的主题之前,在上一篇文章,我已经解释了如何在Android Studio中配置Kotlin开发环境,如果对此你还有疑虑,在学习今天的知识前,请先阅读上一篇文章。

在Android Studio上配置Kotlin开发环境

变量的定义

  在Kotlin中,一切都是对象

在Kotlin中,一切都是对象。这里没有我们在Java中使用的原始数据类型。这真的是很有意思,因为对于所有的变量,我们都可以使用同样的方式来对待。–安东尼奥.雷瓦

  是的,这是真的,这是Kotlin非常酷炫的地方,而原因,“安东尼奥.雷瓦”已经说过了。让我们来定义第一个变量。

定义第一个变量

  你可以使用varval关键字简单的定义变量并指派给对象。

1
2
var <object_name> : <Type> = <Value>
val <object_name> : <Type> = <Value>

例如
1
2
3
4
5
6
var i : Int = 1
var d : Double = 1.1
var f : Float = 1.1F
var l : Long = 1L
var c : Char = 'c'
var s : String = "Allen"

  上边的例子将立即对对象进行赋值,通过例子,你可有什么发现?

Read more

Kotlin基础教程第一章:在Android Studio中配置Kotlin环境

  如果你之前了解过Kotlin,认为它是一门很强大的语言,那么你应该尝试去学习和使用它,这就是你来到这里的原因。这篇文章,我们将学习如何配置Android Studio下的Kotlin开发环境。
  启动Android Studio,新建一个项目工程,如下图如示
新工程 + Kotlin支持(需要手动勾选)
  按照下一步提示创建工程并等待创建过程完成。

  对于Android Studio 2.x版本,你需要预先安装Kotlin插件,安装步骤为“File -> Settings -> Plugin”,在弹出的对话框搜索栏内搜索“Kotlin”,安装并重启你的Android Studio。
2.x版本kotlin插件安装

  先让我们看一下新建工程的gradle文件。
工程根目录build.gradle

  1. Kotlin依赖版本声明;(这篇文章编写时,版本号为1.1.4)

Read more

(译) 解决Nexus5X手机死循环启动问题,帮助你最终启动手机

原文《Nexus 5X Bootloop Fix Helps you to Finally Boot the Phone》,原文作者:Doug Lynch,源自 xda-developers.com网站

  你的LG/Google Nexus 5X手机停止启动了吗?或者是陷入到了无休止的启动循环里了?
  这种现象我们常称之为“循环启动”,起因则有很多种。大多数时候,可以通过刷入原厂固件或者恢复出厂设置来解决循环启动问题,但当遇到硬件循环启动时,通常我们并不能采取什么有效的办法,除了退货。如果你的Google Nexus 5X手机无法启动,而你尝试修复但并没有什么卵用,那么你要相信,你不是唯一一个碰到这种情况的人。Nexus 5X循环启动问题在社区里正不断被诟病,但鲜有新的解决方案。

Nexus 5X循环启动解决 - 背景

  过去几年里,LG旗下的智能手机在循环启动问题上有点名声。其中一个问题,起初只在LG G4手机上发现的问题正越来越多的出现在它发布的每一款新设备上。社区里最近在讨论解决Nexus 6P循环启动问题,这个设备由华为出品,而现在,一个在Nexus 5X上可行的办法出现了,这个办法派生自我们之前写的一些引导方案。
  这些解决方案有一个共同点,正表明由高通仓促发布的骁龙808/810芯片,随着使用时间的推移,正在达到退化并损坏的时候了。骁龙810发热问题都已经老生常谈了,但是,似乎808芯片也存在相同的问题,将导致设备循环启动。LG起初承认了LG G4循环启动问题确实和硬件有关,但从未提供更多深入的信息。
  一些质疑认为是焊锡的问题,在设备的使用过程中,在经历多次的加热和冷却后,焊锡会破裂。不管是否是真因,我们还是不知道问题的背后是什么,但是这个办法看起来会对Nexus 5X循环启动的问题起效。今天我们带来一个引导,真正的帮助你解决Nexus 5X循环启动问题。这则帖子末尾的讨论链接表明这个办法是未经测试的,社区里的许多用户已经报告了用这个办法可以成功。
  一如既往,你可以使这个方法多样化。

教程

要求
  • 设备在循环启动问题发生前,bootloader要处于”可解锁”状态。在这之前,如果你能启动设备,去到开发者选项里,点击“允许OEM解锁”,就能达到bootloader解锁的状态。
  1. 下载最新的ADB和Fastboot,将它们解压到电脑上容易访问到的位置。

Read more