启动界面部分和AccoutnActivity相关,是一个fragmentactivity
主activity是BrowserActivity,但是在显示它之前会跳到AccountActivity中,进行一系列与登录有关的活动,登录成功后会跳回BrowserActivity中
登录时选择服务器的代码在com.seafile.seadroid2.AccountActivity 230行
根据选择的类型设置intent来启动activity
AccountDetailActivity是与登录有关的activity,主要注意login(View view)方法
登录成功后调用AccountDetailActivity的startFileActivity(Account account)方法,将用户名密码以及服务器存入sharedpreference中,数据持久化
libraries starred activity 三个fragment包含在tab_fragment里面,当时找了好久都没找到这三个fragment是怎么渲染出来的。。。
多用户的信息是保存在sqlite中的,上次登录信息是存在sharedpreference里的,以实现下次自动登录。
在account中加入token的步骤是在seafConnection类中的realLogin()方法内,159行的account.token = obj.getString("token");
make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件。make install是把这些编译出来的可执行文件和库文件复制到合适的地方。
ls|more 如果列表太长,一页显示不了,就可能会丢失部分信息,但是用管道+more来显示就可以了
bash 下的各种软件都不需要处理通配符的问题,减少了不必要的重复开发
在交叉编译之前要指定PKG_CONFIG_PATH,这样编译器才能正确找到lib位置
export PKG_CONFIG_PATH=/home/kylin/crosscompile/mingw32/lib/pkgconfig:/home/kylin/crosscompile/mingw32/i686-w64-mingw32/lib/pkgconfig
(后来去掉了地一个路径,把自己编译安装在第一个路径的库的.pc文件都转移到了第二个路径,不然寻找好像有点问题)
export PKG_CONFIG_PATH极其重要,不然会提示各种错误。。还有export PKG_CONFIG_EXECUTABLE也很重要。
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
checking for event_init in -levent... no
configure: error: *** Unable to find libevent library
是用mxe安装的libevent,但是和以前自己编译的libevent相比,缺少了libevent.dll.a,就提示该错误了。当我把以前编译的libevent.dll.a放入lib中时,就能找到了。
一会找不到Rpc.h 一会又找不到rpc.h,原本include下是rpc.h,然后我又复制了一份改名为Rpc.h就ok了,应该没有问题吧
librpcrt4.a进行了同样的处理,复制了一份了为libRpcrt4.a,好像是因为在win下都是大写,而mingw里是小写,可能识别不了。
cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-cross-mingw32-pc-linux.cmake -DCMAKE_INSTALL_TYPE=Release(开始是自己手写的.cmake文件,后来在官方文档中发现mxe自带了.cmake文件,可以直接用,而且比自己写的好用,没什么错误,果然要多看官方文档)
修改了/usr/share/cmake-2.8/Modules/CMakeRCInformation.cmake,解决了一个小bug(已发布到csdn博客)
修改了seafile-client-2.2.0/src下的ccnet-init.cpp文件,44行return g_mkdir(dir, 0700);改为return g_mkdir(dir);(后来又改回去了,当然不能随便改源码,报错的原因好像是pkgconfig path以及相关的环境变量没设置好,导致找到了错误的库,于是方法的定义当然不一样)
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-ld: cannot find -lgobject-2.0
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-ld: cannot find -lglib-2.0
解决方案:mxe下直接make glib
找不到libevent,好像是因为需要shared library,而mxe默认是make static的lib,所以需要加上make MXE_TARGETS=i686-pc-mingw32.shared libevent ,
mxe会再make一个i686-pc-mingw32.shared目录,于是usr下就有了一个static和一个shared的mingw32.生成的shared libevent在shared目录下的lib里面,是libevent.dll.a。
本次交叉编译的过程中比较难的是qt的交叉编译,非常的麻烦,反正我没搞定,还好找到了mxe这个交叉编译的环境平台,一个make qt就生成了mingw可以用的qt,简直方便。
PKG_CONFIG_EXECUTABLE环境变量也非常重要,不能用系统的pkg-config,要用i686mingw32.static自带的pkgconfig,并且要注释掉CMakeList.txt的130行(会调用系统的pkgconfig),不然会有很多库找不到。
就算用mingw32的pkgconfig也会有好几个库找不到,会提示:
/home/kylin/crosscp1/mxe/usr/lib/libccnet.a(libccnet_la-libccnet_utils.o): In function `ccnet_util_gen_uuid':
/home/kylin/crosscp1/mxe/usr/src/ccnet-2.2.0/lib/libccnet_utils.c:345: undefined reference to `UuidCreate@4'
/home/kylin/crosscp1/mxe/usr/src/ccnet-2.2.0/lib/libccnet_utils.c:346: undefined reference to `UuidToStringA@8'
/home/kylin/crosscp1/mxe/usr/src/ccnet-2.2.0/lib/libccnet_utils.c:348: undefined reference to `RpcStringFreeA@4'
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-ar cr CMakeFiles/seafile-applet.dir/objects.a @CMakeFiles/seafile-applet.dir/objects1.rsp
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-g++ -O3 -DNDEBUG -mwindows -Wl,--whole-archive CMakeFiles/seafile-applet.dir/objects.a -Wl,--no-whole-archive -o seafile-applet.exe -Wl,--out-implib,libseafile-applet.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -L/home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib -L/home/kylin/crosscp1/mxe/usr/lib /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtGui.a -Wl,-Bstatic -lpng -ljpeg -ltiff -llzma -lmng -llcms2 -Wl,-Bdynamic -limm32 -lwinmm /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtNetwork.a /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtCore.a -Wl,-Bstatic -lz -Wl,-Bdynamic -lws2_32 /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtNetwork.a -lssl -lcrypto -lws2_32 -lgdi32 -lcrypt32 -lz -lsqlite3 -ljansson -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -ljansson -lz -lffi -lws2_32 -lole32 -lwinmm -lshlwapi -lpcre -lintl -liconv -lccnet -luuid -lrpcrt4 -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -ljansson -lpthread -levent -lgobject-2.0 -lglib-2.0 -lffi -lws2_32 -lole32 -lwinmm -lshlwapi -lpcre -lintl -liconv -lseafile -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -ljansson -lgobject-2.0 -lglib-2.0 -lffi -lws2_32 -lole32 -lwinmm -lshlwapi -lpcre -lintl -liconv -lpsapi -lws2_32 -lshlwapi -lwinmm /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtNetwork.a /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtCore.a -Wl,-Bstatic -lz -Wl,-Bdynamic -lssl -lcrypto -lgdi32 -lcrypt32 -lz -lsqlite3 -ljansson -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lffi -lole32 -lpcre -lintl -liconv -lccnet -luuid -lrpcrt4 -lpthread -levent -lseafile -lpsapi -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
主activity是BrowserActivity,但是在显示它之前会跳到AccountActivity中,进行一系列与登录有关的活动,登录成功后会跳回BrowserActivity中
登录时选择服务器的代码在com.seafile.seadroid2.AccountActivity 230行
根据选择的类型设置intent来启动activity
AccountDetailActivity是与登录有关的activity,主要注意login(View view)方法
登录成功后调用AccountDetailActivity的startFileActivity(Account account)方法,将用户名密码以及服务器存入sharedpreference中,数据持久化
libraries starred activity 三个fragment包含在tab_fragment里面,当时找了好久都没找到这三个fragment是怎么渲染出来的。。。
多用户的信息是保存在sqlite中的,上次登录信息是存在sharedpreference里的,以实现下次自动登录。
在account中加入token的步骤是在seafConnection类中的realLogin()方法内,159行的account.token = obj.getString("token");
make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件。make install是把这些编译出来的可执行文件和库文件复制到合适的地方。
ls|more 如果列表太长,一页显示不了,就可能会丢失部分信息,但是用管道+more来显示就可以了
bash 下的各种软件都不需要处理通配符的问题,减少了不必要的重复开发
============================================================================================
在交叉编译之前要指定PKG_CONFIG_PATH,这样编译器才能正确找到lib位置
export PKG_CONFIG_PATH=/home/kylin/crosscompile/mingw32/lib/pkgconfig:/home/kylin/crosscompile/mingw32/i686-w64-mingw32/lib/pkgconfig
(后来去掉了地一个路径,把自己编译安装在第一个路径的库的.pc文件都转移到了第二个路径,不然寻找好像有点问题)
export PKG_CONFIG_PATH极其重要,不然会提示各种错误。。还有export PKG_CONFIG_EXECUTABLE也很重要。
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
checking for event_init in -levent... no
configure: error: *** Unable to find libevent library
是用mxe安装的libevent,但是和以前自己编译的libevent相比,缺少了libevent.dll.a,就提示该错误了。当我把以前编译的libevent.dll.a放入lib中时,就能找到了。
一会找不到Rpc.h 一会又找不到rpc.h,原本include下是rpc.h,然后我又复制了一份改名为Rpc.h就ok了,应该没有问题吧
librpcrt4.a进行了同样的处理,复制了一份了为libRpcrt4.a,好像是因为在win下都是大写,而mingw里是小写,可能识别不了。
cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-cross-mingw32-pc-linux.cmake -DCMAKE_INSTALL_TYPE=Release(开始是自己手写的.cmake文件,后来在官方文档中发现mxe自带了.cmake文件,可以直接用,而且比自己写的好用,没什么错误,果然要多看官方文档)
修改了/usr/share/cmake-2.8/Modules/CMakeRCInformation.cmake,解决了一个小bug(已发布到csdn博客)
修改了seafile-client-2.2.0/src下的ccnet-init.cpp文件,44行return g_mkdir(dir, 0700);改为return g_mkdir(dir);(后来又改回去了,当然不能随便改源码,报错的原因好像是pkgconfig path以及相关的环境变量没设置好,导致找到了错误的库,于是方法的定义当然不一样)
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-ld: cannot find -lgobject-2.0
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-ld: cannot find -lglib-2.0
解决方案:mxe下直接make glib
找不到libevent,好像是因为需要shared library,而mxe默认是make static的lib,所以需要加上make MXE_TARGETS=i686-pc-mingw32.shared libevent ,
mxe会再make一个i686-pc-mingw32.shared目录,于是usr下就有了一个static和一个shared的mingw32.生成的shared libevent在shared目录下的lib里面,是libevent.dll.a。
本次交叉编译的过程中比较难的是qt的交叉编译,非常的麻烦,反正我没搞定,还好找到了mxe这个交叉编译的环境平台,一个make qt就生成了mingw可以用的qt,简直方便。
PKG_CONFIG_EXECUTABLE环境变量也非常重要,不能用系统的pkg-config,要用i686mingw32.static自带的pkgconfig,并且要注释掉CMakeList.txt的130行(会调用系统的pkgconfig),不然会有很多库找不到。
就算用mingw32的pkgconfig也会有好几个库找不到,会提示:
/home/kylin/crosscp1/mxe/usr/lib/libccnet.a(libccnet_la-libccnet_utils.o): In function `ccnet_util_gen_uuid':
/home/kylin/crosscp1/mxe/usr/src/ccnet-2.2.0/lib/libccnet_utils.c:345: undefined reference to `UuidCreate@4'
/home/kylin/crosscp1/mxe/usr/src/ccnet-2.2.0/lib/libccnet_utils.c:346: undefined reference to `UuidToStringA@8'
/home/kylin/crosscp1/mxe/usr/src/ccnet-2.2.0/lib/libccnet_utils.c:348: undefined reference to `RpcStringFreeA@4'
这个是和librpcrt4.a以及libuuid有关,有问题还有liblzma和liblcms库,这几个库在lib里都有,而且mingw的pkgconfig也能找到这几个库,.pc文件配置也是正确,但是link的过程中总是提示undefined reference to ...,这个问题困扰了好久,后来发现工程的CMakeFiles/seafile-applet/里有还有个link.txt文件,里面可以修改link的各种参数,里面还真没找到那几个缺少的库链接,但是pc文件配置是对的,还不清楚是什么原因。我直接修改了link.txt文件,加了一些参数,下面是修改过的文件:
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-ar cr CMakeFiles/seafile-applet.dir/objects.a @CMakeFiles/seafile-applet.dir/objects1.rsp
/home/kylin/crosscp1/mxe/usr/bin/i686-pc-mingw32.static-g++ -O3 -DNDEBUG -mwindows -Wl,--whole-archive CMakeFiles/seafile-applet.dir/objects.a -Wl,--no-whole-archive -o seafile-applet.exe -Wl,--out-implib,libseafile-applet.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -L/home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib -L/home/kylin/crosscp1/mxe/usr/lib /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtGui.a -Wl,-Bstatic -lpng -ljpeg -ltiff -llzma -lmng -llcms2 -Wl,-Bdynamic -limm32 -lwinmm /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtNetwork.a /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtCore.a -Wl,-Bstatic -lz -Wl,-Bdynamic -lws2_32 /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtNetwork.a -lssl -lcrypto -lws2_32 -lgdi32 -lcrypt32 -lz -lsqlite3 -ljansson -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -ljansson -lz -lffi -lws2_32 -lole32 -lwinmm -lshlwapi -lpcre -lintl -liconv -lccnet -luuid -lrpcrt4 -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -ljansson -lpthread -levent -lgobject-2.0 -lglib-2.0 -lffi -lws2_32 -lole32 -lwinmm -lshlwapi -lpcre -lintl -liconv -lseafile -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -ljansson -lgobject-2.0 -lglib-2.0 -lffi -lws2_32 -lole32 -lwinmm -lshlwapi -lpcre -lintl -liconv -lpsapi -lws2_32 -lshlwapi -lwinmm /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtNetwork.a /home/kylin/crosscp1/mxe/usr/i686-pc-mingw32.static/qt/lib/libQtCore.a -Wl,-Bstatic -lz -Wl,-Bdynamic -lssl -lcrypto -lgdi32 -lcrypt32 -lz -lsqlite3 -ljansson -lsearpc -lgio-2.0 -ldnsapi -liphlpapi -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lffi -lole32 -lpcre -lintl -liconv -lccnet -luuid -lrpcrt4 -lpthread -levent -lseafile -lpsapi -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
(红色标记的是我添加的参数)
这次编译的难度主要来自于qt和cmake的相关问题,cmake的各种设置以及参数是非常复杂的。它貌似只是生成平台相关的makefile,但是为什么其他的文件(如cmakefile目录下的一些配置文件)在编译中还会有影响,而且link的过程在makefile里根本没找到,cmake和make之间到底是什么关系还需要进一步学习。
附编译其他依赖库的shell脚本
#!/bin/bash -ue
# Dependencies (list might be incomplete):
# src/libevent-2.0.21-stable.tar.gz
# src/libsearpc (I used git f022c6509cff2eb604024c003eb60bcda975c0b1)
# src/ccnet (with Nicolas' patches, I used 3495a78466add16cfa9eddfb35a312bb9ce55264)
# src/seafile (with Nicolas' patches, I used 59eb918655dfa5f1328ec72be00681c6192f523d)
#
# Toolchain:
# vala (vala-0.18.1-1.fc18.x86_64)
# mingw32-gcc (mingw32-gcc-4.7.2-7.fc18.x86_64)
# mingw32-pkg-config (mingw32-pkg-config-0.27-1.fc18.x86_64)
# mingw32-glib2 (mingw32-glib2-2.34.3-2.fc18.noarch)
# mingw32-pthreads (mingw32-pthreads-2.8.0-22.20110511cvs.fc18.noarch)
# mingw32-sqlite (mingw32-sqlite-3.7.13-1.fc18.noarch)
# mingw32-openssl (mingw32-openssl-1.0.1e-1.fc18.noarch)
HOST=i686-pc-mingw32
BUILD=x86_64-redhat-linux-gnu
TARGET=i686-pc-mingw32
PREFIX=`pwd`
export PATH=$PREFIX/bin:$PATH
export CC=i686-pc-mingw32.static-gcc
export CXX=i686-pc-mingw32.static-g++
#export PKG_CONFIG=i686-pc-mingw32.static-pkg-config
# Not sure adding /usr/... is required. It shouldn't be.
# Same for CPPFLAGS and LDFLAGS. But none of this should do any harm.
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PREFIX/i686-pc-mingw32.static/lib/pkgconfig
export CPPFLAGS="-I$PREFIX/include -I$PREFIX/i686-pc-mingw32.static/include"
export LDFLAGS="-L$PREFIX/lib -L$PREFIX/i686-pc-mingw32.static/lib"
#-------------------------------------------------------------------------------
echo "Checking for jansson..."
if ! test -f $PREFIX/include/jansson.h; then
echo "Building jansson"
pushd src/jansson-2.3.1
./configure --prefix=$PREFIX --host=$HOST
make
make install
popd
fi
#------------------------------------------------------------------------------
echo "Checking for libsearpc..."
if ! test -f $PREFIX/bin/searpc-codegen.py; then
echo "Building libsearpc"
pushd src/libsearpc
bash autogen.sh
./configure --host=$HOST --prefix=$PREFIX
make
make install
popd
fi
#------------------------------------------------------------------------------
echo "Checking for ccnet..."
if ! test -d $PREFIX/include/ccnet; then
echo "Building ccnet"
pushd src/ccnet-2.2.0
bash autogen.sh
./configure --host=$HOST --prefix=$PREFIX
make
make install
popd
fi
#------------------------------------------------------------------------------
echo "Checking for seafile..."
if ! test -f $PREFIX/bin/seafile-applet.en.exe; then
echo "Building seafile"
pushd src/seafile-2.2.0
bash autogen.sh
./configure --host=$HOST --prefix=$PREFIX --disable-python
export CC=$TARGET-gcc
export RC=$TARGET-windres
make
make install
popd
fi