编译讯为android7.1注意事项

  1. 安装 ubuntu 14.04.05 版本:ubuntu-14.04.05-desktop-amd64.iso

  2. 修改 root 密码
    set passwd root

    sudo passwd

  3. 设置系统中,数据源为阿里云
    ``

  4. 安装 openjdk1.8

1
2
3
4
5
6
7
8
9
10
apt-get install device-tree-compiler
add-apt-repository ppa:openjdk-r/ppa
apt-get update
apt-get install openjdk-8-jdk

在多个 JDK 版本中切换 JDK:
update-alternatives --config java
update-alternatives --config javac
update-alternatives --config javadoc

  1. 安装基础包
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
#!/bin/bash

####################################################################
# Warning:
# Ubuntu 12.04.2 introduced a new X stack that isn't compatible with
# with the old glx packages.

# ------------------------------------------------------------------
# 12.04 --> 12.04.2 (*-lts-quantal)
# ------------------------------------------------------------------
# libgl1-mesa-glx:i386 --> libgl1-mesa-glx-lts-quantal:i386
# libgl1-mesa-dev --> libgl1-mesa-dev-lts-quantal
# ------------------------------------------------------------------
#
# DON'T install libgl1-mesa-glx:i386 on 12.04.2, else it will *BREAK*
# your system.
####################################################################

# Execute an action
FA_DoExec() {
echo "==> Executing: '${@}'"
eval $@ || exit $?
}

# Ubuntu 12.04.2 LTS
FA_DoExec apt-get install \
git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 \
libgl1-mesa-glx-lts-quantal:i386 libgl1-mesa-dev-lts-quantal \
g++-multilib mingw32 tofrodos lib32ncurses5-dev \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386


if [ ! -h /usr/lib/i386-linux-gnu/libGL.so ]; then
FA_DoExec ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 \
/usr/lib/i386-linux-gnu/libGL.so
fi

# Development support
FA_DoExec apt-get install \
vim dos2unix minicom gawk

  1. 解压 android7.1 代码到/home/android7.1
1
2
mkdir android7.1
tar -xvf 4418-6818-android7.1-20200811.tar.gz
  1. 根据主板芯片类型,修改(内存、显示屏)配置《4418-6818-Android7.1 编译手册.pdf》

  2. Ensure Jack server is installed and started

1
2
Remove TLSv1, TLSv1.1 from jdk.tls.disabledAlgorithms in /etc/java-8-openjdk/security/java.security file
Restart the jack server: cd /prebuilts/sdk/tools/ ./jack-admin kill-server ./jack-admin start-server

2.

解决在Ubuntu14.04中 'Cannot Add PPA' 的错误

1
2
3
sudo add-apt-repository ppa:openjdk-r/ppa
Cannot add PPA: 'ppa:openjdk-r/ppa'.
Please check that the PPA name or format is correct.

首先检查 DNS 设置,查看/etc/resolv.conf,如未配置 DNS,则配置 DNS,如果还是无效,则按以下思路来解决。

如果你在 Ubuntu 中添加 PPA 出现显示的错误时,不要着急。这是一个在添加 PPA 时出现的一个普遍的错误,也很容易解决。

解决在 Ubuntu 中无法添加 PPA 的错误

主要有两个原因会出现这种错误。要么是你系统中的 CA 证书损坏,或者是你的网络设置了代理。

我们首先重装 CA 证书:

sudo apt-get install --reinstall ca-certificates
如果上面的命令无效的话,可能是设置了代理。可以通过 E 选项绕过系统代理,如下:

sudo -E add-apt-repository ppa:openjdk-r/ppa

VMware Fusion Ubuntu 14.04 客户机 设置共享目录

要安装 Ubuntu 虚拟机,使用的是 VMware Fusion,主机是 OS 10.10。

前提条件 1.确定在启动 Ubuntu 客户机之前,对这个客户机的共享目录进行了设置,允许共享目录,并且添加了主机中的某个目录作为共享目录。

2.确定安装了 make, gcc, libstdc++, g++这些编译软件会用到的包。可以使用下面的命令安装:

apt-get install xxx #把xxx换成相应的包名就行。
步骤 1.启动 Ubuntu 客户机。从菜单栏上依次点击 Virtual Machine -> Install VMware Tools。

2.等一下会(十几秒),VMware Tools 的 CD 自动挂载。打开 CD 所在的目录。将文件名类似为 VMwareTools.x.x.x-xxxx.tar.gz 的压缩包复制到桌面,右键单击它,选择解压缩到当前目录(Extract to here)。然后桌面就会出现名为 vmware-tools-distrib 的新目录。

3.打开终端,进入到桌面的新目录中:
sudo apt remove open-vm-tools

cd Desktop/``vmware-tools-distrib

4.在终端中继续输入下面的命令,来安装 VMware Tools:

sudo ./vmware-install.pl -d

其中参数-d 是用来保持默认。因为在安装工具的过程中,程序会向用户确认很多信息,比如工具要安装在哪个目录,工具文档安装在哪个目录,gcc 命令的目录,make 命令的目录等等。这些信息都能被自动检测到,所以用户可以使用-d 参数来保持默认,程序就不会再等待用户的确认了。 5.重新启动 Ubuntu 客户机。

1
2
3
4
5
6
vi /etc/fstab

.host:/WinData /mnt/hgfs1/ fuse.vmhgfs-fuse defaults,allow_other,uid=1000 0 0

.host:/hzz /mnt/hgfs/ fuse.vmhgfs-fuse defaults,allow_other,uid=1000 0 0

6.在/mnt/hgfs/目录下,你的共享目录就出现了。

参考文献
1.VMware Tools 安装过程

2.安装 gcc、g++、make 等工具

jar包中修改文件

现有 jar 包 base-web.jar

查找 jar 包里面的文件:

jar ftv base-web.jar | grep pom.xml

要修改 jar 包中配置文件可以用下面方式:

通过 vim 命令直接修改保存 jar。超方便。

通过 vim 命令直接编辑 jar

vim xxx.jar 该命令首先会列出全部文件,可以通过输入/abc 来搜索,定位到对应的 abc 文件后回车进入配置文件内进行编辑,:wq 保存。

第三方App系统签名

刚入职的时候,固件中 app 需要在源码中编译,不是很理解,为什么不使用 IDE 编译,然后 copy 到 /system/app/*,咨询导师,得到反馈 app 需要使用系统的权限 在 AndroidManifest.xml 中声明了系统全下申明了系统权限android:sharedUserId="android.uid.system"

随着工作时间延长,慢慢理解了 apk 签名机制,为了解决上述疑问,出现了 2 套解决方案:

单独签名解决方案
找到平台签名文件“platform.pk8”和“platform.x509.pem”
文件位置 android/build/target/product/security/
签名工具“signapk.jar”
位置:android/prebuilts/sdk/tools/lib
签名证书“platform.pk8 ”“platform.x509.pem ”,签名工具“signapk.jar ”放置在同一个文件夹;
执行命令

java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signedDemo.apk

或者直接在 Ubuntu 编译环境执行

java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 input.apk output.apk

IDE 中添加源码平台生成证书 platform.keystore
生成平台 platform.keystore 文件:
编译平台签名文件“platform.pk8”和“platform.x509.pem”
文件位置:android/build/target/product/security/
把 pkcs8 格式的私钥转化成 pkcs12 格式:
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
把 x509.pem 公钥转换成 pkcs12 格式:
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name androiddebugkey
密码都是:jfz123456
生成 platform.keystore
keytool -importkeystore -deststorepass jfz123456 -destkeypass jfz123456 -destkeystore platform.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass jfz123456 -alias androiddebugkey
Eclipse 添加证书
将生成的 platform.keystore 导入 eclipse 在 eclipse 下 Windows/preferences/Android/build 中设置“Custom debug keystore”为刚才生成的 platform.keystore 即可

调试 apk 时直接点击 Debug As —> Android Application 即使用系统签名签名了该 apk

Android Studio 添加证书

android的listview加入EditText

在日常开发中,ListView 是我们常用的控件,也是遇到坑比较多的一个控件。在之前的项目中,有这样的一个布局需求,在 ListView 的 item 中包含有 EditText,第一个问题就是焦点问题,会发现 edittext 获取不到焦点。

1.焦点问题
比如我们有如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>

####MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends Activity {
ListView mListView;
MyAdapter mMyAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listView);
mMyAdapter = new MyAdapter(this);
mListView.setAdapter(mMyAdapter);
}}

####MyAdapter.java

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
public class MyAdapter extends BaseAdapter {
private Context mContext;
public MyAdapter(Context context) {
this.mContext = context;
}
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
EditText editText;
if (convertView == null) {
editText = new EditText(mContext);
convertView = editText;
} else {
editText = (EditText) convertView;
}
System.out.println("current pos:" + position);
return convertView;
}}

当你运行上述简单的代码后发现 EditText 是无法获取焦点的,导致无法输入任何东东,那么原因何在呢?

####其实,是 listview 先于子 item 抢占了焦点,那么我们首先想到的就是让 listview 失去焦点,让子 item 获取焦点(当然,listview 的 onitem 相关监听事件会失效)。
mListView.setFocusable(false);

这是再运行发现键盘弹出了,可是 editText 获取到焦点然后又失去了,需要你手动再次点击才能获取到,然后才能输入。
而且当你输入完毕,关闭软键盘,发现输入的东西不见了,自动清空。这又产生了两个问题。

第一个问题是 listview 每次调用 getview 都会使 EditText 失去焦点,第二个问题归结于下面要讲的 listview 的 item 复用产生的问题。

第一种方式行不通,查询相关资料发现,可以通过给 listview 的 item 的根布局设置 descendantFocusability 属性。

1
2
3
4
#####android:descendantFocusability 属性有三个值:
beforeDescendants:viewgroup 会优先其子类控件而获取到焦点
afterDescendants:viewgroup 只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup 会覆盖子类控件而直接获得焦点

####那么我们修改 adapter 中的 getView 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public View getView(int position, View convertView, ViewGroup parent) {
EditText editText;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_edittext, parent, false);
editText = (EditText) convertView.findViewById(R.id.editText);
convertView.setTag(editText);
} else {
editText = (EditText) convertView.getTag();
}
System.out.println("current pos:" + position);
return convertView;
}

####list_edittext.xml

1
2
3
4
5
6
7
8
9
10
11
<?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:descendantFocusability="beforeDescendants"
android:orientation="vertical">
<EditText android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

发现还是无效果,其实我们少了一句关键的代码,就是给相应的 activity 设置 windowSoftInputMode= adjustPan 即可。。

##终上所述,我认为的解决方案就是给 ListView 或者 ListView 的 item 的根布局添加 android:descendantFocusability="beforeDescendants",然后设置相应的 activity 的 windowSoftInputMode 属性为 adjustPan 。

##2.数据问题
解决完焦点问题后,另一个问题就是 edittext 的数据问题了。当我们在当前屏幕的 edittext 中输入东东后,往下滑,发现下面的 edittext 自动输入了我们输入过得东东,这明显是我们不愿意看到的。

其实这是由于 getView 方法的复用 view 导致的,加入你在 position=0 的 edittext 中输入了内容,当你往下滑时,当 position 为 0 的 view 完全消失时,该 view 会被加入到 mActiveViews[]中,当下方的 item 检测到由可用的 view,则从该数组中取出,所以下方的 edittext 的内容会跟上面你输入的一样,其实就是同一个 edittext。关于 listview 源码级解析详见链接

#####解决方案——保存 edittext 的内容

修改 adapter 代码:

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
//新增一个数组用于保存 edittext 的内容
private SparseArray<String> mStringSparseArray;

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
EditTextHolder editTextHolder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_edittext, parent, false);

editTextHolder = new EditTextHolder();
editTextHolder.mEditText = (EditText) convertView.findViewById(R.id.editText);

editTextHolder.mMyTextWatcher = new MyTextWatcher(position, mStringSparseArray);
//给edittext设置watcher
editTextHolder.mEditText.addTextChangedListener(editTextHolder.mMyTextWatcher);

convertView.setTag(editTextHolder);

} else {
editTextHolder = (EditTextHolder) convertView.getTag();
//由于复用了 edittext,导致他的 watcher 里的 position 还是之前的 positiono,所以需要通知
//watcher 更新 positon,才能保存正确的 positon 的值
editTextHolder.updatePosition(position);
}
System.out.println(position);
editTextHolder.mEditText.setText(mStringSparseArray.get(position));
return convertView;
}
static class EditTextHolder {
EditText mEditText;
MyTextWatcher mMyTextWatcher;
public void updatePosition(int position) {
mMyTextWatcher.updatePosition(position);
}
}

static class MyTextWatcher implements TextWatcher {
private int position;
private SparseArray<String> sparseArray;
//更新 postion
public void updatePosition(int position) {
this.position = position;
}
public MyTextWatcher(int position, SparseArray<String> sparseArray) {
this.position = position;
this.sparseArray = sparseArray;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void afterTextChanged(Editable s) {
//保存 edittext 的值
sparseArray.put(position, s.toString());
}
}

运行代码,发现 edittext 数据错乱问题解决,此方法同样适用于 checkbox 错乱等问题。

android的listview解决事件穿透问题

bug 重现:通过 mListView.setOnItemClickListener 设置 item 点击事件,正常情况下没有问题,但当 item 里面嵌套了抢焦点的控件(比如 Button ,CheckBox 等),那么点击 item 的时候,Button 等抢焦点的控件会抢先反应,就会导致点击 item 时没有反应。

解决办法:想要 item 有自己的焦点,Button 等控件有自己的焦点的话,需要在 item 的根控件里面设置 android:descendantFocusability="blocksDescendants",这个属性值表示子有子的焦点,父有父的焦点。

java 代码

1
2
3
4
5
6
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(TAG, "onItemClick: ------");
}
});

item 布局文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal">

<!--标题-->
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:text="标题" />

<!--删除按钮-->
<Button
android:id="@+id/bt_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"/>

</LinearLayout>

属性 android:descendantFocusability 的值有三种:

1
2
3
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点,也就是各有各的焦点

Mac下,Beyond Compare软件破解

一、原理
Beyond Compare 每次启动后会先检查注册信息,试用期到期后就不能继续使用。解决方法是在启动前,先删除注册信息,然后再启动,这样就可以永久免费试用了。

二、下载
首先下载 Beyond Compare 最新版本,链接如下:https://www.scootersoftware.com/download.php

三、安装
下载完成后,直接安装。

四、创建 BCompare 文件

  1. 进入 Mac 应用程序目录下,找到刚刚安装好的 Beyond Compare,路径如下:/Applications/Beyond Compare.app/Contents/MacOS
  2. 修改启动程序文件 BCompare 为 BCompare.real
  3. 在当前目录下新建一个文件 BCompare,文件内容如下:
1
2
3
#!/bin/bash
rm "/Users/$(whoami)/Library/Application Support/Beyond Compare/registry.dat"
"`dirname "$0"`"/BCompare.real $@
  1. 保存 BCompare 文件。
  2. 修改文件的权限:
1
chmod a+x /Applications/Beyond\ Compare.app/Contents/MacOS/BCompare

以上步骤完成后,再次打开 Beyond Compare 就可以正常使用了。

Android透明度百分比转十六进制表

100% — FF
99% — FC
98% — FA
97% — F7
96% — F5
95% — F2
94% — F0
93% — ED
92% — EB
91% — E8

90% — E6
89% — E3
88% — E0
87% — DE
86% — DB
85% — D9
84% — D6
83% — D4
82% — D1
81% — CF

80% — CC
79% — C9
78% — C7
77% — C4
76% — C2
75% — BF
74% — BD
73% — BA
72% — B8
71% — B5

70% — B3
69% — B0
68% — AD
67% — AB
66% — A8
65% — A6
64% — A3
63% — A1
62% — 9E
61% — 9C

60% — 99
59% — 96
58% — 94
57% — 91
56% — 8F
55% — 8C
54% — 8A
53% — 87
52% — 85
51% — 82

50% — 80
49% — 7D
48% — 7A
47% — 78
46% — 75
45% — 73
44% — 70
43% — 6E
42% — 6B
41% — 69

40% — 66
39% — 63
38% — 61
37% — 5E
36% — 5C
35% — 59
34% — 57
33% — 54
32% — 52
31% — 4F

30% — 4D
29% — 4A
28% — 47
27% — 45
26% — 42
25% — 40
24% — 3D
23% — 3B
22% — 38
21% — 36

20% — 33
19% — 30
18% — 2E
17% — 2B
16% — 29
15% — 26
14% — 24
13% — 21
12% — 1F
11% — 1C

10% — 1A
9% — 17
8% — 14
7% — 12
6% — 0F
5% — 0D
4% — 0A
3% — 08
2% — 05
1% — 03
0% — 00

jar包反编译

编译 java 代码 Jar 包

  1. jd-gui (不能反编译 groovy)
  2. jdec (在线反编译)

编译 groovy 代码 Jar 包

  1. jdec (在线反编译)